В приведенном ниже запросе не используются индексы, установленные для col1 и col2. Разве я не могу ожидать, что SQL, включающий «там, где существует», будет использовать индексы?
select a, b
from [dbo].[test] testA
where exists
(
select *
from [dbo].[test] as testB
where
testA.col1 = testB.col1
testA.col2 > testB.col2
)
Спасибо за комментарий. Да, и «testA», и «testB» являются псевдонимами для «test». Вышеупомянутый запрос значительно упрощен, но в основном такой же, как и настоящий.
Не могли бы вы поделиться временными данными, что именно у вас есть в тестовой таблице и что вам нужно в результате.
Спасибо, Раджат. Исходный запрос очень сложен, с несколькими столбцами datetime для ">" и несколькими столбцами int / varchar для " = ".


Для этого запроса:
select a.a, a.b
from [dbo].[test] a
where exists (select 1
from [dbo].[test] a2
where a.col1 = a2.col1 and
a.col2 > b.col2
);
Лучший индекс - на test(col1, col2).
Я был бы склонен написать это на row_number():
select a.*
from (select a.*,
row_number() over (partition by col1 order by col2) as seqnum
from dbo.test a
) a
where seqnum > 1;
В этой версии предполагается, что col2 уникален. Возможно, вам понадобится rank() вместо row_number().
Спасибо, Гордон. Я попробую оба. Я даже не думал об использовании rank / row_number.
вам нужно добавить индекс нескольких столбцов
create index index_test_all on test ("col1","col2","a","b");
select a, b
from [dbo].[test] testA
where exists (
select 1
from [dbo].[test] as testB
where testA.col1 = testB.col1
and testA.col2 > testB.col2
)
;

Спасибо! Я думаю, что «сканирование индекса» означает, что запрос не использует индекс, в отличие от «поиска индекса». Пожалуйста, поправьте меня, если я ошибаюсь.
@TimBiegeleisen выглядит так, будто testA и testB - это одна и та же таблица ...