2016-03-01 3 views
0

Скажем, у меня есть вопрос, как это:Oracle Linked Server слишком медленно

create table #Incident (id int) 
insert into #Incident values (1) 

    SELECT INC_EVNT_URN,INC_CR_DTE FROM OPENQUERY(incidents, 
    'select * from incident') 

Say инцидент имеет 800 миллионов записей в нем, и я просто хочу, чтобы получить один из них. #Incident хранится в таблице SQL Server. Связанный с инцидентами сервер - это сервер Oracle.

Я не могу это сделать:

select * from #Incident INNER JOIN (
SELECT ID FROM OPENQUERY(incidents, 
'select * from incident') 
) AS Incident ON #Incident.ID=Incidentid 

Причина, почему я не могу этого сделать, потому что это занимает около один день, чтобы работать, потому что он первый получает все случаи из базы данных Oracle, прежде чем найти тот, который я требую. Есть ли способ реорганизовать запрос, чтобы сделать его более эффективным?

ответ

1

Это на самом деле меньше проблем с Oracle, чем SQL Server. OPENQUERY запускает SQL-скрипт, указанный во втором параметре, непосредственно против связанной базы данных и возвращает результаты. Таким образом, «связанный сервер» действительно является неправильным, поскольку вы действительно просто делаете изолированный вызов базы данных, а не ссылаетесь на посторонний объект в своем текущем плане запросов. Поэтому каждый раз, когда вы ссылаетесь

OPENQUERY(incidents,'select * from incident') 

вы тянете во всех 800 миллионов записей этого инцидента таблицы в кэш, а затем выполнение запроса SQL Server против этой огромной временной таблицы.

Чтобы избежать этого, вы захотите сузить запрос, отправляемый на сервер Oracle, чтобы анализатор Oracle мог выполнять более чистый план. Посмотрите на этот link, который описывает проходящие переменные в OPENQUERY.

Pass Основные ценности

Когда основной оператор Transact-SQL, как известно, но вы должны пройти в одной или более конкретных значений, используйте код, который похож на следующие пробы:

DECLARE @TSQL varchar(8000), @VAR char(2) 
     SELECT @VAR = 'CA' 
     SELECT @TSQL = 'SELECT * FROM OPENQUERY(MyLinkedServer,''SELECT * FROM pubs.dbo.authors WHERE state = ''''' + @VAR + ''''''')' 
     EXEC (@TSQL) 

Используя эту информацию, я хотел бы попробовать переходящую в инциденте ID, что вы ищете. Затем вся работа происходит в Oracle, и вы только отталкиваете нужные вам данные (в отличие от всей таблицы).

Смежные вопросы