146

IDLastNameFirstNameの3 つの列を持つPEOPLEというテーブルがあるとします。これらの列はいずれも索引付けされていません。 LastNameは一意性が高く、FirstNameは一意性が低くなります。

2 つの検索を行う場合:

select * from PEOPLE where FirstName="F" and LastName="L"
select * from PEOPLE where LastName="L" and FirstName="F"

私の考えでは、よりユニークな基準 ( LastName) が句の最初に来てwhere、レコードがより効率的に削除されるため、2 番目の方が高速です。オプティマイザーは、最初の SQL クエリを最適化するほど賢くはないと思います。

私の理解は正しいですか?

4

6 に答える 6

118

いいえ、その順序は重要ではありません (少なくとも: 重要ではありません)。

適切なクエリ オプティマイザーは、句のすべての部分を調べWHEREて、そのクエリを満たす最も効率的な方法を見つけ出します。

2 つの条件の順序に関係なく、SQL Server クエリ オプティマイザーが適切なインデックスを選択することはわかっています。他の RDBMS にも同様の戦略があると思います。

重要なのは、これに適したインデックスがあるかどうかです!

SQL Server の場合、次の場合にインデックスを使用する可能性があります。

  • 上の索引(LastName, FirstName)
  • 上の索引(FirstName, LastName)
  • (LastName)just 、または just (FirstName)(または両方)のインデックス

一方、再び SQL Server の場合、テーブルからすべてのSELECT *列を取得するために使用し、テーブルがかなり小さい場合、クエリ オプティマイザーが使用する代わりにテーブル (またはクラスター化インデックス) スキャンを実行する可能性が高くなります。インデックス (他のすべての列を取得するための完全なデータ ページへのルックアップは、非常に急速にコストがかかりすぎるため)。

于 2012-07-11T15:50:42.987 に答える
23

SQL 標準に準拠しているデータベースでは、WHERE 句の順序に違いがあってはなりません。ほとんどのデータベースでは、評価の順序は保証されていません。

SQL が順序を気にするとは思わないでください。以下は、SQL Server でエラーを生成します。

select *
from INFORMATION_SCHEMA.TABLES
where ISNUMERIC(table_name) = 1 and CAST(table_name as int) <> 0

この句の最初の部分が最初に実行された場合、数値テーブル名のみが整数としてキャストされます。ただし、これは失敗し、SQL Server (他のデータベースと同様) が WHERE ステートメントの句の順序を気にしないという明確な例を提供します。

于 2012-07-11T15:52:18.623 に答える
10

ANSI SQL ドラフト 2003 5WD-01-Framework-2003-09.pdf

6.3.3.3 ルールの評価順序

...

フォーマットまたは括弧によって優先順位が決定されない場合、式の効果的な評価は通常、左から右に実行されます。ただし、式が実際に左から右に評価されるかどうかは実装に依存します。特に、オペランドまたは演算子によって条件が発生する可能性がある場合や、式のすべての部分を完全に評価しなくても式の結果を判断できる場合はそうです。

ここからコピペ

于 2012-07-11T15:55:45.480 に答える
4

いいえ、すべての RDBM はまずクエリを分析することから始め、where 句を並べ替えて最適化します。

使用している RDBM に応じて、分析の結果を表示できます (たとえば、Oracle で Explain Plan を検索します)。

M.

于 2012-07-11T15:51:32.563 に答える
2

名前がインデックス化されていないと仮定すると、それは真実です。ただし、データが異なると間違ったものになります。毎回異なる可能性がある方法を見つけるために、DBMS は各列に対して個別のカウント クエリを実行し、数値を比較する必要があります。

于 2012-07-11T15:53:41.503 に答える
2

元の OP ステートメント

私の考えでは、よりユニークな基準 (LastName) が where 句で最初に来て、レコードがより効率的に削除されるため、2 番目の方が高速です。オプティマイザは、最初の sql を最適化するほど賢くはないと思います。

これを、2番目に選択的な列よりも最初に選択的な列を配置する必要があるインデックスを作成するときに、列の順序を選択することと混同していると思います。

ところで、上記の 2 つのクエリの場合、SQL サーバー オプティマイザーは最適化を行いませんが、プランの総コストが並列処理しきい値コストよりも小さい限り、Trivila プランを使用します。

于 2012-07-14T10:40:19.453 に答える