2016-10-21 4 views
0

У меня есть курсор в моем пакете, который использует удаленные ссылки БД. Я хочу оптимизировать производительность пакета. Итак, я хотел начать с оптимизации курсора.Как оптимизировать сложный распределенный запрос?

Я дам некоторую информацию для анализа,

  • Там нет локальных таблиц в запросе только удаленной БД ссылки.
  • Запрос курсора использует 6 удаленных связей БД и выполняет операции объединения .
  • Все DBlinks указывают на ту же БД, но на разные таблицы.
  • SELECT, не имеет каких-либо агрегированных операций и имеет только функции NVL для нескольких столбцов
  • Около 90 Столбцы выбирают

Структура запроса является

SELECT (SOME 90 COLUMNS) 
FROM [email protected]_one m1, 
     [email protected]_one m2, 
     [email protected]_one pa, 
     [email protected]_one pb, 
     [email protected]_one pc, 
     [email protected]_one xa, 
    (SELECT 
     geo.country, 
     geo.state 
    FROM [email protected]_one geo) geo WHERE (m1.master_key = m2.master_key) AND 
    (pc.weather_key = m2.cloud_key) AND 
(m1.order_type_id = pa.weather_key) AND 
(pa.weather_key = pb.weather_key) AND 
(m2.food_store_key = xa.food_store_key) AND 
((nvl(m2.shop_key ,121)) = xa.store_key) AND 
(geo.country (+) = m1.country) AND 
(xa.food_type NOT IN ('COLD')) AND 
(m2.food_type_code NOT IN ('WINTER') 
    OR m2.price_per_portion !=0) AND 
((m1.last_purchase_date >= TRUNC(SYSDATE-10) - 1/48 And m1.last_purchase_date <= TRUNC(SYSDATE)) 
Or (m2.last_purchase_date >= TRUNC(SYSDATE-10) - 1/48 And m2.last_purchase_date <= TRUNC(SYSDATE))); 

Это не фактический запрос, но структура аналогична.

+0

Пожалуйста отправьте запрос! –

+3

Почему у вас есть 4 отдельные ссылки на базы данных, которые все подключаются к одной базе данных? Вы имеете в виду, что у вас есть 4 удаленных объекта, на которые каждый ссылается, используя одну ссылку базы данных? Можете ли вы коснуться удаленных систем? Есть ли какая-либо надежда на повторную передачу данных в вашу локальную систему до ее обработки. –

+0

@JustinCave Извините. Произошла ошибка ... все шесть подключены к одной базе данных. Сейчас я отредактирую вопрос. –

ответ

1

Прежде всего, попробуйте найти горшок с бутылкой вашего запроса. Если проблема только с выполнением запроса из удаленной таблицы вы можете использовать намек/* + DRIVING_SITE (...) */https://docs.oracle.com/cd/B28359_01/server.111/b28286/sql_elements006.htm#BABEGIJC И оракул будет пытаться выполнить на базе

локальной, удаленной
+0

Использование подсказок хороши, но все таблицы взяты из удаленных связей БД. –

+0

Вот почему я говорю о 'DRIVING SITE', если вы используете его, hint oracle попытается выполнить запрос (make join, sorts и т. Д.) В удаленной базе данных и вернуть к вам результат. В общем, быстрее, чем получить данные из удаленной базы данных и выполнить запрос на текущем сайте –

+0

в порядке. так что вы хотите сказать, я могу дать подсказку, как/* + DRIVING_SITE (m1, m2, pa, pb, pc, xa) */ не так ли? –

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