IMHO SQL Server може да избере (освен ако не е казано) какво е най-доброто индекс, който да се използва за заявката.
Добре
Ами нещо подобно (псевдо код):
select __a from tbl where __a not in
(
select __b from tbl
)
(да кажем, че имаме index_1
който е за (__a)
и index_2
който е за (__b)
Ще SQL Server все още използват един индекс при изпълнение или няколко индекса заедно ...?
Отговори:
6 за отговор № 1Първо, създайте таблиците си:
USE tempdb;
GO
CREATE TABLE dbo.tbl(__a INT, __b INT);
След това създайте два индекса:
CREATE INDEX a_index ON dbo.tbl(__a);
CREATE INDEX b_index ON dbo.tbl(__b);
Сега попълнете с някои данни:
INSERT dbo.tbl(__a, __b)
SELECT [object_id], column_id
FROM sys.all_columns;
Сега изпълнете заявката си и превърнете действителния план за изпълнениенататък. Ще видите нещо подобно, което показва, че да, и двата индекса се използват (всъщност индексът на __b се използва както за извличане на данни в подзаявката, така и за премахване на редове):
По-ефективен начин да напишете заявката ви ще бъде:
select __a from dbo.tbl AS t where not exists
(
select 1 from dbo.tbl AS t2
where t2.__b = t.__a
);
Сега тук е целият ви план (отново, и двата индекса се използват, но забележете как има много по-малко операции):