WHERE IN句の値の順序は重要ですか?SQL内の項目の順序はどこですか?
where field1 in (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
提供
where field1 in (3, 5, 10, 2, 1, 8, 6, 9, 4, 7)
WHERE IN句の値の順序は重要ですか?SQL内の項目の順序はどこですか?
where field1 in (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
提供
where field1 in (3, 5, 10, 2, 1, 8, 6, 9, 4, 7)
よりも性能が上がりはい、それはしますが、おそらく、実装依存的に:そのようなないよう
(それが重要である場合、これはFirebirdのSQLです)。 INは順次ORとして処理され、最も可能性の高い処理順序は書かれていると仮定します。
これは、オプティマイザが指定された順序で要素を処理すると仮定することから始めます。これは、最も簡単なものであるため、ほとんどの要素から最小限の要素まで並べます。それは傷つけることはできません、そして、おそらく助けるでしょう。差が測定可能であるか重要であるかは、別の問題です。それを測定し、私たちに知らせてください。
既にチェックされている領域(断片化されたハードドライブのような)を前後に移動するインデックスを強制的に実行するかどうか、またはそれが最初にそれ自身でソートされたかどうかはわかりませんでした。 。私は調べるためにテストを実行します。 –
目立つ違いがないように見えますが、私が行ったテストでは違いが小さすぎて測定できませんでした。 –
@ChrisValentine:驚くべきことではありません。セットが大きくなったら、それをルックアップテーブルに入れ、クラスタードインデックスを追加して内部結合します。 SQLオプティマイザは、ORよりも効率的にそのような結合を実行することが常に期待できます。結局のところ、OR関数は、テーブルに入れすぎるほど小さすぎる集合のための単純な構文糖である。 –
質問がデルファイとはまったく関係ないので、私は 'delphi'タグを削除しました。あなたの質問に実際に当てはまるタグだけを使用してください。タグの目的は質問をカテゴリに分類することです。ありがとう。 –
私の推測では、INリストが巨大でない限り、現代のハードウェアには目立った違いはありません。その日の終わりにfor-loopが存在し、そのリストの要素を繰り返して比較しますフィールド値 –
forループが不必要なインデックストラバーサルを起こしているかどうか、またはそれがどうしてもリストをソートしたかどうかは分かりませんでした。 Thx –