2015-04-30 3 views
0

Код:OpenQuery из SQL Server 2008R2 для Oracle 11g Медленный, но же запуска запроса на сервере Oracle быстро

WITH GTransNums 
AS (
SELECT /*+ INDEX (GTRANS_DEFS_24) */ gtrans_num 
FROM pro.gtrans_defs 
INNER JOIN pro.loc_defs ON (
     loc_defs.loc_num = gtrans_defs.gdest_num 
     AND loc_defs.loc_type = '' JLP '' 
     ) 
WHERE gdest_num != 99999 
) 
SELECT /*+ INDEX (GTRANS_ITEMS_1) */ Gtrans_items.season 
,Gtrans_items.sty_num 
,Gtrans_items.sty_qual 
,Gtrans_items.bf_mat_char_val 
FROM pro.gtrans_items 
WHERE gtrans_num IN (
    SELECT gtrans_num 
    FROM GTransNums 
    ) 
GROUP BY Gtrans_items.season 
,Gtrans_items.sty_num 
,Gtrans_items.sty_qual 
,Gtrans_items.bf_mat_char_val 

код вставил выше работает очень быстро при запуске непосредственно на сервере Oracle, но когда мы закончим эти в Openquery на Microsoft SQL Server он просто зависает. Он оттягивает около 40000 строк.

Мы оценили форматирование Openquery, когда оно попадает в ящик Oracle, и все они выглядят точно так же, как при непосредственном запуске.

Openquery запускается с очень большими разрешениями на боксы Microsoft SQL Server и Oracle.

Поставщик: Oracle Provider для OLE DB

Мы создали вид из кода на поле Oracle и запрашивать мнение через OpenQuery из Microsoft SQL Server, и это было супер быстро.

Возможные мысли:

  • OpenQuery не имеет доступа ни индексы, статистические данные или ключи при передаче запроса в Oracle.
  • Причина возникновения проблемы связана с драйвером/диспетчером соединений. Мы пробовали драйвер ODBC без успеха.
  • Некоторые странные сети, которые отправляют запрос вокруг домов. Невозможно проверить это, так как в сети запрещены пакеты снифферов. Обе коробки размещены на одном сайте.

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

Любая помощь по этому вопросу будет оценена, и если вам нужна дополнительная информация, пожалуйста, просто спросите.

ответ

0

Раньше я делал подобные вещи с SQLServer 2008 и Oracle 8. У меня никогда не было хорошей производительности.

Запросы были безупречными в отношении Oracle - в конце концов, Oracle запускает их, а не драйвер. Что происходит, так это то, что сетевые круизы убивают его. Путь запроса и данные принять это:

  1. Клиент посылает запрос на SQLServer
  2. SQLServer отправляет запрос на сервер Oracle
  3. Сервер Oracle выполняет запрос.
  4. Oracle Сервер отправляет запрос SQLServer
  5. SQLServer отправляет запрос клиента

Я думаю, что шаг 5 фактически не начинается, пока все данные не были получены от стадии 4 - что имеет смысл, когда вы думаете он может использоваться в соединении с таблицами SQLServer.

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

Кроме того, если полный набор результатов хранится на SQL Server, тогда он будет использовать больше памяти, чем обычно делает запрос.SQL Server начнет отправлять данные клиенту, как только он будет доступен. Вы можете увидеть это в SSMS, если вы выполняете запрос, который занимает больше нескольких секунд: результаты отображаются, пока таймер запроса в строке состояния внизу справа все еще работает. Таким образом, SQL Server может назначить дополнительную память, вызывающую возможную подкачку и т. Д.

Это довольно полезная функция, но я никогда не видел ее быстрой.

+0

Привет, Саймон, благодарю вас за ответ. Причина, по которой я поднял это, - это то, что я никогда не видел, чтобы openquery выполнялся так сильно по сравнению с «изначально» запуска SQL. –

+0

..... я и команда недоумевают относительно несоответствия в производительности. Производительность, которую мы получили до сих пор, была хорошей из openquery. Это нас озадачивает. Любые дополнительные титры будут приветствоваться. Спасибо Danny –

+0

У меня действительно не так много, чтобы внести свой вклад. Единственные раз, когда я это делал, это несколько разовых, где это было проще, чем альтернативы, и однажды, когда я попытался присоединиться к набору таблиц Oracle к набору таблиц SQL в качестве долгосрочного решения требования , В конце концов я не использовал его, поскольку он был слишком медленным. Я не помню, чтобы одноразовые были особенно медленными, но потом я побежал один или два раза. Вы можете попробовать включить SQL Profiler при запуске и посмотреть, что произойдет, когда; вы, очевидно, сделали что-то похожее на конец Oracle: связать их вместе может помочь. Приветствия - –