ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку

Создание индекса на переменной таблицы в SQL Server 2000

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы создать индекс в табличной переменной, используется DECLARE в SQL Server 2014 и более новых версиях. Пример кода приведен ниже:

SQL
Скопировать код
DECLARE @TempTable TABLE (
    ID INT,
    Data VARCHAR(100),
    INDEX IDX_Data NONCLUSTERED (Data)
);

В данном случае для табличной переменной @TempTable был создан некластерный индекс IDX_Data на основе колонки Data. Подобное действие улучшит производительность запросов, производящих фильтрацию или сортировку данных по этому полю.

Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Индексация в SQL Server 2000 до 2012: уникальные и первичные ключи

В версиях SQL Server 2000-2012 нельзя создавать неуникальные индексы напрямую, но возможно применение первичных ключей или уникальных ограничений, которые автоматически формируют индексы:

SQL
Скопировать код
DECLARE @TempTable TABLE (
    ID INT PRIMARY KEY, -- Создает кластерный индекс
    Data VARCHAR(100) UNIQUE -- Создает некластерный индекс
);

PRIMARY KEY создает кластерный индекс, в то время как UNIQUE — некластерный индекс. Чтобы добавить некластерный индекс без ограничений уникальности, используйте столбец с IDENTITY, который выступит в роли "уникального элемента".

Как создать некластерный индекс без уникальности? Выход есть

В более ранних версиях SQL Server для создания некластерного индекса без уникальности вы можете применить трюк с добавлением столбца IDENTITY, который будет использован как артефактный первичный ключ:

SQL
Скопировать код
DECLARE @TempTable TABLE (
    ID INT IDENTITY(1,1),
    Data VARCHAR(100),
    UNIQUE CLUSTERED(ID, Data) -- Кластерный индекс, обеспечивающий уникальность
);

При создании некластерных индексов в SQL Server автоматически добавляется указатель строк, гарантирующий их уникальность.

Временные таблицы в игре

Табличные переменные не всегда оптимальный выбор из-за отсутствия статистики, что может негативно сказаться на оптимизации запросов. Более предпочтительно применять временные таблицы (#temp), которые поддерживают полнофункциональное создание индексов и предлагают все преимущества статистики.

SQL
Скопировать код
CREATE TABLE #Temp (
    ID INT PRIMARY KEY,
    Data VARCHAR(100)
);

CREATE NONCLUSTERED INDEX IDX_Data ON #Temp (Data); -- Дополнительное индексирование с учетом статистики

Уникальные ограничения и вопрос о NULL

Работа с уникальными ограничениями может столкнуться с проблемами из-за специфики обработки SQL Server значений NULL. В этой системе каждое значение NULL считается уникальным, что противоречит стандарту SQL.

SQL Server 2014+: встроенное создание неуникальных индексов

С выпуском SQL Server 2014 появилась возможность встроенного добавления неуникальных индексов. Однако профессионалы часто предпочитают временные таблицы для комплексной работы с данными.

Визуализация

Для наглядного представления процесса можно воспользоваться следующей аналогией:

Markdown
Скопировать код
Представьте себе библиотеку (📚) полную книг (📖), но без каталога...

Поиск книги о 'SQL' 🧐:
- Без индекса: [🔍📖🕒📖🕓📖🕔]
- С индексом: [🔍🗂️📖⚡]

Создание индекса для табличной переменной аналогично составлению каталога в библиотеке. Это существенно ускоряет поиск данных (книг)!

Продвинутые советы для опытных разработчиков

Динамический SQL для обхода проблем с именами индексов

Сложности с именами индексов в tempdb можно обойти с помощью использования динамического SQL:

SQL
Скопировать код
EXEC sp_executesql N'CREATE INDEX IDX_Dynamic ON #TempDynamic (DataColumn)'; -- Создание индекса с помощью динамического запроса

Фильтрованные индексы

В SQL Server 2016 и более новых версиях можно создать фильтрованные индексы, которые охватывают определенный набор данных:

SQL
Скопировать код
CREATE INDEX IDX_FilteredData ON #Temp (Data) WHERE Data IS NOT NULL; -- Фильтрованный индекс направлен на повышение производительности

Такой подход может существенно улучшить производительность в подходящих для этого контекстах.

Когда следует рассмотреть использование табличных переменных?

Табличные переменные стоит выбирать, если:

  • Объем данных невелик и не требуется сложная индексация.
  • Существует потребность в быстром, временном хранении данных без нагрузки на tempdb.
  • Видимость ограничивается одним запросом или процедурой, что избавляет от проблем управления жизненным циклом временных таблиц.

Правильная индексация, будь то в табличных переменных или временных таблицах, может кардинально улучшить производительность вашего приложения.

Полезные материалы