Ms sql create index: CREATE INDEX (Transact-SQL) — SQL Server

Что делает функция INCLUDE() при создании индекса в MS SQL Server?

спросил

Изменено
3 года, 3 месяца назад

Просмотрено
2к раз

В чем разница между созданием индекса с использованием функции INCLUDE и без нее?

В чем разница между двумя следующими индексами?

 СОЗДАТЬ НЕКЛАСТЕРНЫЙ ИНДЕКС SomeName ON SomeTable (
    Столбец А
    ,КолонкаB
    ,КолонкаC
    ,КолонкаD
    ) ВКЛЮЧАТЬ (
    Столбец E
    ,КолонкаF
    ,КолонкаG
    )
 

против

 СОЗДАТЬ ИНДЕКС SomeName ON SomeTable (
    Столбец А
    ,КолонкаB
    ,КолонкаC
    ,КолонкаD
    ,КолонкаE
    ,КолонкаF
    ,КолонкаG
    )
 
  • sql
  • sql-сервер
  • индексирование
  • кластеризованный индекс

Предложение INCLUDE добавляет данные на самый нижний/конечный уровень, а не в дерево индекса. Это делает индекс меньше, поскольку он не является частью дерева.

ВКЛЮЧИТЬ столбцов не являются ключевыми столбцами в индексе, поэтому они не упорядочены. Это означает, что он не очень полезен для предикатов, сортировки и т. д. Однако он может быть полезен, если у вас есть остаточный поиск в нескольких строках из ключевых столбцов.

ВКЛЮЧИТЬ столбцов не являются ключевыми столбцами в индексе, поэтому они не упорядочены. Это делает их обычно бесполезными для JOIN или сортировки. И поскольку они не являются ключевыми столбцами, они не входят во всю структуру B-дерева, как ключевые столбцы 9.0005

Добавляя столбцы Include (или неключевые), можно создавать некластеризованные индексы, охватывающие больше запросов. Это связано с тем, что неключевые столбцы имеют следующие преимущества:

  • Они могут быть типами данных, которые нельзя использовать в качестве ключевых столбцов индекса.
  • Компонент Database Engine не учитывает их при расчете количества столбцов ключа индекса или размера ключа индекса.

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

Дополнительные сведения см. в документах Microsoft: Создание индексов с включенными столбцами

Когда план выполнения использует индекс, он имеет доступ ко всем столбцам в индексе. Если все столбцы из данной таблицы находятся в индексе, нет необходимости обращаться к исходным страницам данных. Устранение этого поиска страниц данных повышает эффективность.

Однако включение столбцов в индексы создает дополнительную нагрузку на саму структуру индексирования (помимо дублирования значений).

Ключевое слово INCLUDE позволяет использовать значения столбцов в индексе без накладных расходов на дополнительную структуру индексации. Цель состоит в том, чтобы разрешать запросы без необходимости поиска информации столбца на исходных страницах данных.

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Ошибка при создании индекса таблицы в sql server, как исправить?

спросил

Изменено
3 года, 11 месяцев назад

Просмотрено
3к раз

При создании кластеризованного индекса для таблицы в SQL SERVER 2008 (LIVE DB) возникла вышеуказанная ошибка. Всего записей в таблице 1046789 .

Я создал такой же индекс в тестовой базе данных с таким же количеством записей, и он успешно создан.

Спасибо.

  • sql-server
  • sql-server-2008

Я думаю, ваш вопрос: «Что я могу сделать, чтобы исправить это?»

Делая это предположение:

Выполните следующие задачи, чтобы
облегчить проблему:

Найдите транзакцию, которая удерживается
блокировка требуемого ресурса, если
возможный. Используйте sys.dm_os_waiting_tasks
и динамический sys.dm_tran_locks
взгляды руководства.

Если транзакция еще удерживается
замок, прекратить эту транзакцию
в случае необходимости.

Повторите запрос.

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

А если не получится:

В этом сценарии следующие изменения
должно быть сделано в нарушение
транзакция: 1) Изменить транзакцию
использовать подсказки запроса (использовать
RECOMPILE,MAXDOPhints) 2) Бегать по-крупному
Сделка в более мелких транзакциях.
3) Обновите оборудование, если это возможно.

Отсюда и отсюда

Используйте следующие команды, чтобы узнать, какие именно процессы удерживают эксклюзивные блокировки вашей таблицы. К вашему сведению, создание индекса любого типа должно налагать эксклюзивные блокировки на таблицу из-за сложности задачи. В кластерных индексах данные физически переупорядочиваются на диске. Доступ к таблице будет недоступен, если вы не укажете опцию ONLINE = OFF при создании индекса.

Перед запуском ЗАМЕНИТЕ DATABASE_NAME, DB_ID, OBJ_ID и SPID реальными целочисленными значениями.

CREATE TABLE tempdb..#temp_lock
(spid int, dbid int, ObjId int, IndId
int, тип nvarchar(30), ресурс
nvarchar(100), режим nvarchar(10),
Статус nvarchar(30))

Использовать DATABASE_NAME

ГО

вставить в tempdb..#temp_lock exec master..sp_lock

выберите SPID, ObjId, режим, имя из
tempdb..#temp_lock как внутреннее соединение
[test2].