заказать подсказку для openquery? - PullRequest
2 голосов
/ 17 августа 2011

Мне необходимо периодически выполнять следующий 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 может быть большим.

1 Ответ

1 голос
/ 17 августа 2011

Я думаю, что таблица - лучший путь, потому что тогда вы можете создавать любые индексы, которые вам нужны, но нет причины, по которой она должна быть временной;почему бы не создать постоянный промежуточный стол?Локальное объединение с использованием локальных индексов, вероятно, будет гораздо более эффективным, чем объединение результатов удаленного запроса, хотя единственный способ узнать наверняка - проверить его и посмотреть.

Если вы беспокоитесь оБольшое количество строк, вы можете посмотреть только копирование на новые или измененные строки.Если в таблице Oracle уже есть столбцы для времени создания и обновления строк, это будет довольно просто.

В качестве альтернативы, вы можете рассмотреть возможность использования служб SSIS вместо запланированного задания.Я понимаю, что если вы еще не используете SSIS, возможно, вы не захотите тратить время на его изучение, но это очень мощный инструмент, предназначенный для перемещения больших объемов данных в MSSQL.Вы должны создать пакет со следующим рабочим процессом:

  1. Удалить существующие строки из промежуточной таблицы (только если вы не можете заполнить их постепенно)
  2. Скопировать данные из Oracle
  3. Выполнить инструкцию MERGE
...