2011-01-12 40 views
0

多くの場合、データベース内の検索は、指定された値に基づいて行われる必要があります。この質問のために、多くのキー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.columnNULLであるときに比較を行うことを避けるために、Oracleがクエリのその部分を最適化するかどうかは正確にはわかりません。これは質問の一部です。はいの場合は、おそらくそれが問題の解決策です。

パフォーマンスを犠牲にしない洗練されたソリューションはありますか?

+0

あなたが何をしているのか分かりません。私はそれが鍵の密度に依存すると思う - もし疎であれば、鍵の索引は効率的でなければならない。 – Randy

+3

実際のレイアウトの例を教えてください。この文脈では、メタ列、すなわち 'S = {Ki、Cj1、Cj2 ... Cjh} 'が何であるかはわかりません。 – Quassnoi

+0

Randy、キーとは別に、フィルタリングする他の列があります。任意の数のオプションの非キー列をフィルタリングするための効率的なクエリを作成するにはどうすればよいですか? – Leonid

答えて

1

バインド変数を使用した動的SQLが使用できます。あなたが掲示した "理由"リンクは、連結された値を持つ動的SQLに対して正しく言い表していました。タイトルはすべての動的SQLを参照しています。実際には、バインド変数を使用して動的SQLを実行する方法を示すことになります:

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

、いくつかの基準(または「メタ列は」あなたには、いくつかの理由のためにそれらを呼び出しているよう)ときオプションであるあなたが構築することができます指定された値に基づいて動的SQLを実行し、実行時に値をバインドします。

+0

私はちょうど今リンクされた記事を読んだ。 「動的SQLが死ぬ必要がある」というのは、完全に誤解を招くタイトルです!バインド変数で正しく使用すると、記事のすべての問題は問題ではありません。そして、それはちょうど巨大な暴言として書かれている! –