В совсем раннем превью MS SQL в январе мне вежливо отказали. И вот, наконец вышел публичный evaluation релиз! Давайте посмотрим, как MS SQL отнесется к самому неприятному - values with irregular selectivity. У меня про это даже была статья.

Загрузка MS SQL 2022 доступна по этой ссылке.

Однако вам придется преодолеть сложность "no such country":

Там еще есть запрос телефона, который должен соответсвовать стране (кода +7 нет, разумеется), и есть проверка на geoIP, так что любую страну указать не получится.

Но я уверен, вы выкрутитесь из этой ситуации и увидите вожделенное:

Microsoft SQL Server 2022 (CTP2.0) - 16.0.600.9 (X64) May 20 2022 13:29:42 Copyright (C) 2022 Microsoft Corporation Enterprise Evaluation Edition (64-bit) on Windows 10 Enterprise 10.0 (Build 19044: ) (Hypervisor)

Пойдем по предыдущей статье. Создадим базу, а в ней - тестовый пример:

create table Unlucky (
  n int identity primary key, 
  VAL varchar(32), 
  somethingElse varchar(128))
GO
set nocount on
declare @n int=1000000
while @n>0 begin 
  set @n=@n-1 
  insert into Unlucky select convert(varchar,@n/10)+'val',
    convert(varchar,@n)+convert(varchar,@n)
    +convert(varchar,@n)+convert(varchar,@n)
  end
GO
update Unlucky set VAL='n/a' where n%2=1
GO
create index VAL on Unlucky (val)
GO
create procedure GetVal @val varchar(32) as 
  select * from Unlucky where val=@val
GO

В табличке миллион записей, но половина имеет val='n/a', для остальных записей у нас 5 записей на значение:

Теперь момент истины: как отнесется SQL к таким вызовам:

exec GetVal 'n/a'
exec GetVal '99995val'

А вот это интересно! Вначале я подумал, что под 'MULTIPLE PLAN' скрывается невозможность старой Management Studio показать разные варианты - она это еще не умеет. Но SET SHOPWPLAN тоже не смог показать ничего дельного, хотя там ответ в текстовом виде приходит от MS SQL.

Чтобы увидеть execution plan, надо смотреть actual execution plan after execution:

Обратите внимание на QueryVariantID. И во втором случае:

Та-дааам! Ну что я могу сказать, как же долго я это ждал! Это не маркетинговый BS или бесполезные фичи, это маленький шаг для базы, но огромный шаг для всего человечества. Кто еще такое умеет? Никто.

Ради интереса залезем в activity monitor:

Execution plan (по right click) там обычный.

Возможность увидеть все Query Variants я не нашел (пока не реализовано?) но это было бы очень интересно и полезно.

Комментарии (5)


  1. erogov
    01.06.2022 01:32
    +3

    Кто еще такое умеет?

    Учитывать фактическое значение параметра? Вообще-то все умеют, и давно. И Постгрес, и Оракл.


    1. Tzimie Автор
      01.06.2022 09:03

      Проверить и подобрать план в зависимости от переменной - такое SQL мог ещё с 90х годов. А вот кешировать ДВА плана одновременно - нет


      1. erogov
        01.06.2022 10:06
        +3

        Почитайте про Adaptive Cursor Sharing. Это появилось в Oracle 11g, то есть 15 лет уже как.


  1. Olegun
    01.06.2022 06:51

    Возможно автор найдёт в себе силы и представит в статье результаты для вызова GetVal с использованием переменной (см. предыдущую публикацию автора от 20 января 2022 в начале текущей статьи).


    1. Tzimie Автор
      01.06.2022 10:08

      Пока там какая то бага) он вообще не выдает результат в этом случае