多くの場合、データベース内の検索は、指定された値に基づいて行われる必要があります。この質問のために、多くのキーK = {K1, K2 ... Km}
といくつかのメタ列C = {C1, C2 ... Cn}
を持つ表があると考えてください。メタカラムはいずれのキーにも含まれていません。検索基準がS = {Ki, Cj1, Cj2 ... Cjh}
と定義されている場合、どのような方法でエレガントで効率的なクエリを実行できますか?複合Oracle SQL検索問合せの最適化
明確化:
- メタカラムがキーの一部ではない任意の列です。
- Sは、フィルタリングする1つのキーとオプションのメタ列を常に含む検索条件です。
実際の例(物語処理システム):
- キー:時間範囲は、
- メタ列をstory_id:見出し、記者、編集者、...
必要条件は、メタ列に対して任意の数のオプションのフィルターを指定してキーのいずれかを検索できることです。
考えられる解決策:
- 一つの解決策は、動的SQLを使用することです。これらを考慮すると好ましいことではありませんreasons。
- キーごとに1つのプロシージャを使用します。メタ列のサブセットのみが指定されているため、メタ列の場合は
table.column = NVL(paratemers.column, table.column)
の式を使用できます。parameters.column
がNULL
であるときに比較を行うことを避けるために、Oracleがクエリのその部分を最適化するかどうかは正確にはわかりません。これは質問の一部です。はいの場合は、おそらくそれが問題の解決策です。
パフォーマンスを犠牲にしない洗練されたソリューションはありますか?
あなたが何をしているのか分かりません。私はそれが鍵の密度に依存すると思う - もし疎であれば、鍵の索引は効率的でなければならない。 – Randy
実際のレイアウトの例を教えてください。この文脈では、メタ列、すなわち 'S = {Ki、Cj1、Cj2 ... Cjh} 'が何であるかはわかりません。 – Quassnoi
Randy、キーとは別に、フィルタリングする他の列があります。任意の数のオプションの非キー列をフィルタリングするための効率的なクエリを作成するにはどうすればよいですか? – Leonid