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

Откуда: Приморье
Сообщений: 535
Добрый день. Ранее никогда не имел дела со связанными серверами, но вот теперь понадобилось.
В общем у меня 2 вопроса:
1. Каково отличие в производительности SELECT OPENQUERY и обычного SELECT * FROM [linked-server].[DB].[dbo].[Table] ?
2. Правильно ли в одной процедуре осуществлять изменение данных в таблице основного сервера и делать выборку из таблицы на прилинкованном сервере, причем таблица "тяжелая" ? Не будет ли лочиться БД основного сервера?
4 окт 12, 16:45    [13269197]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запросов с linked-cервера  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
RAMZEZ II
1. Каково отличие в производительности SELECT OPENQUERY и обычного SELECT * FROM [linked-server].[DB].[dbo].[Table] ?
Разница в том что для 1-го даже тупой провайдер будет работать, а для 2-го нужно чтобы провайдер поддерживал MetaData (получать список таблиц, колонок ...)
Первый делает ровно то что там написано, второй - зависит от провайдера.
Первый неудобно использовать и возможно даже не получится - ибо запрос константа. Во втором для достаточно умного провайдера может делаться правильный JOIN по индексу согласно полученному значению. Но это очень не надёжно.

RAMZEZ II
2. Правильно ли в одной процедуре осуществлять изменение данных в таблице основного сервера и делать выборку из таблицы на прилинкованном сервере, причем таблица "тяжелая" ? Не будет ли лочиться БД основного сервера?
Лочится в транзакции будет палюбэ, делаете запрос к линку или что-то другое, вот другое дело это оно будет долго или нет и готовы ли этим жертвовать (всегда чем-то жертвуешь).

С запросами нужно осторожно, ибо очень часто вся табла с линкованого приходит, а потом делается локальный JOIN. Локировки на линкованном соответствующие и зависит от настроек линка.
4 окт 12, 16:56    [13269347]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запросов с linked-cервера  [new]
Slava_Nik
Member

Откуда: из России
Сообщений: 901
RAMZEZ II,
зависит так же и к чему линковаться(MS SQL, Mysql и т.д)
4 окт 12, 17:01    [13269392]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запросов с linked-cервера  [new]
RAMZEZ II
Member

Откуда: Приморье
Сообщений: 535
Mnior, мне нужно получить некую информацию с линка, а потом ее заапдейтить на мою таблицу. И при этом в это процедуре у меня еще идет UPDATE другой моей таблицы. Вот думаю может вынести операции с линком в отдельный запрос или даже создать отдельный коннекшн?
4 окт 12, 17:02    [13269397]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запросов с linked-cервера  [new]
RAMZEZ II
Member

Откуда: Приморье
Сообщений: 535
Slava_Nik, тот и тот MS SQL
4 окт 12, 17:02    [13269402]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запросов с linked-cервера  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
RAMZEZ II
Вот думаю может вынести операции с линком в отдельный запрос или даже создать отдельный коннекшн
Очень правильно думаете. Лучше минимизировать работу с linked, т.е. не делать 100500 запросов к нему, хотя всё можно свестить к одному в котором (уже на нём самом) все и сделается.

Если вы говорите - создать соединение не на SQL, а на клиенте, то это зависит от задачи.

MSSQL с другим MSSQL лучше всего взаимодействует. Главное правильно сделать link.
4 окт 12, 18:36    [13270083]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запросов с linked-cервера  [new]
DNAsh
Member

Откуда: Ukraine
Сообщений: 11
RAMZEZ II
Mnior, мне нужно получить некую информацию с линка, а потом ее заапдейтить на мою таблицу. И при этом в это процедуре у меня еще идет UPDATE другой моей таблицы. Вот думаю может вынести операции с линком в отдельный запрос или даже создать отдельный коннекшн?

