SQL 2005 - чрезвычайно медленно подключается к серверу Oracle запросы - PullRequest
7 голосов
/ 26 августа 2010

На моем сервере SQL 2005 у меня есть связанный сервер, соединяющийся с Oracle через поставщика OraOLEDB.Oracle.

Если я запускаю запрос через 4-компонентный идентификатор, например, так:

SELECT * FROM [SERVER]...[TABLE] WHERE COLUMN = 12345

Это займет больше минуты.Если я выполню один и тот же запрос следующим образом:

SELECT * FROM OPENQUERY(SERVER, 'SELECT * FROM TABLE WHERE COLUMN = 12345')

Он завершится мгновенно.Есть ли где-то параметр, который я пропускаю, чтобы первый запрос выполнялся в течение приемлемого периода времени?Или я застрял с помощью openquery?

1 Ответ

12 голосов
/ 29 сентября 2010

В вашем первом примере с использованием «точечной» нотации используется клиентский движок курсора, и большинство вещей оценивается локально. Если вы выбираете из большой таблицы и используете предложение WHERE, записи будут извлекаться локально из удаленной базы данных. После того, как данные были переданы через связанный сервер, только тогда предложение WHERE применяется локально. Часто эта последовательность является ударом производительности. Индексы на удаленной базе данных в основном оказываются бесполезными.

Альтернативно, когда вы используете OPENQUERY, SQL Server отправляет оператор sql в целевую базу данных для обработки. Во время обработки любые индексы на таблицах используются. Кроме того, предложение where применяется на стороне Oracle перед отправкой набора результатов обратно на SQL Server.

По моему опыту, за исключением самых простых запросов, OPENQUERY даст вам лучшую производительность.

Я бы рекомендовал использовать OpenQuery для всего по вышеуказанным причинам.

Одна из болевых точек при использовании OpenQuery, с которой вы, возможно, уже сталкивались, - это одинарные кавычки. Если строка sql, отправляемая на удаленную базу данных, требует одинарных кавычек вокруг строки или даты, они должны быть экранированы. В противном случае они непреднамеренно завершают строку sql.

Вот шаблон, который я использую всякий раз, когда имею дело с переменными в операторе openquery для связанного сервера, чтобы решить проблему с одинарными кавычками:

DECLARE @UniqueId int 
, @sql varchar(500) 
, @linkedserver varchar(30) 
, @statement varchar(600) 

SET @UniqueId = 2 

SET @linkedserver = 'LINKSERV' 
SET @sql = 'SELECT DummyFunction(''''' + CAST(@UniqueId AS VARCHAR(10))+ ''''') FROM DUAL' 
SET @statement = 'SELECT * FROM OPENQUERY(' + @linkedserver + ', '  
SET @Statement = @Statement + '''' +  @SQL + ''')' 
EXEC(@Statement) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...