Подобрявах производителността на някои 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
. Включените колони присъстват само в листовото ниво на индекса - не можете да ги използвате за избиране на редове - и те са там, за да може вашата заявка да бъде удовлетворена (всички колони, поискани от заявката) само от структура на индекса, така че да не се налага да правите скъпо търсене на ключ в действителните данни в таблицата, за да получите една или две допълнителни колони, от които се нуждаете. - 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