聚簇索引更新,如何仅在不同列值处更改索引?

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
  1. table1.Name= @Name
  2. 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