2015-08-31 3 views
1

У меня возникли проблемы с удалением некоторых плохих вызовов SQL в моих рабочих приложениях. Я читал индексы, настраивал и оценивал вещи. Вот некоторые из правил, которые я собрал (дайте мне знать, если это звучит правильно):Индексирование SQL Server включает вопросы

  • Для интенсивно используемых п.л., сводятся запрос только то, что нужно и переработать where заявления использовать наиболее распространенный первых. Затем создайте некластеризованный индекс для столбцов, используемых в инструкции where, и ВКЛЮЧАЙТЕ все оставшиеся столбцы выбора (за исключением больших столбцов, например, nvarchar(max)).

  • Если запрос будет возвращать> 20% содержимого записей таблицы, то лучше делать сканирование таблицы, а не использовать индекс

  • порядок в вопросах индекса. Вы должны быть уверены, что структурируете свой оператор where, как индекс построен.

Теперь одна вещь, у меня возникают проблемы с поиском информации на то, что если запрос выбора столбцов, которые не являются частью какого-либо индекса, но использует где оператор, который? Используется ли индекс, а листовой узел попадает в таблицу и просматривает соответствующую строку?

например: таблица

Id col1 col2 col3 

CREATE INDEX my_index 
ON my_table (col1) 

SELECT Id, col1, col2, col3 
FROM my_table 
WHERE col1 >= 3 AND col1 <= 6 

ли my_index здесь используется? Если да, то как он разрешает Id, col2, col3? Указывает ли он на строки таблицы и подбирает значения?

+0

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

+0

Это может быть использовано - вы часто не можете сказать, пока не включите оптимизатор запросов SQL Server и не увидите –

ответ

1

Чтобы ответить на ваш вопрос, да, используется my_index. И да, ваш индекс будет указывать на строки таблицы и выбирать значения id, col2 и col3. Это то, что делает индекс.

Что касается ваших 'правила'

  • Правило 1 имеет смысл. За исключением того факта, что я обычно не включаю другие столбцы в свой индекс. Как объяснялось выше, индекс будет ссылаться на таблицу и быстро извлекать строки (строки), которые вам нужны.

  • Правило 2, я действительно не понимаю. Вы создаете индекс, и SQL Server будет определять, какие индексы использовать или не использовать. Тебе не стоит беспокоиться об этом.

  • Правило 3, заказ на самом деле не имеет значения.

Надеюсь, это поможет.

+0

И убедитесь, что вам не нужно иметь несколько индексов, если это необходимо, особенно если они связаны с одинаковыми столбцами. – DhruvJoshi

+0

Вы уверены, что заказ не имеет значения? А как насчет ответа здесь? http://stackoverflow.com/questions/1840713/order-of-index-on-multiple-columns – user2326106

+0

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

1

Существует несколько понятий и терминов, которые важно понимать при работе с индексами. Поиски, сканирование и поиск - это некоторые из способов, которыми индексы будут использоваться с помощью операторов select. Селективность ключевых столбцов является неотъемлемой частью определения эффективности индекса.

Поиск происходит, когда Оптимизатор запросов SQL Server определяет, что наилучшим способом поиска запрошенных данных является сканирование диапазона внутри индекса. Обычно поиск происходит, когда запрос «покрывается» индексом, что означает, что предикаты поиска находятся в ключе индекса, а отображаемые столбцы либо находятся в ключе, либо включены. Сканирование происходит, когда Оптимизатор запросов SQL Server определяет, что наилучшим способом поиска данных является сканирование всего индекса, а затем фильтрация результатов.Обычно поиск происходит, когда индекс не включает все запрашиваемые столбцы, как в ключе индекса, так и во включенных столбцах. Затем оптимизатор запросов будет использовать либо кластеризованный ключ (против кластерного индекса), либо RID (против кучи), чтобы «искать» другие запрашиваемые столбцы.

Как правило, операции поиска более эффективны, чем сканирование, из-за физического запроса меньшего набора данных. Бывают ситуации, когда это не так, например, очень маленький начальный набор данных, но это выходит за рамки вашего вопроса.

Теперь вы спросили, как определить, насколько эффективен индекс, и есть несколько вещей, о которых нужно помнить. Клавишные столбцы кластерного индекса называются ключом кластеризации. Таким образом, записи становятся уникальными в контексте кластерного индекса. Все некластеризованные индексы будут включать кластеризованный ключ по умолчанию, чтобы выполнять поиск, когда это необходимо. Все индексы будут добавлены, обновлены или удалены для каждого соответствующего оператора DML. Это, как было сказано, лучше всего сбалансировать прирост производительности в операторах выбора в отношении производительности в операциях вставки, удаления и обновления.

Чтобы определить, насколько эффективен индекс, вы должны определить избирательность ваших индексных ключей. Селективность может быть определена как процент от отдельных записей к общим записям. Если у меня есть таблица [person] со 100 полными записями, а столбец [first_name] содержит 90 различных значений, мы можем сказать, что столбец [first_name] на 90% выборочно. Чем выше избирательность, тем эффективнее индексный ключ. Соблюдая избирательность, лучше всего поставить свои наиболее избирательные столбцы в свой индексный ключ. Используя мой предыдущий пример [person], что, если бы у нас был столбец [last_name], который был на 95% избирательным? Мы хотели бы создать индекс с [last_name], [first_name] в качестве ключа индекса.

Я знаю, что это был довольно длинный ответ, но действительно есть много вещей, которые определяют, насколько эффективен индекс, и много вещей, которые вы должны взвесить за любой рост производительности.

Смежные вопросы