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].