2015-10-08 2 views
0

У меня есть таблица в SQL Server, которая имеет 700 000 записей. Но, когда я делаю простой запрос выбора с 3 до 4 условий в разделе where, он занимает до 45 секунд. У меня уже есть 2 некластеризованных и 1 кластеризованный индекс. Поэтому я решил добавить еще 2 некластеризованных индекса в эту таблицу. Поступая таким образом, My table будет иметь индексы для всех столбцов, которые я использую в разделе where моего запроса. Я также сделал это и обнаружил, что результат идет довольно быстро по сравнению с предыдущим.Множественный некластерный индекс и производительность?

Может иметь от 5 до 6 Некластеризованный индекс может повредить производительность базы данных или это не повлияет на многое?

структура Мой запрос является

SELECT (SOME COLUMNS) FROM MyTable 
WHERE COL1 = @Id AND COL2 >= @SomeDate AND (NOT (COL3 = 1)) AND 
(COL4 <= @SomeOtherDate) 

Таблица имеет 35 столбцов.

+2

Как всегда, это зависит. Наличие 5-6 индексов в порядке, если они необходимы. – lad2025

+0

зависит? Как ? вот что я прошу. В каких случаях? –

+3

Таким образом, есть основания предполагать, и в зависимости от различных факторов. Ответ как @ lad2025 сказал: «Это зависит». У меня есть таблицы с индексами до 5-10, и он работает очень быстро. Проверьте информацию об индексе онлайн для получения более подробной информации. –

ответ

1

Это ваш запрос:

SELECT (SOME COLUMNS) 
FROM MyTable 
WHERE COL1 = @Id AND COL2 >= @SomeDate AND (NOT (COL3 = 1)) AND 
     (COL4 <= @SomeOtherDate) 

К сожалению, ваш запрос может только прямое использование двух колонок в этом разделе. Я бы предложил следующие композит индекс: (col1, col2, col3, col4). Этот индекс охватывает предложение where, но его можно использовать только для первых двух условий.

Кластеризованный индекс, вероятно, будет незначительным улучшением по сравнению с некластеризованным индексом b-дерева.

Примечание если col3 принимает только значения 0 и 1, то вы должны написать where случай:

WHERE COL1 = @Id AND COL2 >= @SomeDate AND COL3 = 0 AND 
     (COL4 <= @SomeOtherDate) 

И использовать либо (col1, col3, col2, col4) или (col1, col3, col4, col2).

+0

Кластеризованный индекс по-прежнему является индексом B-дерева, вы имеете в виду, что кластеризованный индекс будет улучшением по сравнению с некластеризованным? – GarethD

+0

Для таблицы может быть определен только один кластеризованный индекс (нормальный первичный ключ). Строки физически упорядочены по кластерному индексу. Поэтому не определяйте его на модифицируемых столбцах. – Khonsort

+0

@ GarethD Я считаю, что Гордон правильно сказал. Кластеризованный индекс сохранит только несколько листов и, следовательно, лишь незначительные улучшения. –

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