Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Выборка с удаленного сервера  [new]
выборка
Guest
Есть сервер S1 и S2. Dias - Диасофт.

На cервере S1 выполняется следующий код:

SELECT id into #testtable from dias.work5nt.dbo.table1 t 
where t.OperDate between '20110101' and '20110526'

Запрос отрабатывает за 5 секунд и в таблицу записывается 15 ID-шников.

Выполняем следующий запрос

SELECT * from dias.work5nt.dbo.table1 t 
where id in (select id from dias.work5nt.dbo.table1)

или

select * from dias.work5nt.dbo.table1 o(nolock),
       #testtable t 
where  t.id= o.id

И удаленный сервер впадает в 6 минутный ступор. И судя по плану, 99% уходит на удаленый запрос.

Если пишешь

SELECT id into #testtable from dias.work5nt.dbo.table1 t 
where id in (1,2,3,4,5)

Отрабатывает моментально.

В чём причина?
27 май 11, 17:00    [10721593]     Ответить | Цитировать Сообщить модератору
 Re: Выборка с удаленного сервера  [new]
выборка
Guest
выборка
SELECT * from dias.work5nt.dbo.table1 t 
where id in (select id from dias.work5nt.dbo.table1)


Подразумевалось

SELECT * from dias.work5nt.dbo.table1 t 
where id in (select id from #testtable
27 май 11, 17:02    [10721603]     Ответить | Цитировать Сообщить модератору
 Re: Выборка с удаленного сервера  [new]
Glory
Member

Откуда:
Сообщений: 104751
выборка
В чём причина?

В том, что это разные запросы ?
27 май 11, 17:05    [10721633]     Ответить | Цитировать Сообщить модератору
 Re: Выборка с удаленного сервера  [new]
выборка
Guest
Разные то они разные, но по сути они одинаковые.

Тогда подругому поставлю вопрос.

Как сделать так чтобы запрос отрабатывал быстро с использованием временной таблицы, откуда будет братся список Id?
27 май 11, 17:08    [10721658]     Ответить | Цитировать Сообщить модератору
 Re: Выборка с удаленного сервера  [new]
Glory
Member

Откуда:
Сообщений: 104751
выборка
Разные то они разные, но по сути они одинаковые.


Они и по сути разные. Потому что разное количество таблиц и условий
27 май 11, 17:11    [10721674]     Ответить | Цитировать Сообщить модератору
 Re: Выборка с удаленного сервера  [new]
Glory
Member

Откуда:
Сообщений: 104751
выборка
Как сделать так чтобы запрос отрабатывал быстро с использованием временной таблицы, откуда будет братся список Id?

Проанализировать план выполнения для начала
27 май 11, 17:12    [10721679]     Ответить | Цитировать Сообщить модератору
 Re: Выборка с удаленного сервера  [new]
выборка
Guest
SELECT * from dias.work5nt.dbo.table1 t 
where id in (select id from #testtable1)

выдает вот такое

К сообщению приложен файл. Размер - 16Kb
27 май 11, 17:30    [10721775]     Ответить | Цитировать Сообщить модератору
 Re: Выборка с удаленного сервера  [new]
Glory
Member

Откуда:
Сообщений: 104751
Так с вашего "Удаленного запроса" сколько записей прокачивается по сети ?
Судя по толщине стрелки(ибо текствого плана вы не привели), довольно много
27 май 11, 17:33    [10721789]     Ответить | Цитировать Сообщить модератору
 Re: Выборка с удаленного сервера  [new]
выборка
Guest
А как организовать чтобы записи не прокачивались по сети или это особенность удаленной работы с сервером (использование временных таблиц или таблиц локальных, приводит к полной перекачке данных с удаленного сервера и уже потом всё это джойнится) ?
27 май 11, 17:49    [10721892]     Ответить | Цитировать Сообщить модератору
 Re: Выборка с удаленного сервера  [new]
выборка
Guest
План запроса:
Rows	Executes	StmtText	StmtId	NodeId	Parent	PhysicalOp	LogicalOp	Argument	DefinedValues	EstimateRows	EstimateIO	EstimateCPU	AvgRowSize	TotalSubtreeCost	OutputList	Warnings	Type	Parallel	EstimateExecutions
22	1	select o.OperationID, o.resourceid, o.chartype, o.Operdate, o.qty, o.qtybs, o.comment   --into #tempOperations  from dias1.work5nt.dbo.toperpart o  where o.operationid in (select operationid from ##tempOperationID1)	1	1	0	NULL	NULL	NULL	NULL	4434189	NULL	NULL	NULL	14878,21	NULL	NULL	SELECT	0	NULL
22	1	  |--Merge Join(Inner Join, MERGE:([tempdb].[dbo].[##tempOperationID1].[OperationID])=([dias1].[work5nt].[dbo].[toperpart].[OperationID]), RESIDUAL:([dias1].[work5nt].[dbo].[toperpart].[OperationID] as [o].[OperationID]=[tempdb].[dbo].[##tempOperationID1].[OperationID]))	1	3	1	Merge Join	Inner Join	MERGE:([tempdb].[dbo].[##tempOperationID1].[OperationID])=([dias1].[work5nt].[dbo].[toperpart].[OperationID]), RESIDUAL:([dias1].[work5nt].[dbo].[toperpart].[OperationID] as [o].[OperationID]=[tempdb].[dbo].[##tempOperationID1].[OperationID])	NULL	4,434189E+07	0	97,55777	192	14878,21	[dias1].[work5nt].[dbo].[toperpart].[OperationID], [dias1].[work5nt].[dbo].[toperpart].[CharType], [dias1].[work5nt].[dbo].[toperpart].[ResourceID], [dias1].[work5nt].[dbo].[toperpart].[OperDate], [dias1].[work5nt].[dbo].[toperpart].[Qty], [dias1].[work5nt].[dbo].[toperpart].[QtyBs], [dias1].[work5nt].[dbo].[toperpart].[Comment]	NULL	PLAN_ROW	0	1
11	1	       |--Sort(DISTINCT ORDER BY:([tempdb].[dbo].[##tempOperationID1].[OperationID] ASC))	1	4	3	Sort	Distinct Sort	DISTINCT ORDER BY:([tempdb].[dbo].[##tempOperationID1].[OperationID] ASC)	NULL	11	0,01126126	0,0001593799	16	0,01545548	[tempdb].[dbo].[##tempOperationID1].[OperationID]	NULL	PLAN_ROW	0	1
11	1	       |    |--Table Scan(OBJECT:([tempdb].[dbo].[##tempOperationID1]))	1	5	4	Table Scan	Table Scan	OBJECT:([tempdb].[dbo].[##tempOperationID1])	[tempdb].[dbo].[##tempOperationID1].[OperationID]	11	0,003865741	0,0001691	16	0,004034841	[tempdb].[dbo].[##tempOperationID1].[OperationID]	NULL	PLAN_ROW	0	1
0	0	       |--Compute Scalar(DEFINE:([dias1].[work5nt].[dbo].[toperpart].[OperationID]=[dias1].[work5nt].[dbo].[toperpart].[OperationID] as [o].[OperationID], [dias1].[work5nt].[dbo].[toperpart].[CharType]=[dias1].[work5nt].[dbo].[toperpart].[CharType] as [o].[CharType], [dias1].[work5nt].[dbo].[toperpart].[ResourceID]=[dias1].[work5nt].[dbo].[toperpart].[ResourceID] as [o].[ResourceID], [dias1].[work5nt].[dbo].[toperpart].[OperDate]=[dias1].[work5nt].[dbo].[toperpart].[OperDate] as [o].[OperDate], [dias1].[work5nt].[dbo].[toperpart].[Qty]=[dias1].[work5nt].[dbo].[toperpart].[Qty] as [o].[Qty], [dias1].[work5nt].[dbo].[toperpart].[QtyBs]=[dias1].[work5nt].[dbo].[toperpart].[QtyBs] as [o].[QtyBs], [dias1].[work5nt].[dbo].[toperpart].[Comment]=[dias1].[work5nt].[dbo].[toperpart].[Comment] as [o].[Comment]))	1	6	3	Compute Scalar	Compute Scalar	DEFINE:([dias1].[work5nt].[dbo].[toperpart].[OperationID]=[dias1].[work5nt].[dbo].[toperpart].[OperationID] as [o].[OperationID], [dias1].[work5nt].[dbo].[toperpart].[CharType]=[dias1].[work5nt].[dbo].[toperpart].[CharType] as [o].[CharType], [dias1].[work5nt].[dbo].[toperpart].[ResourceID]=[dias1].[work5nt].[dbo].[toperpart].[ResourceID] as [o].[ResourceID], [dias1].[work5nt].[dbo].[toperpart].[OperDate]=[dias1].[work5nt].[dbo].[toperpart].[OperDate] as [o].[OperDate], [dias1].[work5nt].[dbo].[toperpart].[Qty]=[dias1].[work5nt].[dbo].[toperpart].[Qty] as [o].[Qty], [dias1].[work5nt].[dbo].[toperpart].[QtyBs]=[dias1].[work5nt].[dbo].[toperpart].[QtyBs] as [o].[QtyBs], [dias1].[work5nt].[dbo].[toperpart].[Comment]=[dias1].[work5nt].[dbo].[toperpart].[Comment] as [o].[Comment])	[dias1].[work5nt].[dbo].[toperpart].[OperationID]=[dias1].[work5nt].[dbo].[toperpart].[OperationID] as [o].[OperationID], [dias1].[work5nt].[dbo].[toperpart].[CharType]=[dias1].[work5nt].[dbo].[toperpart].[CharType] as [o].[CharType], [dias1].[work5nt].[dbo].[toperpart].[ResourceID]=[dias1].[work5nt].[dbo].[toperpart].[ResourceID] as [o].[ResourceID], [dias1].[work5nt].[dbo].[toperpart].[OperDate]=[dias1].[work5nt].[dbo].[toperpart].[OperDate] as [o].[OperDate], [dias1].[work5nt].[dbo].[toperpart].[Qty]=[dias1].[work5nt].[dbo].[toperpart].[Qty] as [o].[Qty], [dias1].[work5nt].[dbo].[toperpart].[QtyBs]=[dias1].[work5nt].[dbo].[toperpart].[QtyBs] as [o].[QtyBs], [dias1].[work5nt].[dbo].[toperpart].[Comment]=[dias1].[work5nt].[dbo].[toperpart].[Comment] as [o].[Comment]	4,434189E+07	0	14780,64	192	14780,64	[dias1].[work5nt].[dbo].[toperpart].[OperationID], [dias1].[work5nt].[dbo].[toperpart].[CharType], [dias1].[work5nt].[dbo].[toperpart].[ResourceID], [dias1].[work5nt].[dbo].[toperpart].[OperDate], [dias1].[work5nt].[dbo].[toperpart].[Qty], [dias1].[work5nt].[dbo].[toperpart].[QtyBs], [dias1].[work5nt].[dbo].[toperpart].[Comment]	NULL	PLAN_ROW	0	1
34996428	1	            |--Remote Query(SOURCE:(dias1), QUERY:(SELECT "Tbl1001"."OperationID" "Col1024","Tbl1001"."CharType" "Col1025","Tbl1001"."ResourceID" "Col1026","Tbl1001"."OperDate" "Col1027","Tbl1001"."Qty" "Col1029","Tbl1001"."QtyBs" "Col1030","Tbl1001"."Comment" "Col1036" FROM "work5nt"."dbo"."toperpart" "Tbl1001" ORDER BY "Col1024" ASC))	1	7	6	Remote Query	Remote Query	SOURCE:(dias1), QUERY:(SELECT "Tbl1001"."OperationID" "Col1024","Tbl1001"."CharType" "Col1025","Tbl1001"."ResourceID" "Col1026","Tbl1001"."OperDate" "Col1027","Tbl1001"."Qty" "Col1029","Tbl1001"."QtyBs" "Col1030","Tbl1001"."Comment" "Col1036" FROM "work5nt"."dbo"."toperpart" "Tbl1001" ORDER BY "Col1024" ASC)	NULL	4,434189E+07	0	14780,64	192	14780,64	[dias1].[work5nt].[dbo].[toperpart].[OperationID], [dias1].[work5nt].[dbo].[toperpart].[CharType], [dias1].[work5nt].[dbo].[toperpart].[ResourceID], [dias1].[work5nt].[dbo].[toperpart].[OperDate], [dias1].[work5nt].[dbo].[toperpart].[Qty], [dias1].[work5nt].[dbo].[toperpart].[QtyBs], [dias1].[work5nt].[dbo].[toperpart].[Comment]	NULL	PLAN_ROW	0	1
27 май 11, 17:53    [10721919]     Ответить | Цитировать Сообщить модератору
 Re: Выборка с удаленного сервера  [new]
Glory
Member

Откуда:
Сообщений: 104751
34 996 428 записей вы думаете должны быстро прокачаться через сеть на ваш сервер ?
27 май 11, 18:00    [10721960]     Ответить | Цитировать Сообщить модератору
 Re: Выборка с удаленного сервера  [new]
выборка
Guest
Я уже понял изначально что данные прокачиваются

Как заставить их не прокачиватся?
27 май 11, 18:06    [10722008]     Ответить | Цитировать Сообщить модератору
 Re: Выборка с удаленного сервера  [new]
Glory
Member

Откуда:
Сообщений: 104751
выборка
Я уже понял изначально что данные прокачиваются

Как заставить их не прокачиватся?

А как по другому ваш сервер сравнит локальную таблицу с удаленной ?
Закачает ее на удаленный сервер и скажет - а вот выполни сравнение и верни результаты ?
27 май 11, 18:08    [10722020]     Ответить | Цитировать Сообщить модератору
 Re: Выборка с удаленного сервера  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
выборка
сервера S1 и S2
Пичаль.
Для перегонки данных да, для запросов - нет.

Тут нужно подойти архитектурно. Какие задачи решаете?
Если это редкий и малый запрос, то придётся поизвращаться динамикой. Если системный подход, менять архитектуру, а способов куча.
Перенос / синхронизация. Синхронно (call) / Асинхронно. Постфактум / Заранее. Перенос - данных / логики. И разными подходами / технологиями / уловками.
Какой выберете и как интерфейсы расставите так и полетит. Один из способов Glory уже написал.
27 май 11, 19:51    [10722630]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить