*EXISTS 句のパフォーマンス: SELECT 1 と SELECT **
SQL では、EXISTS 句を使用して、サブクエリ内に指定された条件に一致する行があるかどうかを確認します。開発者は長い間、EXISTS クエリで SELECT 1 と SELECT * の両方を使用してきました。そのため、どちらのアプローチがより効率的でしょうか?という疑問が生じます。
SQL サーバーの最適化
Microsoft によると、SQL Server はサブクエリの SELECT リストに関係なく、EXISTS の使用を認識できるほど賢いそうです。システムにデータを返さないため、SELECT * 句と SELECT 1 句はパフォーマンスの点で同等です。
Microsoft のドキュメントによると:
"EXISTS によって導入されるサブクエリの選択リストには、ほとんどの場合アスタリスク () が含まれます。条件を満たす行があるかどうかをテストしているだけなので、列名をリストする理由はありません。サブクエリで指定された .*"
自己検証
この動作を確認するには、次のクエリを実行します:
<code class="language-sql">SELECT whatever FROM yourtable WHERE EXISTS(SELECT 1/0 FROM someothertable WHERE a_valid_clause)</code>
SELECT リストが関与している場合、このクエリはゼロ除算エラーをトリガーします。ただし、SQL Server は EXISTS 句のコンテキストを理解するため、SELECT リストに対して計算を実行しません。
標準 SQL
ANSI SQL 1992 標準はこの動作をさらに明確にし、EXISTS 述語のコンテキストでは選択リスト "*" が任意のリテラル値と同等であると述べています。
結論
SQL Server では、EXISTS 句で SELECT 1 と SELECT * を選択してもパフォーマンスには影響しません。オプティマイザはその目的を認識し、システムにデータを返さないため、両方のメソッドは同じ結果を生成します。
以上がEXISTS 句の最適化: SELECT 1 と SELECT * — それは重要ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。