2014-12-11 2 views
0

У меня есть вопросы, которые выглядят как:Как мне создать этот индекс?

select blah, foo 
from tableA 
where makedate = @somedate 

select bar, baz 
from tableA 
where vendorid = @someid 

select foobar, onetwo 
from tableA 
where vendorid = @someid and makedate between @date1 and @date2 

Должен ли я создать только один индекс:

create nonclustered index searches_index on tableA(vendorid, makedate) 

Должен ли я создать 3 индексов:

create nonclustered index searches_index on tableA(vendorid, 
    makedate) 

create nonclustered index searches_index on tableA(vendorid) 

create nonclustered index searches_index on tableA(makedate) 

Также эти две разные показатели? Другими словами, имеет ли смысл порядок столбцов?

create nonclustered index searches_index on tableA(vendorid, makedate) 

create nonclustered index searches_index on tableA(makedate, vendorid) 

Я читал информацию по индексам, но не уверен, что лучший способ сделать их?

+0

Вы должны создать 3 индекса. –

+0

@GMastros - см. Править выше – dotnetN00b

+0

Да эти индексы с разным порядком отличаются. И что такое ПК стола. Вы знаете, что SSMS порекомендует запросы.Вам действительно нужно проверить свои данные, поскольку это может зависеть. – Paparazzi

ответ

3

Ни одно из ваших предложений является оптимальным.

Вы должны создать два индексов:

create nonclustered index searches_index on tableA(vendorid, makedate) 

create nonclustered index searches_index on tableA(makedate) 

причин является то, что первый индекс на (VendorID, makedate) будет использоваться как для второго и третьего вашего образца запросов; индекс (vendorid) будет только избыточным.

[Редактировать] Чтобы ответить на дополнительный вопрос:

Да, порядок следования столбцов делает дело в создании индекса. Индекс на (vendorid, makedate) может использоваться для оптимизации запросов формы WHERE vendorid = ? AND makedate = ? или WHERE vendorid = ?, но не может помощь по запросу WHERE makedate = ?. Чтобы получить какую-либо значительную оптимизацию индекса по последнему запросу, вам понадобится индекс с makedate на руководителя этого индекса. (Обратите внимание, что в моем примере запросы «=» означают любое оптимизируемое условие).

Существуют некоторые случаи кросс, в которых бесполезный индекс (например, (vendorid, makedate) в запросе только makedate) может предоставить некоторую номинальную помощь при возврате данных, поскольку @Bram указывает на комментарии. Например, если вы возвращаете только те столбцы makedate ив этом запросе, то механизм SQL может обрабатывать индекс как мини-таблицу и последовательно сканировать это, чтобы найти соответствующие строки, не имея необходимости смотреть на полную копию таблицы. Это называется , охватывающим индекс.

+0

Предполагается, что vendorid является основным ключом, и это сделает его излишним? Также теперь у вас есть вопрос, стоит ли подсчет столбцов. Я добавлю это к моему сообщению выше. – dotnetN00b

+0

Да, порядок столбцов подсчитывается при определении того, можно ли использовать один многоколоночный индекс для оптимизации двух или более терминов в предложении WHERE. Чтобы это было возможно, термины должны содержать оптимизируемые выражения, относящиеся к столбцам * head * индекса. –

+0

Столбец 'vendorid' сам по себе не может быть основным ключом для этой таблицы; что позволит использовать только одну запись для каждого поставщика, и вы никогда не найдете себя в поиске на основе даты. Поэтому первичный ключ будет * как минимум * (vendorid, makedate). Если это так, то есть * уже * индекс в этих столбцах, поэтому * не * создайте второй индекс - больше накладных расходов для нулевого усиления. –

0

Если бы это был я, и я знал, что всегда будет задан стол в одном из трех перечисленных вами способов, я бы создал три индекса, как вы предложили. Это довольно легкие индексы, чтобы иметь, поэтому я бы не стал беспокоиться (вообще говоря) о других издержках, которые могут привести к нескольким индексам.

Как раз мое мнение, я уверен, что есть другие противники.

Также примечание стороны: при создании 3 индексов, все они должны иметь уникальное имя

+0

См. Править выше. – dotnetN00b

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