powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос по плану выполнения
5 сообщений из 30, страница 2 из 2
Вопрос по плану выполнения
    #40061801
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm
Алексей
Спасибо, попробовал, соединяет с NL.
NL не всегда лучший вариант.
Фильтрованный индекс не всегда может задействоваться и их не настроишься для разных значений даты.

Я бы попробовал примерно так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
with s as
(
 select
  c.id_key
 from
  (select top (1) PL_ID from PlainList_new where PL_RegDate >= '20210227' order by PL_RegDate, PL_ID) a(PL_ID__min) cross apply
  (select top (1) PL_ID from PlainList_new where PL_RegDate <= '20210228' order by PL_RegDate desc, PL_ID desc) b(PL_ID__max) join
  T2 c on c.id_key between a.PL_ID__min and b.PL_ID__max
)
select
 Y.PL_ID, T10.id_key
from
 PlainList_new Y join
 s T10 on Y.PL_ID = T10.id_key
where
 Y.PL_RegDate between '20210227' AND '20210228'


Тогда даже при merge не будет полного сканирования T2.

Ну, это только в том случае прокатит, если даты сколько-нибудь коррелируют с id.
А если у него даты разбросаны случайно - то никакого выигрыша не будет.
А так - вполне себе может быть, если строки в таблицу, например, вставляются - а потом - многократно апдейтятся (ну, какой-нибудь last_access_time в этом поле, и он многократно меняется).

Скажите, а чем плоха идея просто прибить loop в запросе?
Код: sql
1.
2.
3.
4.
 Select PL_ID,id_key from PlainList_new  Y
 INNER loop JOIN T2 T10
  ON Y.PL_ID =T10.id_key
   Where Y.PL_RegDate between '20210227' AND '20210228' 



И еще один вопрос к ТС:
Я правильно понимаю, что
[PL_ID] [int] IDENTITY(1,1) primary key,
[id_key] [int] primary key,
- nullable поля?

Скажите, а как изменится план, если сделать:
Код: sql
1.
2.
3.
4.
 Select PL_ID,id_key from PlainList_new  Y
 left JOIN T2 T10
  ON Y.PL_ID =T10.id_key
   Where Y.PL_RegDate between '20210227' AND '20210228' 
...
Рейтинг: 0 / 0
Вопрос по плану выполнения
    #40061804
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster,

это
Код: sql
1.
2.
3.
4.
 Select PL_ID,id_key from PlainList_new  Y
 left JOIN T2 T10
  ON Y.PL_ID =T10.id_key
   Where Y.PL_RegDate between '20210227' AND '20210228' 



не эквивалент начальному запросу.
...
Рейтинг: 0 / 0
Вопрос по плану выполнения
    #40061824
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster
Ну, это только в том случае прокатит, если даты сколько-нибудь коррелируют с id.
Для данного запроса - да.
Если его слегка допилить, то будет универсально и в большей или меньшей степени ограничит объем сканирования.
...
Рейтинг: 0 / 0
Вопрос по плану выполнения
    #40061860
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
felix_ff
uaggster,

это
Код: sql
1.
2.
3.
4.
 Select PL_ID,id_key from PlainList_new  Y
 left JOIN T2 T10
  ON Y.PL_ID =T10.id_key
   Where Y.PL_RegDate between '20210227' AND '20210228' 



не эквивалент начальному запросу.

Я в курсе.
Я попросил ТС показать, как изменится план.
...
Рейтинг: 0 / 0
Вопрос по плану выполнения
    #40061928
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
Если его слегка допилить, то будет универсально и в большей или меньшей степени ограничит объем сканирования.
Фигню написал.
...
Рейтинг: 0 / 0
5 сообщений из 30, страница 2 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос по плану выполнения
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]