«где существует» и индекс - PullRequest
0 голосов
/ 24 мая 2018

В приведенном ниже запросе, похоже, не используются индексы, установленные на 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
    )   

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

вам нужно добавить несколько столбцов индекса

create index index_test_all on test ("col1","col2","a","b");

Запрос SQL:

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

План выполнения:


ДЕМО SQL Fiddle

0 голосов
/ 24 мая 2018

Для этого запроса:

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().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...