【问题标题】:Why Query Cost is So different for same type of Query?为什么相同类型的查询的查询成本如此不同?
【发布时间】: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


【解决方案1】:

您在以下几个方面混淆了查询分析器:

  1. 您要么选择所有行,要么选择一组 ID。

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

我建议你有两个查询:

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

  2. 查询 2 - 如果您有一个 ID 列表,请用它们创建一个临时表,这样您就可以与另一个表进行 JOIN 以实现精确匹配。您将获得比字符串匹配更好的性能。较新版本的 SQL Server 甚至可以使用 STRING_SPLIT 自动为您完成此操作

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

【讨论】:

    猜你喜欢
    • 2013-04-01
    • 1970-01-01
    • 2012-07-10
    • 2018-06-17
    • 2012-02-18
    • 2016-12-09
    • 2021-11-14
    • 1970-01-01
    • 2016-10-12
    相关资源
    最近更新 更多