ホームページ >データベース >mysql チュートリアル >EXISTS サブクエリの SELECT 1 と SELECT * : パフォーマンスに影響しますか?
*EXISTS サブクエリの最適化: SELECT 1 と SELECT のパフォーマンスの違い **
SQL クエリで EXISTS 演算子を使用する場合、サブクエリで SELECT 1 を指定するか SELECT * を指定するかについて議論があります。この記事では、両方のアプローチのパフォーマンスへの影響について説明します。
**従来の方法: SELECT ***
伝統的に、サブクエリ内のすべての列を取得するため、サブクエリでは SELECT * が使用されます。
<code class="language-sql">IF EXISTS (SELECT * FROM TABLE WHERE Columns=@Filters) BEGIN UPDATE TABLE SET ColumnsX=ValuesX WHERE Columns=@Filters END</code>
代替方法: SELECT 1
データベースの専門家は、EXISTS チェックでは、単一の値のみを返すため、SELECT 1 を使用する方が効率的であることを推奨しています。
<code class="language-sql">IF EXISTS (SELECT 1 FROM TABLE WHERE Columns=@Filters) BEGIN UPDATE TABLE SET ColumnsX=ValuesX WHERE Columns=@Filters END</code>
パフォーマンスの違い
SELECT 1 には潜在的なパフォーマンス上の利点があるとされていますが、Microsoft SQL Server は EXISTS 演算子のサブクエリを最適化するように設計されています。 SELECT 1 を使用しても SELECT * を使用しても、SQL Server はシステムにデータを返しません。
検証
この最適化を検証するには、次のクエリを実行してみてください:
<code class="language-sql">SELECT whatever FROM yourtable WHERE EXISTS( SELECT 1/0 FROM someothertable WHERE a_valid_clause )</code>
サブクエリが無効な除算を実行した場合でも、エラーはスローされません。これは、SELECT サブクエリ内の EXISTS リストが評価されないことを示します。
標準 SQL
ANSI SQL 1992 標準では、SELECT リストの EXISTS サブクエリに「*」のみが含まれる場合、それは任意のリテラルと同等であると明確に規定されています。
結論
SQL Server の最適化機能と SQL 標準に基づくと、EXISTS サブクエリで SELECT 1 または SELECT * を使用してもパフォーマンスに違いはありません。どちらのメソッドも同じ効率で同じ結果を返します。
以上がEXISTS サブクエリの SELECT 1 と SELECT * : パフォーマンスに影響しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。