【发布时间】:2018-12-18 08:46:12
【问题描述】:
这是我在 SQL Server 2008 中的 SQL 查询。
三个相同的查询,使用不同的方法
Declare @UploadDetailID nvarchar(500) = '62703,62709,67161,67167,74580,76728,76774,76777,89001,116048,602337,52674,626855,626863,626877,626862,626874,626861,626873,626857,626860,626872,636929,636938, 636925,636937,636924,636920,636922,636934,636923,644566,644574,644565,644577,644564,644563,644561,646566,646578,646567,646575,646565,646562,646564,653093,653096,653103';
Begin
select top 500 *
from SignatureDetail
where (Case When @UploadDetailID = '' then 1
When ','+@UploadDetailID+',' like '%,' + ltrim(UploadDetailID) + ',%' then 1
Else 0
End) = 1
select top 500 *
from SignatureDetail
where ',' + @UploadDetailID + ',' like '%,' + ltrim(UploadDetailID) + ',%'
select top 500 *
from SignatureDetail
where (Case when ',' + @UploadDetailID + ',' like '%,' + ltrim(UploadDetailID) + ',%' then 1 else 0 End) = 1
End
这里是查询费用:
(1) 第一个带有Case 和两个When 条件的查询只占查询成本的4%
select top 500* from SignatureDetail where
(Case when @UploadDetailID='' then 1
When ','+@UploadDetailID+',' like '%,'+ltrim(UploadDetailID)+',%' then 1
else 0 End)=1
(2) 没有Case 条件的第二个查询占总查询成本的48%
select top 500* from SignatureDetail where ','+@UploadDetailID+',' like '%,'+ltrim(UploadDetailID)+',%'
(3) 带有Case 和一个When 条件的第三个查询也占总查询成本的48%
select top 500* from SignatureDetail where (Case when ','+@UploadDetailID+',' like '%,'+ltrim(UploadDetailID)+',%' then 1 Else 0 End)=1
为什么第二个和第三个查询占了总查询成本的这么多?
【问题讨论】:
-
可能是从索引中提取的估计行...你能把计划粘贴到这里吗:brentozar.com/pastetheplan
-
我在您的图片中看到所有查询计划基本上都是相同的。
-
中间查询似乎选择的行数较少,但它是顶部查询占用的资源最少。
标签: sql sql-server optimization query-optimization cost-based-optimizer