Комплексная оптимизация поисковых запросов Oracle SQL - PullRequest
0 голосов
/ 12 января 2011

Часто поиск в базе данных необходимо выполнять на основе определенных значений. Для этого вопроса учтите, что существует таблица с количеством ключей K = {K1, K2 ... Km} и количеством мета-столбцов C = {C1, C2 ... Cn}. Мета-столбцы не включены ни в один из ключей. Каковы элегантные и эффективные способы выполнения запроса, когда критерии поиска определены как S = {Ki, Cj1, Cj2 ... Cjh}?

Разъяснения:

  • Мета-столбец - это любой столбец, который не является частью ключа;
  • S - это критерий поиска, который всегда содержит только один ключ и необязательные мета-столбцы для фильтрации;

Пример из реальной жизни (система обработки историй):

  • Ключ: временной диапазон, story_id
  • Мета-столбцы: заголовок, репортер, редактор, ...

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

Возможные решения:

  • Одним из решений является использование динамического SQL. Это не является предпочтительным, учитывая эти причины .
  • Использовать хранимые процедуры, по одной процедуре на ключ. Поскольку указывается только подмножество мета-столбцов, можно использовать выражения типа table.column = NVL(paratemers.column, table.column) для мета-столбцов. Я не уверен, точно ли Oracle оптимизирует эту часть запроса, чтобы избежать сравнения, когда parameters.column равно NULL - это часть вопроса. Если да, возможно, это решение проблемы.

Существуют ли элегантные решения, которые не жертвуют производительностью?

1 Ответ

1 голос
/ 12 января 2011

Динамический SQL с переменными связывания - путь.Ссылка «причины», которую вы разместили, правильно говорила против динамического SQL с объединенными значениями - хотя ее заголовок действительно предполагает, что он относится ко всему динамическому SQL.Фактически он продолжает показывать, как выполнять динамический SQL с использованием переменных связывания:

"SELECT * FROM SomeTable Where Field1 = @FirstValue AND SecondField = @SecondField"

Теперь, когда некоторые критерии (или «мета-столбцы», как вы их называете по какой-то причине) являются необязательными, вы можетепостроить динамический SQL на основе указанных значений и связать их при запуске.

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