Индексы в табличных переменных

by Alexey Knyazev 9. апреля 2014 18:22

Сегодня я немного расскажу о том, как создать индексы на табличных переменных (это которые @table) в SQL Server 2014 и в ранних версиях. При этом я не буду останавливаться на том, зачем нужны индексы и не буду сравнивать табличные переменные с временными таблицами, т.к. на эту тему достаточно статей, например: http://www.sql-server-performance.com/2007/temp-tables-vs-variables/ или http://www.mssqltips.com/sqlservertip/2825/sql-server-temp-table-vs-table-variable-performance-testing/. При этом сразу оговорюсь, что одним из недостатков табличных переменных было именно отсутствие возможности явно создать индекс. Но давайте по порядку.

В SQL Server 2012 и ниже мы действительно не можем явно создать индекс на нужном нам поле (полях), но существует несколько приёмов с созданием индексов через ограничения (PRIMARY KEY и UNIQUE). Пример ниже:

declare @table table ( id int primary key
                     , a  varchar(10)
                     , b  datetime
                     , c  money
                     , unique (a,c)
                     );

select * from @table where id > 0;

select a, c from @table where a is not null;

И всё бы хорошо, но как создать неуникальный индекс? И вот теперь, начиная с SQL Server 2014 это стало возможно и в синтаксис добавили создание индекса на табличных переменных.

declare @table table ( id int primary key 
                     , a  varchar(10)
                     , b  datetime  
                     , c  money
                     , unique (a,c)
                     , index ix_b nonclustered (b, a, c)
                     );

select a, c from @table where b > '20140101';

Tags: ,

SQL Server

Комментарии (3) -

Alexey Knyazev
Alexey Knyazev Russia
09.07.2014 19:30:14 #

www.brentozar.com/.../

Reply

Мирон
Мирон United States
01.03.2015 8:45:54 #

Большое спасибо.

Reply

alex
alex Russia
17.05.2015 3:57:34 #

А как  (без опции recompile ) сделать, стобы производительность при работе с табличной переменной не падала, чтобы оптимизатор корректно считал статистику?

Reply

Добавить комментарий

  Country flag

biuquote
  • Комментарий
  • Предпросмотр
Loading