"где существует" и индекс

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

@TimBiegeleisen выглядит так, будто testA и testB - это одна и та же таблица ...

kjmerf 24.05.2018 04:09

Спасибо за комментарий. Да, и «testA», и «testB» являются псевдонимами для «test». Вышеупомянутый запрос значительно упрощен, но в основном такой же, как и настоящий.

yobioo 24.05.2018 04:29

Не могли бы вы поделиться временными данными, что именно у вас есть в тестовой таблице и что вам нужно в результате.

Rajat Jaiswal 24.05.2018 04:30

Спасибо, Раджат. Исходный запрос очень сложен, с несколькими столбцами datetime для ">" и несколькими столбцами int / varchar для " = ".

yobioo 25.05.2018 03:46
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
4
91
2

Ответы 2

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

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.

yobioo 25.05.2018 03:53

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

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

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


DEMO SQL Fiddle

Спасибо! Я думаю, что «сканирование индекса» означает, что запрос не использует индекс, в отличие от «поиска индекса». Пожалуйста, поправьте меня, если я ошибаюсь.

yobioo 25.05.2018 03:48

Другие вопросы по теме