#sql
#sql
Вопрос:
У меня есть таблица, похожая на ту, которую вы можете увидеть ниже
Table Keywords
Column ID
Column Keyword
Column Keyword2
первый запрос
select keyword from keywords with (nolock) where keyword = keyword
другой запрос для той же таблицы
select keyword2 from with (nolock) keywords where keyword2 Like 'keyword%'
- Мой вопрос заключается в том, какой тип индекса установить для каких столбцов в этой таблице
чтобы сделать процесс выбора более достаточным? Должен ли это быть кластеризованный индекс или некластеризованный? и в каких столбцах мне нужно его установить?
Эта таблица содержит около 600 тыс. строк, и она постоянно растет.
- Другой вопрос: Я получаю ошибку «мертвая блокировка» при попытке вставить новую запись в таблицу ключевых слов. В чем может быть проблема? Я выбираю записи с помощью nolock.
Спасибо
Комментарии:
1. Ответ может зависеть от базы данных. Это SQL Server?
With (nolock)
заставляет меня думать, что это
Ответ №1:
Поскольку ваши два запроса находятся в совершенно разных столбцах, вам понадобятся два отдельных некластеризованных индекса:
- один индекс на
keyword
для ускорения первого запроса - второй индекс на
keyword2
для ускорения второго запроса
И предполагая, что вы используете SQL Server: я бы сказал, что ни один из них на самом деле не создает хорошего кластеризованного индекса, но хороший кластеризованный индекс был бы действительно полезен!
Хороший кластеризованный индекс должен быть:
- уникальный
- небольшой
- стабильный (никогда не меняется)
- постоянно растущий
Лучше всего сделать ставку на INT IDENTITY
поле. Смотрите выдающийся пост Кимберли Трипп в блоге Постоянно растущий ключ к кластеризации — обсуждение кластеризованного индекса………. еще раз! для получения более подробной информации о требованиях к хорошему ключу кластеризации.
Ответ №2:
Если мы действительно видим единственные варианты использования, вам нужен кластеризованный ключ keyword2
, а затем надеемся, что ваша СУБД достаточно умна, чтобы оптимизировать использование индекса с помощью LIKE
operator. Кластеризация помогает, когда возвращаемые строки из обычного запроса находятся рядом в БД, поэтому сохранение таблицы в алфавитном порядке в keyword2
будет означать, что при выборе потребуется сканировать меньше страниц. Кластеризация таблицы, доступ к которой в значительной степени случайный (например, имена пользователей), не даст вам ничего, кроме стандартного индекса.