0

最適化する必要がある巨大なクエリがあります。私のコーディングの前は

SELECT [...] WHERE foo = 'var' [...]

の 2000 の異なる値に対して 2000 回実行されますfoo。私たちは皆、それがどれほど遅いかを知っています。さまざまなクエリをすべて参加させることができました

SELECT [...] WHERE foo = 'var' OR foo = 'var2' OR [...]

もちろん、2000 の連鎖比較があります。その結果、巨大なクエリが生成され、以前よりも数秒速く実行されましたが、十分ではありませんでした。私が使用しているクエリの作成には時間がかかると思われるStringBuilderため、1999 年のクエリを保存することで得た時間が次のように無駄になっています。

StringBuilder query = new StringBuilder();
foreach (string var in vars)
   query.Append("foo = '").Append(var).Append("' OR ");
query.Remove(query.Length - 4) // for removing the last " OR "

そのため、その文字列の構築を最適化するための回避策を使用できるかどうかを知りたいです。おそらく、次のようなSQLトリックとの比較で異なる値を結合します

SELECT [...] WHERE foo = ('var' OR 'var2' OR [...])

そのため、いくつかの操作を節約できますAppend。もちろん、その巨大なクエリをまったく回避しようとする別のアイデアは大歓迎です。

4

3 に答える 3

1

@アルマゲドン

適切な DBMS の場合、IN ()演算子は対応x OR yする比較の数に対応する必要があります。に関する懸念についてStringBuild.Appendは、その実装は非常に効率的であり、一時的な内部バッファ用に数 MB の余裕があれば、この量のデータに関する遅延に気付くべきではありません。とはいえ、パフォーマンスの問題がこれらの問題に関連しているとは思いません。

データベースのチューニングの場合、「全体像」なしでソリューションを提案することは常に遠いショットですが、あなたの問題は、そのような巨大な動的 SQL ステートメントのコンパイルに関連している可能性があると思います。-- SQL ステートメントの解析と最適化は、多くのプロセッサ時間を消費する可能性があるため、避ける必要があります。

ドメインを補助インデックス テーブルに移動することで、応答時間を改善できる可能性があります。または、 INSTR関数 を使用して、同じ char 列に対するさまざまなチェックをテキスト検索に 移動します。

-- 1. using domain table
SELECT myColumn FROM myTable WHERE foo IN (SELECT myValue FROM myDomain);

-- 2. using INSTR function
SELECT myColumn FROM myTable WHERE INSTR('allValues', foo, 1, 1) > 0;
于 2013-09-30T16:30:16.543 に答える
0

W3school の IN -operator のように IN-operator を使用しないのはなぜですか? これにより、値をより短い方法で組み合わせることができます。この投稿で説明されているように、一時テーブルに値を保存して、Oracle の 1000 行の制限を回避することもできます。

于 2013-09-30T13:15:06.750 に答える
0

オラクルのダンスを踊ってからしばらく経ちましたが、「バインド変数」の概念を覚えているようです-通常は一括挿入に使用されます...値のリストを配列として表現し、使用できるかどうか疑問に思っていますそれはINで...

言わなければなりません - これは単なるアイデアです - 私はあなたのためにそれをさらに研究する時間がありません...

于 2013-09-30T15:39:54.213 に答える