Совсем не обязательно, можно все развести по своим транзакциям и даже конекшнам (при реализации в сп). При вытягивании с линка на "далеко" удаленном сервере, с которым был слабый коннект, заметилась тендеция, что использование OPENSOURCE/OPENQUERY убыстряло работу на порядки по сравнению с использованием в запросе линкованного сервера, что ест-но, когда каждая строчка данных не передается со своим пакетом, а передается все скопом (в зависимости от настроек сетевого пакета сиквела) во временную таблицу, с которой потом можно локально на сервере проделывать необходимые операции.
При использовании в локальной сети и между виртуалками на одном хосте - разница не существенная.


"Лучше знать лишнее, чем ничего не знать" (с)

Сообщение было отредактировано: 5 окт 12, 10:25
4 окт 12, 18:50    [13270139]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запросов с linked-cервера  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
DNAsh
RAMZEZ II
Mnior, мне нужно получить некую информацию с линка, а потом ее заапдейтить на мою таблицу. И при этом в это процедуре у меня еще идет UPDATE другой моей таблицы. Вот думаю может вынести операции с линком в отдельный запрос или даже создать отдельный коннекшн?

Совсем не обязательно, можно все развести по своим транзакциям и даже конекшнам (при реализации в сп).
в сп можно создать 2 независимые параллельно выполняющиеся транзакции? Да еще и в разных конекшенах?
4 окт 12, 19:26    [13270281]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запросов с linked-cервера  [new]
DNAsh
Member

Откуда: Ukraine
Сообщений: 11
Mind
DNAsh
пропущено...

Совсем не обязательно, можно все развести по своим транзакциям и даже конекшнам (при реализации в сп).
в сп можно создать 2 независимые параллельно выполняющиеся транзакции? Да еще и в разных конекшенах?


Ну например так:
CREATE PROCEDURE multi_transactions
@conn_str1 nvarchar(150), @conn_str2 nvarchar(150)
AS
BEGIN
	BEGIN TRANSACTION one;
BEGIN TRY
    SELECT *
    FROM OPENDATASOURCE('SQLNCLI', @conn_str1).db1.schema.tab1
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION one;

END CATCH

IF @@TRANCOUNT > 0
    COMMIT TRANSACTION one;


BEGIN TRANSACTION two;
BEGIN TRY
      SELECT *
    FROM OPENDATASOURCE('SQLNCLI', @conn_str2).db1.schema.tab1
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION two;
END CATCH

IF @@TRANCOUNT > 0
    COMMIT TRANSACTION two;
END
GO
4 окт 12, 19:36    [13270307]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запросов с linked-cервера  [new]
DNAsh
Member

Откуда: Ukraine
Сообщений: 11
[quot DNAsh]
Mind
пропущено...
в сп можно создать 2 независимые параллельно выполняющиеся транзакции? Да еще и в разных конекшенах?


Но ест-но не параллельно, последовательно...
4 окт 12, 19:38    [13270311]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запросов с linked-cервера  [new]
RAMZEZ II
Member

Откуда: Приморье
Сообщений: 535
DNAsh
Mind
пропущено...
в сп можно создать 2 независимые параллельно выполняющиеся транзакции? Да еще и в разных конекшенах?


Ну например так:
CREATE PROCEDURE multi_transactions
@conn_str1 nvarchar(150), @conn_str2 nvarchar(150)
AS
BEGIN
	BEGIN TRANSACTION one;
BEGIN TRY
    SELECT *
    FROM OPENDATASOURCE('SQLNCLI', @conn_str1).db1.schema.tab1
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION one;

END CATCH

IF @@TRANCOUNT > 0
    COMMIT TRANSACTION one;


BEGIN TRANSACTION two;
BEGIN TRY
      SELECT *
    FROM OPENDATASOURCE('SQLNCLI', @conn_str2).db1.schema.tab1
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION two;
END CATCH

IF @@TRANCOUNT > 0
    COMMIT TRANSACTION two;
END
GO


Смотрите, я стал использовать вместо мета-данных запрос через OPENQUERY и одновременно разбил на отдельные транзакции T1, T2 и T3, но в одной процедуре и локи слетели моментально и значительно быстрее отрабатывает запрос. Всем благодарен за помощь, удачи!
5 окт 12, 03:10    [13271136]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить