Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 sort & hash -- зачем сортировать в преддверии hash join?  [new]
o-o
Guest
знающие люди, подскажите, зачем он сортирует результат REMOTE QUERY,
если затем выполняет HASH JOIN?
если закачать на свой сервер то, что он отдает отсортированное на втором (кладу во временную таблицу #acv),
и соединить обратно с тем, с чем и было,
снова тот же HASH JOIN, но сортировки нет
и реально быстрее выполняется (хотя когда все локально, он еще и параллелит).
нельзя ли как-то эту сортировку ему убрать?
----
явление не случайное, он это же делает и с другими запросами с участием линкеда.
упорно сортирует результат перед отдачей на местный сервер, а потом его hash join-ит

К сообщению приложен файл. Размер - 118Kb
14 июн 16, 17:00    [19292454]     Ответить | Цитировать Сообщить модератору
 Re: sort & hash -- зачем сортировать в преддверии hash join?  [new]
Mr. X
Guest
o-o,

Если я правильно разглядел, то в самом запросе задана ORDER BY ...
14 июн 16, 17:47    [19292782]     Ответить | Цитировать Сообщить модератору
 Re: sort & hash -- зачем сортировать в преддверии hash join?  [new]
o-o
Guest
нет, нету там order by.
поэтому во втором запросе и нет никакого сорта.
они идентичны, только во втором вместо линкеда подставлена выгрузка в темповую таблицу.
там на самом деле и не во временные заливаем, в постоянные.
это я просто чтобы базу не засорять во времянки лью для сравнения.
могу и код показать,
форматирование не мое и мне лень:
+

-- original
SELECT  distinct
		r.datarif, r.id_data, 
		r.NUM_PRAT, r.COD_RECUPE, 
		r.CODRESPINT AS AM_rec, acv.codrespint AS [AM_acv], p.CODRESPINT AS [AM_pra], 
		CASE 
			WHEN acv.codrespint IS NULL			AND r.CODRESPINT IS NULL											THEN p.CODRESPINT 
			WHEN acv.codrespint IS NULL			AND r.CODRESPINT =1													THEN p.CODRESPINT 
			WHEN acv.codrespint IS NOT NULL		AND r.CODRESPINT IS NULL											THEN acv.codrespint 
			WHEN acv.codrespint IS NULL			AND r.CODRESPINT IS NOT NULL										THEN r.CODRESPINT 
			WHEN acv.codrespint IS NOT NULL		AND r.CODRESPINT IS NOT NULL AND r.CODRESPINT = acv.codrespint		THEN acv.codrespint 
			WHEN acv.codrespint IS NOT NULL		AND r.CODRESPINT IS NOT NULL AND r.CODRESPINT <> acv.codrespint		THEN acv.codrespint 
		ELSE '9999999' 
		END AS AM_riclassificato_cod, 
		CASE 
			WHEN acv.codrespint IS NULL			AND r.CODRESPINT IS NULL											THEN 'AM_pra: AM_acv null AM_rec null' 
			WHEN acv.codrespint IS NULL			AND r.CODRESPINT =1													THEN 'AM_pra: AM_acv null AM_rec = 1' 
			WHEN acv.codrespint IS NOT NULL		AND r.CODRESPINT IS NULL											THEN 'AM_acv: AM_acv not null AM_rec null' 
			WHEN acv.codrespint IS NULL			AND r.CODRESPINT IS NOT NULL										THEN 'AM_rec: AM_acv null AM_rec not null' 
			WHEN acv.codrespint IS NOT NULL		AND r.CODRESPINT IS NOT NULL AND r.CODRESPINT = acv.codrespint		THEN 'AM_acv: AM_acv not null + AM_acv=AM_rec' 
			WHEN acv.codrespint IS NOT NULL		AND r.CODRESPINT IS NOT NULL AND r.CODRESPINT <> acv.codrespint		THEN 'AM_acv: AM_acv not null + AM_acv<>AM_rec' 
		ELSE 'ND' 
		END AS AM_riclassificato_des
INTO #RES		
FROM         dbo.M_A_Recuperi_T AS r INNER JOIN
                      REPLICA.dbo.legprati AS p ON r.NUM_PRAT = p.NUM_PRAT LEFT OUTER JOIN
             openquery(USEPCPDZ2, 'select cod_recupe, codrespint
                                   from amministrazione.dbo.AMM_COMPENSO_VARIABILE') AS acv ON r.COD_RECUPE = acv.cod_recupe
where r.cod_recupe <> 22428;

-- edited:
select cod_recupe, codrespint
into #acv
from USEPCPDZ2.amministrazione.dbo.AMM_COMPENSO_VARIABILE
-- 14.679.949 00:30

SELECT  distinct
		r.datarif, r.id_data, 
		r.NUM_PRAT, r.COD_RECUPE, 
		r.CODRESPINT AS AM_rec, acv.codrespint AS [AM_acv], p.CODRESPINT AS [AM_pra], 
		CASE 
			WHEN acv.codrespint IS NULL			AND r.CODRESPINT IS NULL											THEN p.CODRESPINT 
			WHEN acv.codrespint IS NULL			AND r.CODRESPINT =1													THEN p.CODRESPINT 
			WHEN acv.codrespint IS NOT NULL		AND r.CODRESPINT IS NULL											THEN acv.codrespint 
			WHEN acv.codrespint IS NULL			AND r.CODRESPINT IS NOT NULL										THEN r.CODRESPINT 
			WHEN acv.codrespint IS NOT NULL		AND r.CODRESPINT IS NOT NULL AND r.CODRESPINT = acv.codrespint		THEN acv.codrespint 
			WHEN acv.codrespint IS NOT NULL		AND r.CODRESPINT IS NOT NULL AND r.CODRESPINT <> acv.codrespint		THEN acv.codrespint 
		ELSE '9999999' 
		END AS AM_riclassificato_cod, 
		CASE 
			WHEN acv.codrespint IS NULL			AND r.CODRESPINT IS NULL											THEN 'AM_pra: AM_acv null AM_rec null' 
			WHEN acv.codrespint IS NULL			AND r.CODRESPINT =1													THEN 'AM_pra: AM_acv null AM_rec = 1' 
			WHEN acv.codrespint IS NOT NULL		AND r.CODRESPINT IS NULL											THEN 'AM_acv: AM_acv not null AM_rec null' 
			WHEN acv.codrespint IS NULL			AND r.CODRESPINT IS NOT NULL										THEN 'AM_rec: AM_acv null AM_rec not null' 
			WHEN acv.codrespint IS NOT NULL		AND r.CODRESPINT IS NOT NULL AND r.CODRESPINT = acv.codrespint		THEN 'AM_acv: AM_acv not null + AM_acv=AM_rec' 
			WHEN acv.codrespint IS NOT NULL		AND r.CODRESPINT IS NOT NULL AND r.CODRESPINT <> acv.codrespint		THEN 'AM_acv: AM_acv not null + AM_acv<>AM_rec' 
		ELSE 'ND' 
		END AS AM_riclassificato_des
INTO #RES		
FROM         dbo.M_A_Recuperi_T AS r INNER JOIN
                      REPLICA.dbo.legprati AS p ON r.NUM_PRAT = p.NUM_PRAT LEFT OUTER JOIN
                      #acv AS acv ON r.COD_RECUPE = acv.cod_recupe
where r.cod_recupe <> 22428;

таких запросов вагон и тележка, и нигде нет order by, потому что это заливка таблиц.
14 июн 16, 18:06    [19292897]     Ответить | Цитировать Сообщить модератору
 Re: sort & hash -- зачем сортировать в преддверии hash join?  [new]
o-o
Guest
в общем уже подсказали, убрать ненужный сорт можно, использовав openquery.
но предварительное скачивание во временную рулит,
это самый быстрый вариант, параллелизм помогает.
мне интересно другое, сервер -- он же программа.
разве бывают программы-мазохисты, в смысле, сами себе не дают засохнуть и делают лишнее,
чтоб жизнь малиной не казалась?
14 июн 16, 18:10    [19292912]     Ответить | Цитировать Сообщить модератору
 Re: sort & hash -- зачем сортировать в преддверии hash join?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8805
o-o,

Я делаю не так - на ремоуте выполняю процедуру, которая там складывает данные в таблицу. Затем закачиваю таблицу на местный сервер. Отлично работает много лет и быстро. И без распределенных транзакций.
15 июн 16, 12:26    [19295120]     Ответить | Цитировать Сообщить модератору
 Re: sort & hash -- зачем сортировать в преддверии hash join?  [new]
o-o
Guest
прямого доступа к тому серверу у меня нет, равно как и у них всех,
только через линкед.
абсолютно все отмаплены в скульный логин, являющийся дата_pидером в одной базе.
ни о каких процедурах речь не идет,
а вот что надо раз в день скачивать эти несчастные 10 таблиц,
а не каждому лезть туда, качать, да еще и без прав на статистику, это да, пытаюсь донести глухонемым стенам.
данные все равно там обновляются раз в день, привет криворуким архитекторам,
питающим любовь к линкедам.
-----------------------------------------
подозрение падает на версию сервера.
оба они 2008 R2 SP1.
если же закачать ту таблицу на основной,
а 2 другие таблицы сложить на мой локальный 2008 R2 SP3,
и опросить все то же самое, но в связке 2008 R2 SP3 + 2008 R2 SP1 as linked
план получается 1 в 1, но никакого ORDER BY в remote query НЕТ.
только патчить они не будут,
уж спасибо им за sp1
15 июн 16, 15:57    [19296149]     Ответить | Цитировать Сообщить модератору
 Re: sort & hash -- зачем сортировать в преддверии hash join?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8805
o-o,

а что насчёт SSIS?
Процедуру я вызываю через линкед сервер, она ТАМ отрабатывает и забираю данные так же из ТОЙ буферной таблицы.
15 июн 16, 16:42    [19296418]     Ответить | Цитировать Сообщить модератору
 Re: sort & hash -- зачем сортировать в преддверии hash join?  [new]
o-o
Guest
Владислав Колосов
Процедуру я вызываю через линкед сервер, она ТАМ отрабатывает и забираю данные так же из ТОЙ буферной таблицы.

как же db_datareader будет выполнять какие-то процедуры на линкеде
и чем это поможет ad hoc -запросам, рождающимся на лету в голове пользователей и
использующим эти remote-таблицы?
говорю же, есть предложение эти таблицы раз в день забирать.
никаких дополнительных прав не надо, все считываем, но единожды.
но это другая история,
а в этой мне интересно, зачем и кто придумал сортировать результат с линкеда?
результат remote query на 2008 R2 SP1 возвращается неизменно отсортированный по полям из соединения
при том, что никаких merge join в помине нет, там всегда hash
15 июн 16, 16:53    [19296507]     Ответить | Цитировать Сообщить модератору
 Re: sort & hash -- зачем сортировать в преддверии hash join?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8805
o-o,

amministrazione.dbo.AMM_COMPENSO_VARIABILE - точно таблица?
15 июн 16, 17:54    [19296925]     Ответить | Цитировать Сообщить модератору
 Re: sort & hash -- зачем сортировать в преддверии hash join?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Владислав Колосов
o-o,

amministrazione.dbo.AMM_COMPENSO_VARIABILE - точно таблица?

а какие ещё варианты бывают?
15 июн 16, 17:56    [19296941]     Ответить | Цитировать Сообщить модератору
 Re: sort & hash -- зачем сортировать в преддверии hash join?  [new]
o-o
Guest
точно.
оно не вью

К сообщению приложен файл. Размер - 48Kb
15 июн 16, 18:02    [19296970]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить