Путаница по поводу многокомпонентного индекса в одной таблице
У меня есть сайт онлайн-продажи книг, в системе есть таблица под названием 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 использует, кроме моего запроса. Любая идея?
1 ответ
Я бы порекомендовал вам почитать, как работают индексы.
Эта ссылка даст вам основы.
http://www.simple-talk.com/sql/learn-sql-server/sql-server-index-basics/
Но, отвечая на ваш вопрос, вы должны создать индексы для часто используемых столбцов. Это означает, что если вы создаете индекс для BookID, LibraryID и Mode, этот индекс использует все 3 столбца и будет полезен, когда ваше предложение where просматривает эти 3 столбца. Насколько я понимаю, наличие этого индекса, а затем только поиск по LibraryID не будет полезным.
В основном посмотрите на запросы, которые вы делаете в своих таблицах, определите, какие столбцы используются, а затем проиндексируйте наиболее часто используемые. Остерегайтесь чрезмерного индексирования, поскольку это замедлит работу вашей базы данных.