誰かがあなたに来て、私たちが書き込むSQLの量をIN
に置き換えると言っていると言ってください。単一のスカラー値と数値のリストの両方を使用することになります。同等のvsを持つSQLステートメント
SELECT *
FROM table
WHERE id = 1
OR
SELECT *
FROM table
WHERE id IN (1)
オプティマイザが生成するものと同等これらのステートメントはありますか?
これは非常に簡単ですが、次の2つの理由で単純化されます。1.大規模なSQLブロックを複製する必要はなく、2.動的SQLを過度に使用しません。
これは人為的な例ですが、次の点を考慮してください。
select a.* from tablea a
join tableb b on a.id = b.id
join tablec c on b.id2 = c.id2
left join tabled d on c.id3 = c.id3
where d.type = 1
...と考えますが、文字列の連結を行うことができます(これも大規模なステートメントではありません)
つ以上の場合
select a.* from tablea a
join tableb b on a.id = b.id
join tablec c on b.id2 = c.id2
left join tabled d on c.id3 = c.id3
where d.type in (1,2,3,4)
のためもう一度同じですが、これはORMの使用に照らして望ましくなく、動的SQL文字列連結は常に(少なくともこれらの部分では)良い意図で始まります。
これらは同等である必要があります。実行計画を確認してください。 –
テーブルのエイリアス、SELECT *を使わないなど、これよりももっと重視すべきスタイルがあると思います。クエリプランは、オプティマイザが見ていることを伝えてくれる唯一のものです。インデックスと統計情報 –
私は600万行のテーブルをテストしました。影響を受ける行は15万行です。応答はすべて同じです。 – shenhengbin