Существуют проблемы с использованием подхода статического запроса; также будьте очень осторожны в использовании опции CURSOR_SHARING = FORCE - она может действительно поднять ад с вашей системой, если вы еще не сделали тест покрытия, чтобы все ваши другие запросы работали так, как вы хотите.
Проблема с статическими запросами:
(х является нулевым или х = цв) предикаты, как правило, убить любой шанс с помощью индексов. Поскольку план запроса вычисляется в момент, когда запрос обрабатывается впервые, используемые вами индексы будут основываться на значениях для первого запуска запроса; последующие прогоны, которые могут не сдерживаться на одних и тех же столбцах, будут по-прежнему использовать одни и те же индексы.
Наличие одного статического оператора с переменными подстановки предотвратит оптимизатор от интеллектуального выбора того, какой индекс использовать на основе распределения данных. В динамическом запросе (или в первом запуске запроса с переменными привязки) Oracle увидит, насколько избирательным является ваше ограничение; очень избирательное ограничение станет основным кандидатом на использование индекса. Например, если ваша таблица имела строку для каждого человека в США, STATE = 'Аляска' будет гораздо чаще использовать индекс в STATE, чем STATE = 'California'.
Конечно, в обоих этих случаях, если динамические столбцы в ИНЕКЕ не индексируются в любом случае, это не имеет значения, хотя я был бы удивлен, если бы это было так, в базе данных размером ты говоришь о.
Также рассмотрите реальную стоимость всего этого жесткого разбора. Да, жесткие разборки сериализуют системные ресурсы, что делает их дорогими, но только в контексте запросов большого объема. По своей природе специальные запросы не часто запускаются. Стоимость, которую вы платите за все жесткие анализы, которые вы понесете за целый день, вероятно, будет в сотни раз меньше стоимости одного запроса, который использует неправильные индексы.
В прошлом я реализовал эти системы почти так же, как вы это сделали, - часть базового запроса, а затем итерация по списку ограничений и добавление предикатов предложения WHERE. Я не думаю, что кому-то трудно поддерживать или понимать, особенно если вы говорите о ограничениях, которые не связаны с добавлением большого количества подзапросов или дополнительных таблиц в предложение FROM.
Одна вещь, которую следует учитывать: если эта система является в основном автономной (другими словами, не постоянно обновляемая или вставленная в - заполненная периодическими нагрузками объемных данных), вы можете посмотреть на использование индексов BITMAP. Индексы битмапа отличаются от обычных индексов b-дерева тем, что несколько индексов в одной таблице могут использоваться одновременно, а индексы растровых изображений намного меньше на диске, чем b-деревья. Они очень хорошо работают для таких приложений, где у вас будет множество ограничений, которые не могут быть определены во время разработки. Вам нужно только поместить индексы растрового изображения в столбцы с относительно небольшим количеством значений - например, одно значение составляет не менее 1/1000 таблицы, поэтому не используйте растровые изображения для уникальных столбцов.
Однако недостатком является то, что индексы растровых изображений заметно ухудшают производительность вставок и обновлений. Лучшая практика для растровых изображений - использовать их в приложениях хранилища данных, и они упаковываются до загрузки и воссоздаются впоследствии.
Что значит «проблема оптимизации процедуры»? Выполняют ли ваши запросы плохо, или вы стремитесь к удобочитаемости, или ...? – DCookie
Да, я говорю о производительности. Я не знаю, какой здесь стандартный подход. Я уверен, что все зависит от моей реализации базы данных, но мне было просто любопытно, есть ли какие-либо общие «лучшие практики» для такого рода запросов. –