Какой правильный индекс для повышения эффективности запросов SELECT?

#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%'
  
  1. Мой вопрос заключается в том, какой тип индекса установить для каких столбцов в этой таблице
    чтобы сделать процесс выбора более достаточным? Должен ли это быть кластеризованный индекс или некластеризованный? и в каких столбцах мне нужно его установить?

Эта таблица содержит около 600 тыс. строк, и она постоянно растет.

  1. Другой вопрос: Я получаю ошибку «мертвая блокировка» при попытке вставить новую запись в таблицу ключевых слов. В чем может быть проблема? Я выбираю записи с помощью nolock.

Спасибо

Комментарии:

1. Ответ может зависеть от базы данных. Это SQL Server? With (nolock) заставляет меня думать, что это

Ответ №1:

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

  • один индекс на keyword для ускорения первого запроса
  • второй индекс на keyword2 для ускорения второго запроса

И предполагая, что вы используете SQL Server: я бы сказал, что ни один из них на самом деле не создает хорошего кластеризованного индекса, но хороший кластеризованный индекс был бы действительно полезен!

Хороший кластеризованный индекс должен быть:

  • уникальный
  • небольшой
  • стабильный (никогда не меняется)
  • постоянно растущий

Лучше всего сделать ставку на INT IDENTITY поле. Смотрите выдающийся пост Кимберли Трипп в блоге Постоянно растущий ключ к кластеризации — обсуждение кластеризованного индекса………. еще раз! для получения более подробной информации о требованиях к хорошему ключу кластеризации.

Ответ №2:

Если мы действительно видим единственные варианты использования, вам нужен кластеризованный ключ keyword2 , а затем надеемся, что ваша СУБД достаточно умна, чтобы оптимизировать использование индекса с помощью LIKE operator. Кластеризация помогает, когда возвращаемые строки из обычного запроса находятся рядом в БД, поэтому сохранение таблицы в алфавитном порядке в keyword2 будет означать, что при выборе потребуется сканировать меньше страниц. Кластеризация таблицы, доступ к которой в значительной степени случайный (например, имена пользователей), не даст вам ничего, кроме стандартного индекса.