Я улучшал производительность некоторых сценариев запросов 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
Когда я ищу этот sql-скрипт в SQL Management Studio с помощью «Включить фактический план выполнения», результат просит меня добавить ниже индекс
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[Order] ([MODE],[ACTIVATED],[LIBRARY_ID],[BOOKID])
INCLUDE ([OrderID],[EXT_USER_ID],[APPROVAL_DATE])
Однако, если я удалю какие-то условия, как показано ниже:
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
ORDER BY o.orderid DESC
У меня есть еще одна рекомендация, как показано ниже:
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[ORDER] ([MODE])
INCLUDE ([LIBRARY_ID],[BOOKID])
Поскольку условия являются переменными, какой индекс мне следует создать? Я понимаю, что делают индексы, но не понимаю преимуществ между индексируемым полем и включенным полем. Почему в первом рекомендованном индексе BOOKID и LIBRARY_ID находятся в полях индекса, а во втором рекомендуемом индексе BOOKID и LIBRARY_ID находятся во включенных полях? В чем различия, и что мне следует использовать, чтобы охватить все возможные условия?
Кроме того, из своего теста я добавил каждый из них, чтобы проверить производительность, но не вижу никакой разницы. Я ценю любую помощь.
WHERE
. Включенные столбцы присутствуют только на конечном уровне индекса - вы не можете использовать их для выбора строк - и они там, поэтому ваш запрос может быть удовлетворен (все столбцы, запрошенные запросом) только из index, чтобы вам не приходилось выполнять дорогостоящий поиск ключей в фактических данных таблицы, чтобы получить один или два дополнительных столбца, которые вам нужны. - person marc_s   schedule 20.06.2012order by
, или мне нужно использовать столбцы индекса дляorder by
, илиorder by
не нуждается в индексе. - person danmiao   schedule 20.06.2012WHERE
илиORDER BY
, он должен быть частью фактического индекса и храниться в структуре навигации индекса. Если у вас есть столбец в качестве включенного столбца, индекс нельзя использовать дляORDER BY
- person marc_s   schedule 20.06.2012