Почему стоимость запроса так различна для одного и того же типа запроса?

Вот мой SQL-запрос в SQL Server 2008.

Три одинаковых запроса с разными подходами

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

Почему второй и третий запросы занимают так много всей суммы запроса?

1 ответ

Вы путаете анализатор запросов несколькими способами:

  1. Вы выбираете ВСЕ строки или набор идентификаторов.

  2. Вы выполняете поиск соответствия строк, а не получаете идентификаторы напрямую.

Я рекомендую вам два запроса:

  1. Запрос 1 - если нет идентификаторов, просто выберите из таблицы.

  2. Запрос 2 - Если у вас есть список идентификаторов, сделайте из них временную таблицу, чтобы вы могли присоединиться к другой таблице для точного соответствия. Вы получите лучшую производительность, чем ваша строка соответствия. Более новые версии SQL Server могут даже сделать это автоматически для вас, используя STRING_SPLIT

Ссылка: https://docs.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql?view=sql-server-2017

Другие вопросы по тегам