PLSQL: Является ли хорошей идеей иметь дело с временными таблицами в сохраненной процедуре plsql? - PullRequest
0 голосов
/ 04 марта 2019

Предполагается, что это будет обсуждение.

У меня есть таблица результатов, сгенерированная из слегка сложного запроса (несколько предложений Joins и WHERE), которым я буду манипулировать / ссылаться несколько раз в процедуре по ходу работы.

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

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

У меня тоже такая же проблема, поэтому я разбиваю запрос на несколько частей и пользовательскую таблицу GTT.Также проверьте, можете ли вы использовать предложение WITH при нарушении запроса.Это поможет и улучшит производительность.

0 голосов
/ 04 марта 2019

Создание и удаление таблиц в хранимых процедурах - почти всегда неправильное решение.

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

Лучшее решение: просто напишите эффективный оператор SELECT.

Альтернативные решения в порядке убывания производительности:

  • использование предложений WITH для управления потоком запросов
  • заполнение коллекций PL / SQL
  • в 18c частных временных таблицах
  • глобальных временных таблиц.

Ваш вопрос представляет собой сценарий запроса исходного набора результатов с последующим программным управлением им.Моя первая мысль: вы должны попытаться сделать это на чистом SQL.Oracle обладает обширным арсеналом функций, не в последнюю очередь аналитических функций, и вы будете удивлены тем, как много можно сделать в запросе.Но если вам действительно нужно работать процедурно, заполнение массивов и манипулирование ими - следующий наиболее эффективный подход.Заполнение глобальной временной таблицы стоит дорого, потому что это влечет за собой запись на диск и чтение с диска.Рассматривайте GTT только в том случае, если вы ограничены памятью сеанса или вам необходимо обмениваться данными между несколькими процедурами.

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