присоединяйся слишком долго - PullRequest
1 голос
/ 28 октября 2019

У меня есть запрос, который выполняется слишком долго, и я думаю, что это не нормально. Я предполагаю, что некоторые подсказки / оптимизатор помогут, но я не знаю много об этом. Так что любая помощь будет оценена.

В основном код:

with datasetA as (),
     datasetB as (),
     datasetC as ()
select a.*
from datasetA a
     join datasetB b on b.key = a.key
     join datasetC c on c.key = a.key;

Каждый из подзапросов (набор данных A, B, C) занимает всего 1 секунду, но объединение занимает 30 минут ... На 100% уверен, что это соединение 1 к 1, наборы данных маленькие (например, 1000 строк), а конечный результат тоже мал.

Ответы [ 3 ]

1 голос
/ 28 октября 2019

Вероятно, вам не хватает индексов

Перейдите по ссылке ниже, и она должна вам помочь. Это должно сократить общее время выполнения запроса как минимум в 100x

https://www.w3schools.com/sql/sql_create_index.asp

Кроме того, если бы вы могли публиковать результаты из SHOW INDEX FROM table1, SHOW INDEX из table2 мы могли бы определить пропущенныеиндексы

0 голосов
/ 29 октября 2019

Oracle, вероятно, применяет неверное преобразование оптимизатора, превращая три запроса, которые выполняются быстро независимо, в один запрос, который выполняется медленно. Самый простой способ отключить эти преобразования и убедиться, что каждый запрос выполняется сам по себе, - добавить на первый взгляд бесполезное условие ROWNUM, например:

with datasetA as (... where rownum >= 1),
     datasetB as (... where rownum >= 1),
     datasetC as (... where rownum >= 1)
select a.*
from datasetA a
     join datasetB b on b.key = a.key
     join datasetC c on c.key = a.key;

Псевдостолбец ROWNUMпредназначался для составления отчетов топ-N, что не сработало бы, если бы Oracle переписывал каждый запрос. Таким образом, оптимизатор оставляет эти подзапросы в покое, даже если условие логически избыточно.

Выше приведен простой способ решения насущной проблемы, но не обязательно лучший. Возможно, вы захотите выяснить, почему Oracle выбирает плохие преобразования;плохая статистика оптимизатора часто является виновником. Поиск основной причины может помочь решить другие проблемы, но может быть трудным процессом.

Если вам интересно почему Oracle делает это, преобразования оптимизатора часто бывают полезными. Преобразования, такие как слияние представлений и передача предикатов, позволяют Oracle применять знания из одной части запроса к другой, что часто значительно улучшает время выполнения. Например, представьте запрос типа select * from (select * from huge_table) where primary_key = 1;. Мы, конечно, хотели бы, чтобы этот предикат был вставлен в подзапрос, поэтому Oracle не нужно читать всю таблицу, чтобы получить только одну строку.

0 голосов
/ 28 октября 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...