powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / План выполнения запроса непонятен
10 сообщений из 10, страница 1 из 1
План выполнения запроса непонятен
    #39714175
Диам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Есть такой скрипт

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
  IF exists(	
select K1.keyRKD --*, K1.OKD, K2.OKD, K1.OND, K2.OND, K1.PSum, K2.PSum , K1.RSum, K2.RSum
            FROM Kassa_RKD_E K1 
            INNER JOIN Kassa_RKD_View_E2_tbl_tmp K2 ON K1.dat = K2.dat
		            AND K1.keyOH=K2.keyOH AND K1.kodF=K2.kodF AND K1.KartAcc=K2.KartAcc AND K1.KartNom=K2.KartNom AND K1.keyCA=K2.keyCA
            WHERE ROUND(K1.OKD-K2.OKD,2)<>0 
            OR
	            ROUND(K1.OND-K2.OND,2)<>0 OR
	            ROUND(K1.PSum-K2.PSum,2)<>0 OR
	            ROUND(K1.RSum-K2.RSum,2)<>0 
	            
	            ) print '1'

select K1.*, K1.OKD, K2.OKD, K1.OND, K2.OND, K1.PSum, K2.PSum , K1.RSum, K2.RSum
            FROM Kassa_RKD_E K1 
            INNER JOIN Kassa_RKD_View_E2_tbl_tmp K2 ON K1.dat = K2.dat
		            AND K1.keyOH=K2.keyOH AND K1.kodF=K2.kodF AND K1.KartAcc=K2.KartAcc AND K1.KartNom=K2.KartNom AND K1.keyCA=K2.keyCA
            WHERE ROUND(K1.OKD-K2.OKD,2)<>0 
            OR
	            ROUND(K1.OND-K2.OND,2)<>0 OR
	            ROUND(K1.PSum-K2.PSum,2)<>0 OR
	            ROUND(K1.RSum-K2.RSum,2)<>0 



У таблицы Kassa_RKD_View_E2_tbl_tmp нет индексов вообще

НЕПОНЯТНОСТЬ:
при построении плана для блока IF EXISTS() оптимизатор предполагает, что количество строк для PK_Kassa_RKD_E будет 2,7 и выбирается соединение LOOP JOIN. От этого операция IF EXISTS выполняется 1 час!!!
Но тот же самый запрос, выполненный вне конструкции IF EXISTS уже строится по другому. И для PK_Kassa_RKD_E предполагаемое количество строк уже берется реальное = 199 999. Запрос выполняется меньше секунды.

Знаю, что спасает подсказка Использовать HASH JOIN, но больше интересует почему берется неверное предположение о количестве строк.

План запроса прикладываю
...
Рейтинг: 0 / 0
План выполнения запроса непонятен
    #39714208
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диам,

Это называется row goal.
...
Рейтинг: 0 / 0
План выполнения запроса непонятен
    #39714531
Диам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK,
почитал. Спасибо.
А как лечить, если не явной подсказкой INNER HASH JOIN ?
...
Рейтинг: 0 / 0
План выполнения запроса непонятен
    #39714565
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДиамTaPaK,
почитал. Спасибо.
А как лечить, если не явной подсказкой INNER HASH JOIN ?
я лечу выносом всего в переменную, потом проверяю простот if @a = 1
...
Рейтинг: 0 / 0
План выполнения запроса непонятен
    #39714623
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диам,

для SQL 2016 SP1 есть

OPTION (USE HINT('DISABLE_OPTIMIZER_ROWGOAL')),

для версий ниже можно использовать trace-флаг 4138
...
Рейтинг: 0 / 0
План выполнения запроса непонятен
    #39714680
Владимир Затуливетер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДиамА как лечить, если не явной подсказкой INNER HASH JOIN ?
а в чем проблема простовыставить хин hash join?
это ведь то что вам нужно.
не вижу смысла что-то еще делать, всего две таблицы без индексов, ожидаем hash join, и больше ничего.
...
Рейтинг: 0 / 0
План выполнения запроса непонятен
    #39714687
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ffДиам,

для SQL 2016 SP1 есть

OPTION (USE HINT('DISABLE_OPTIMIZER_ROWGOAL')),

для версий ниже можно использовать trace-флаг 4138
Есть небольшие проблемы с хинтом... Некуда поставить :)
...
Рейтинг: 0 / 0
План выполнения запроса непонятен
    #39714699
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДиамА как лечить, если не явной подсказкой INNER HASH JOIN ?Например так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
IF exists(	
 select
  *
 from
  (
   select
    row_number() over (order by (select 1)) 
            FROM Kassa_RKD_E K1 
            INNER JOIN Kassa_RKD_View_E2_tbl_tmp K2 ON K1.dat = K2.dat
		            AND K1.keyOH=K2.keyOH AND K1.kodF=K2.kodF AND K1.KartAcc=K2.KartAcc AND K1.KartNom=K2.KartNom AND K1.keyCA=K2.keyCA
            WHERE ROUND(K1.OKD-K2.OKD,2)<>0 
            OR
	            ROUND(K1.OND-K2.OND,2)<>0 OR
	            ROUND(K1.PSum-K2.PSum,2)<>0 OR
	            ROUND(K1.RSum-K2.RSum,2)<>0
   ) t(rn) 
  where
   rn > 0	            
) print '1'
...
Рейтинг: 0 / 0
План выполнения запроса непонятен
    #39715226
Фотография Mind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmДиамА как лечить, если не явной подсказкой INNER HASH JOIN ?Например так:А просто count(*) в таких случаях разве не срабатывает?
...
Рейтинг: 0 / 0
План выполнения запроса непонятен
    #39715999
Диам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mind, помогает все, что исключает exists()
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / План выполнения запроса непонятен
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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