2012-02-28 11 views
28

誰かがあなたに来て、私たちが書き込む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文字列連結は常に(少なくともこれらの部分では)良い意図で始まります。

+0

これらは同等である必要があります。実行計画を確認してください。 –

+0

テーブルのエイリアス、SELECT *を使わないなど、これよりももっと重視すべきスタイルがあると思います。クエリプランは、オプティマイザが見ていることを伝えてくれる唯一のものです。インデックスと統計情報 –

+0

私は600万行のテーブルをテストしました。影響を受ける行は15万行です。応答はすべて同じです。 – shenhengbin

答えて

21

この2つは、インデックス付きテーブルの有無に応じて、table scan,index scan、またはindex seekのいずれかの同じ実行計画を生成します。

自分で見ることができます - Displaying Graphical Execution Plans (SQL Server Management Studio) - 「実行計画オプションの使用」を参照してください。

15

これら2つの特定の文がオプティマイザ(あなたが実行計画を比較しましたか?)と同等であるが、私はあなたが後者から抜け出すより重要な利点は

WHERE id = 1 OR id = 2 OR id = 3 OR id = 4 OR id = 5 

のように表現することができるということだと思います以下、はるかに簡潔で読みやすい(ただし、オプティマイザと意味的に同等の)バージョン:

WHERE id IN (1,2,3,4,5) 

問題は後者のほとんどの人々は、彼らが@list = '1,2,3,4,5'のように、文字列を渡した後、言うことができると思うように表現するときということです:

WHERE id IN (@list) 

@listは、単一のスカラー文字列ではなく、整数の配列であるので、これは動作しません。

単一の価値がある場合は、その「最適化」がどのように役立つかはわかりません。あなたはSQLをあまり書いていない、実際にはもっと書いている。これがどのようにしてより少ないSQLにつながるかをさらに詳しく説明できますか?

+0

今すぐ私の前にSQL Serverがありません。私が進める前に、SQL Serverの世界からの意見が必要でした。すなわち、健全性検査なしでこのようにDBMS固有の変更を行うことを望まない。どうもありがとう。 – sgtz

+0

変更する論理的なものがないように他の人にはまだ同意しますが、目的は何ですか?同等の構文の間で交替することに重点を置くより重要なことはありませんか? –

+0

re:less SQL。ステートメントがたくさんのジョインでかなり大量であるとします。ブロック全体が重複しないため、動的合成も必要ないため、SQLが少なくなります。 – sgtz

関連する問題