powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Index scan вместо index seek по уникальному индексу таблицы внутри cross apply
3 сообщений из 3, страница 1 из 1
Index scan вместо index seek по уникальному индексу таблицы внутри cross apply
    #39996852
WinterGraveyard
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
Дано (схематично):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
create table dbo.T1(
  id int not null primary key nonclustered,
  ......
);
create table dbo.T2(
  id int not null primary key nonclustered,
  t1_id not null,
  ......
);
create function dbo.GetData(@t1_id int)
returns table
as return
select
  ...
from dbo.T1 t1
..
where t1.id=@t1_id;


В таблице T1 ~ 300 тысяч записей, в T2 под миллион. Запрос
Код: sql
1.
2.
3.
4.
5.
select
  f. ..
from dbo.T2 t2
cross apply dbo.GetData(t2.t1_id) f
where t2.id=@t2_id


даёт в плане выполнения index scan по индексу PK T1, и merge join T1 и T2. Запрос выводит одну запись, но выполняется ощутимо медленно. При этом если аналогичное объединение таблиц сделать в одном запросе, то будет ожидаемый index seek + nested loops.
Переписываю табличную функцию так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
alter function dbo.GetData(@t1_id int)
returns table
as return
with cte as (
  select @t1_id t1_id
)
select
  ...
from cte e
join dbo.T1 t1 on t1.id=e.t1_id;


- получаю в плане выполнения index seek + nested loops, и вполне быстрое время выполнения.
Почему в первом варианте TVF получается такой план?
...
Рейтинг: 0 / 0
Index scan вместо index seek по уникальному индексу таблицы внутри cross apply
    #39996858
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WinterGraveyard
Почему в первом варианте TVF получается такой план?
Предлагаете угадать какие получились планы и оценки кардинальности, мысленно их сравнить и тогда ответить на вопрос?

Если хотите всегда получать NL, перепишите функцию так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
create function dbo.GetData(@t1_id int)
returns table
as return
select top (cast(0x7fffffff as int))
  ...
from dbo.T1 t1
..
where t1.id=@t1_id;
...
Рейтинг: 0 / 0
Index scan вместо index seek по уникальному индексу таблицы внутри cross apply
    #39996863
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WinterGraveyard,

Код: sql
1.
2.
3.
4.
5.
6.
select
  f. ..
from dbo.T2 t2
cross apply dbo.GetData(t2.t1_id) f
where t2.id=@t2_id
option (recompile)



дает нормальный план? но вообще да - выложили бы планы, а то через хрусталь смотреть - так себе.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Index scan вместо index seek по уникальному индексу таблицы внутри cross apply
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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