聚簇索引更新,如何仅在不同列值处更改索引?
Clustered index update, how changing the index only at different column value?
我table,
例如
Id int primary key(clustered index)
Name varchar(255)not null (non-clustered index)
..
..
Other columns
我执行存储过程为
update table1 set table1.Name=isnull(@Name,table1.Name) ,( updating other columns) where Id=@Id;
多次Name等于@Name;
在执行计划中我看到
如果我将存储过程更改为
update table1 set ( updating other columns) where Id=@Id;
我看到了 Cost:15%
问题:
我需要在
的两种情况下更改此 produder
- table1.Name= @Name
- table1.Name <> 姓名。
在第一种情况下 table1.Name 不更改值或索引不更新且聚簇索引更新成本为 15%;
在第二种情况下 table1.Name 更改值和聚集索引更新成本为 50%。
为什么更新等值时索引也在更新?
我无法 select "Name" 并在更新前进行比较
我知道创建 varchar 列索引不是个好主意
更新
更新查询和更改名称列(执行CPU时间200ms)
更新查询没有更改名称列(执行CPU时间70ms)
更新
问题已关闭
为了解决我的问题,我创建了一个触发器
CREATE TRIGGER [dbo].[trg_BeforeUpdateSubject]
ON [dbo].[Subject]
INSTEAD OF UPDATE
AS
BEGIN
SET NOCOUNT ON;
declare @old_val nvarchar(255),@new_val nvarchar(255) ;
select
@old_val=[Name]
from deleted;
select
@new_val=[Name]
from inserted;
if (@old_val=@new_val)
BEGIN
UPDATE
Subject
SET
set new values for other colums,
Subject.DLC = GETDATE()
FROM
inserted
WHERE
Subject.Id = inserted.Id
END ELSE
BEGIN
UPDATE
Subject
SET
Subject.Name = inserted.Name,
set new values for other colums,
Subject.DLC = GETDATE()
FROM
inserted
WHERE
Subject.Id = inserted.Id
END
END
工作完美。更新查询的平均值为 90ms(CPU),旧值为 200ms
我table, 例如
Id int primary key(clustered index)
Name varchar(255)not null (non-clustered index)
..
..
Other columns
我执行存储过程为
update table1 set table1.Name=isnull(@Name,table1.Name) ,( updating other columns) where Id=@Id;
多次Name等于@Name;
在执行计划中我看到
如果我将存储过程更改为
update table1 set ( updating other columns) where Id=@Id;
我看到了 Cost:15%
问题:
我需要在
的两种情况下更改此 produder- table1.Name= @Name
- table1.Name <> 姓名。
在第一种情况下 table1.Name 不更改值或索引不更新且聚簇索引更新成本为 15%;
在第二种情况下 table1.Name 更改值和聚集索引更新成本为 50%。
为什么更新等值时索引也在更新?
我无法 select "Name" 并在更新前进行比较
我知道创建 varchar 列索引不是个好主意
更新
更新查询和更改名称列(执行CPU时间200ms)
更新查询没有更改名称列(执行CPU时间70ms)
更新
问题已关闭
为了解决我的问题,我创建了一个触发器
CREATE TRIGGER [dbo].[trg_BeforeUpdateSubject]
ON [dbo].[Subject]
INSTEAD OF UPDATE
AS
BEGIN
SET NOCOUNT ON;
declare @old_val nvarchar(255),@new_val nvarchar(255) ;
select
@old_val=[Name]
from deleted;
select
@new_val=[Name]
from inserted;
if (@old_val=@new_val)
BEGIN
UPDATE
Subject
SET
set new values for other colums,
Subject.DLC = GETDATE()
FROM
inserted
WHERE
Subject.Id = inserted.Id
END ELSE
BEGIN
UPDATE
Subject
SET
Subject.Name = inserted.Name,
set new values for other colums,
Subject.DLC = GETDATE()
FROM
inserted
WHERE
Subject.Id = inserted.Id
END
END
工作完美。更新查询的平均值为 90ms(CPU),旧值为 200ms