更新全部或仅更新oldvalue<> newvalue?

时间:2018-01-12 08:46:13

标签: sql sql-server tsql sql-update

我正在使用SQL Server 2014。

哪个会跑得更快,为什么,有没有办法使用分析仪找出:

update tablename set flname=replace(flname,'(','')

update tablename set flname=replace(flname,'(','') where flname<>replace(flname,'(','')

flname字段没有索引。我可以创造一个。我希望哪里可以过滤掉大约90%的行。

2 个答案:

答案 0 :(得分:0)

在我的测试中没关系。

您可以按如下方式进行测试:

SELECT TOP 10000 flname INTO #TEST FROM tablename 

SET STATISTICS IO,  TIME ON
UPDATE #TEST SET flname = REPLACE (flname ,'(','')

UPDATE #TEST SET flname = REPLACE (flname ,'(','') WHERE 
flname <> REPLACE (flname ,'(','')

答案 1 :(得分:0)

这是一个简单的复制品,表明REPLACE (flname ,'(','')表达式WHERE flname <> REPLACE (flname ,'(','')将在<{1}}的情况下评估两次,以及它的CPU密集型工作:

select col
into dbo.update_str
from
(
select top 1000 replicate ('a((', 2666) as col
from dbo.nums
union all
select top 1000 replicate ('a', 8000)
from sys.all_columns
)t


set statistics io,  time on
update dbo.update_str set col = replace (col ,'(','')

   --CPU time = 12278 ms,  elapsed time = 12299 ms.


drop table dbo.update_str

select col
into dbo.update_str
from
(
select top 1000 replicate ('a((', 2666) as col
from dbo.nums
union all
select top 1000 replicate ('a', 8000)
from sys.all_columns
)t


update dbo.update_str set col = replace (col ,'(','') where 
col <> replace (col ,'(','')

   --CPU time = 23946 ms,  elapsed time = 24007 ms.

在我的测试中,我填写表dbo.update_str 2次,如果只有在第二次更新无关时才填写。

在第二种情况下的双重工作可以在执行计划中找到:虽然两个计划在扫描后都有COMPUTE SCALAR(计算UPDATE的值),但第二个表达式与predicate表扫描。

所以在我的测试用例中,有一半的数据有&#39;(&#39;在其中,时间差是2000行的2倍(当然我的行足够长以显示最坏的情况) ,第二次更新速度慢2倍,因为行中有许多要替换的字符。