首页 > 解决方案 > 为什么相同类型的查询的查询成本如此不同?

问题描述

这是我在 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

为什么第二个和第三个查询占用了总查询成本这么多?

标签: sqlsql-serveroptimizationquery-optimizationcost-based-optimizer

解决方案


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

  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


推荐阅读