/ / Може ли SQL Server да използва повече от един индекс? - sql-сървър, sql-server-2008, индексиране

Може ли SQL Server да използва повече от един индекс? - sql-сървър, sql-server-2008, индексиране

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
);

Сега тук е целият ви план (отново, и двата индекса се използват, но забележете как има много по-малко операции):

въведете описанието на изображението тук