我正在使用SQL Server 2014。
哪个会跑得更快,为什么,有没有办法使用分析仪找出:
update tablename set flname=replace(flname,'(','')
update tablename set flname=replace(flname,'(','') where flname<>replace(flname,'(','')
flname
字段没有索引。我可以创造一个。我希望哪里可以过滤掉大约90%的行。
答案 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倍,因为行中有许多要替换的字符。