为什么对于相同类型的查询,查询成本如此不同?

时间:2018-07-10 13:18:26

标签: sql sql-server optimization query-optimization cost-based-optimizer

这是我在SQL Server 2008中的SQL查询。

三个相同的查询,使用不同的方法

a.name='cf82c96b77b8aa5277da6d55c4e4e66e'

以下是查询费用:

enter image description here

(1)使用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 和两个Case条件进行的第一次查询仅占查询成本的4%

When

(2)没有select top 500* from SignatureDetail where (Case when @UploadDetailID='' then 1 When ','+@UploadDetailID+',' like '%,'+ltrim(UploadDetailID)+',%' then 1 else 0 End)=1 条件的第二次查询占用了查询总费用的48%

Case

(3)使用select top 500* from SignatureDetail where ','+@UploadDetailID+',' like '%,'+ltrim(UploadDetailID)+',%' 和一个Case条件进行的第三次查询也占用了查询总费用的48%

When

第二和第三次查询为什么要占总查询费用这么多?

1 个答案:

答案 0 :(得分:0)

您通过以下几种方式混淆了查询分析器:

  1. 您正在选择“所有行”或一组ID。

  2. 您正在查找字符串匹配项,而不是直接获取ID。

我建议您有两个查询:

  1. 查询1-如果没有ID,则只需从表中选择。

  2. 查询2-如果您具有ID列表,请从中创建一个临时表,以便可以与另一个表进行JOIN进行完全匹配。与字符串匹配,您将获得更好的性能。较新版本的SQL Server甚至可以使用STRING_SPLIT

  3. 为您自动完成此操作

参考: https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql?view=sql-server-2017