powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / возможна ли оптимизация Self-Join по ключу
4 сообщений из 4, страница 1 из 1
возможна ли оптимизация Self-Join по ключу
    #39639483
БД_Юзверь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть табличные инлайн-функции, которые принимают в параметре дату актуальности и возвращают данные из основной таблицы и соединенных с ней таблиц с периодиками (первичный ключ = первичный ключ основной таблиц + дата).
В общем суть в том, что обращаясь к такой функции и указывая дату мы получаем все необходимые столбцы, не задумываясь о том где именно они хранятся - в основной таблице или периодиках. Довольно удобно и универсально, поскольку не нужно изменять кучу кода в случае если какой-то из столбов станет или не станет периодическим. Нужно будет поправить, только одну функцию.

Иногда возникает необходимость запросить кроме актуальных данных еще и данные из столбца на дату, которая находилась в прошлом. В таком случае приходится делать соединение по первичному ключу (pk_id) этих 2х функций с разными параметрами:
Код: sql
1.
2.
3.
SELECT T1.*, T2.c5
FROM            tabe_inline_func(@date1) AS T1
LEFT OUTER JOIN tabe_inline_func(@date2) AS T2  ON T2.pk_id = T1.pk_id


В плане запроса получается Self-Join основной таблицы самой с собой по первичному ключу. Т.е. если убрать все лишнее получается запрос:
Код: sql
1.
2.
3.
SELECT T1.*, T2.c5
FROM            common_table AS T1
LEFT OUTER JOIN common_table AS T2  ON T2.pk_id = T1.pk_id


Вопрос: неужели sql server не может понять, что в таком запросе осуществляется соединение строки самой с собой и т.о. план запроса можно упростить до примерно такого:
Код: sql
1.
2.
SELECT T1.*, T1.c5
FROM            common_table AS T1


Может быть можно как-то явно указать на необходимость оптимизации?

Избавиться от такого двойного запроса к таблице можно убрав из функции основную таблицу и оставив только периодики, которые будут соединяться по параметру:
Код: sql
1.
2.
3.
SELECT T1.*, T2.c5
FROM       common_table                       AS T1
OUTER JOIN tabe_inline_func(T1.pk_id, @date2) AS T2


Однако при такой схеме мы теряем универсальность запроса и получаем необходимость исправлять каждый раз весь подобный код при смене конфигурации периодик (перемещение столбца в/из периодику).

Получается выбор между универсальностью кода и неоптимальность запросов.
Можно ли как-то избежать компромисса?
...
Рейтинг: 0 / 0
возможна ли оптимизация Self-Join по ключу
    #39639489
БД_Юзверь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сервер:
Microsoft SQL Server 2014 (SP2-CU9) (KB4055557) - 12.0.5563.0 (X64)
Dec 7 2017 01:00:06
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)

Клиентское приложение: SSMS v17.6
...
Рейтинг: 0 / 0
возможна ли оптимизация Self-Join по ключу
    #39639501
БД_Юзверь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код для получения плана запроса:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
DECLARE @common_table TABLE
(
  pk_id Int,
  c1    VarChar(50),
  c2    DateTime2   DEFAULT SysDateTime(),
  c3    Int,
  c4    Bit,
  c5    UniqueIdentifier  DEFAULT NewId(),
  Primary Key (pk_id)
);
INSERT INTO @common_table (pk_id)
 VALUES (1), (2), (3), (4);
SELECT T1.*, T2.c5
FROM              @common_table AS T1
LEFT OUTER JOIN   @common_table AS T2  ON T2.pk_id = T1.pk_id;
...
Рейтинг: 0 / 0
возможна ли оптимизация Self-Join по ключу
    #39639502
WarAnt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
БД_Юзверь,

кнопки "сделай красиво и быстро" нет, если вы об этом.
выбирайте что вам важнее скорость работы или универсальность,
и да, самолет-корабль, всегда хуже самолета и корабля.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / возможна ли оптимизация Self-Join по ключу
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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