Мне необходимо периодически выполнять следующий SQL ( SQL Server 2008 ) в запланированном задании. План запроса показывает, что 53% стоимости составляет sort после того, как данные извлечены с сервера оракула. Однако я заказал данные в openquery. Как заставить запрос не сортировать при объединении слиянием?
merge target as t
using (select * from openquery(oracle, '
select * from t1 where UpdateTime > ''....'' order by k1, k2')
) as s on s.k1=t.k1 and s.k2=t.K2 -- the clustered PK of "target" is K1,k2
when matched then ......
when not matched then ......
Есть ли что-то вроде bulk insert
"with (order( { column [ ASC | DESC ] } [ ,...n ] ))
"? поможет ли это улучшить план запроса оператора merge
, если он существует?
Если в таблице оракула уже есть PK на K1, K2, будет ли лучше использовать oracle.db.owner.tablename
в качестве цели? (SQL Server будет вычислять индекс из метаинформации оракула?)
Или лучшее, что я могу сделать, - это сохранить данные оракула в локальной временной таблице и создать кластерный первичный ключ на K1, k2? Я пытаюсь избежать создания временной таблицы, потому что иногда возвращаемый набор данных openquery может быть большим.