Путаница с составным индексом в одной таблице

У меня есть веб-сайт онлайн-продажи книг, в системе есть таблица с именем Order и несколько столбцов, как показано ниже:

OrderID int (Primary key),
Library_ID int,
Mode int,
BookId int,
Ext_User_ID varchar(2000),
Activated varchar(1),
RequiredDate datetime,
AmountBuy int,
APPROVAL_DATE datetime,
...

Итак, в таблице более 7 миллионов строк, в настоящее время я работаю над добавлением дополнительных условий запроса на веб-страницу, сценарий sql выглядит следующим образом:

SELECT * FROM Book b, Library l, [Order] o 
WHERE o.bookid = b.bookID 
AND o.mode = 'A' 
AND o.library_ID = l.library_ID 
AND l.library_ID > 19 
AND b.publisher_id  > 1000 
AND b.print_id > 800 
AND NOT EXISTS (SELECT * FROM ExtBOOK WHERE b.bookid = extbookid AND library_ID = l.library_ID) 
AND o.activated = 'Y' 
AND b.eisbn13 LIKE '978%' 
AND len(o.ext_user_id) > 3 
AND b.bookid > 200000 
AND b.bookid in (SELECT bookid FROM category WHERE categoryid  > 2) 
ORDER BY o.orderid DESC

Этот сценарий, вероятно, содержит все возможные условия запроса, после того, как я запустил его в Management Studio с включенным «Включенный фактический план выполнения», в рекомендации говорилось, что мне нужно создать индекс для таблицы Order

CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[Order] ([MODE],[ACTIVATED],[LIBRARY_ID],[BOOKID])
INCLUDE ([OrderID],[EXT_USER_ID],[APPROVAL_DATE])

Однако, когда я иду создавать индекс, я обнаружил, что три других индекса уже существуют, а именно:

create nonclustered index IDX_Order_1 { MODE asc}
create nonclustered index IDX_Order_2 { Library_ID asc, EXT_USER_ID asc, BookID asc}
create nonclustered index IDX_Order_3 { BOOKID asc, Library_id asc, MODE asc }

Итак, вышеприведенные 3 индекса были созданы, вопрос: если я хочу создать свой индекс, я имею в виду, что я почувствовал некоторый дубликат, могу ли я их объединить? Или каждый индекс предназначен для определенного запроса, потому что таблицы растут каждый день, и я не могу гарантировать, какое приложение или какой скрипт sql использует, кроме моего запроса. Любая идея?


person danmiao    schedule 21.06.2012    source источник


Ответы (1)


Я бы порекомендовал вам немного почитать о том, как работают индексы.

Эта ссылка даст вам основы.

http://www.simple-talk.com/sql/learn-sql-server/sql-server-index-basics/

Но, отвечая на ваш вопрос, вы должны создать индексы для часто используемых столбцов. Это означает, что если вы создаете индекс для BookID, LibraryID и Mode, этот индекс использует все 3 столбца и полезен, когда ваше предложение where просматривает эти 3 столбца. Насколько я понимаю, иметь этот индекс, а затем искать только по LibraryID, было бы бесполезно.

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

person Purplegoldfish    schedule 21.06.2012
comment
Привет, Purplegoldfish, Большое спасибо, я прочитал статью, которую вы рекомендовали, она довольно полезна, я думал, что понимаю структуру индекса, а индексы IDX_Order_1, IDX_Order_2 и IDX_Order_3, вероятно, для какого-то конкретного запроса, в любом случае я создам IDX_order_4 и посмотрите, улучшилась ли производительность. - person danmiao; 22.06.2012