0

1000レコードの、、を含むstudentテーブルがあるとします。idclassschool_id

3つの学校と12のクラスがあります。

これらの2つのクエリのどちらが高速になりますか(違いがある場合)

クエリ1:

SELECT * FROM student WHERE school = 2 and class = 5; 

クエリ2:

SELECT * FROM student WHERE class = 5 and school = 2;

注:の2つの条件の場所を変更しましたWHERE

それではどちらが速くなり、次は本当ですか?

->query1のレコードの推定数は333です

->query2のレコードの推定数は80です。

4

5 に答える 5

6

それは真剣に少しでも問題ではありません。1000レコードは本当に小さなデータベーステーブルであり、まったく違いがある場合は、そのような頭の悪いDBMSからアップグレードする必要があります。

適切なDBMSはすでにテーブルから統計を収集しており(またはDBAは定期的な調整の一部として収集しているはずです)、where句の順序は関係ありません。

実行エンジンは、カーディナリティを減らした(つまり、行の候補グループを減らした)ものを最も速く選択します。つまり、ステートメントclass = 5の順序に関係なく、(クラスと学校がほぼ均等に分散されていると仮定して)フィルターが最初に発生します。select

カーディナリティの問題をもう少し詳しく説明すると、これらの1000レコードがほぼ均等に分散している場合、各学校で333、各クラスで83になります。

DBMSが行うことは、最初に、最小の結果セットを提供するものでフィルタリングすることです。したがって、クラスフィルターの使用を好む傾向があります。これにより、行の候補リストがすぐに約83に削除されます。次に、2以外の学校があるものを破棄するだけです。

どちらの場合も、最終的に同じ行セットになりますが、インデックスを使用して目的の行のみを選択できるため、初期フィルターの方が高速であることがよくあります。一方、2番目のフィルターは、効率の低い方法でこれらの行を通過する可能性が高いため、行数をすばやく減らすことができれば、より良い結果が得られます。

本当に知りたいのなら、推測するのではなく測定する必要があります。これはDBAの主要な責任の1つであり、クエリを最適に実行するためにデータベースを調整します。

于 2012-08-28T06:55:02.953 に答える
5

これらの2つのクエリは厳密に同じです:)

于 2012-08-28T06:54:22.890 に答える
2

仮説; DBの概念を教える

「DBがカーディナリティを使用してクエリを最適化する方法」

したがって、基本的には同じですが、実際に優れたRDBMSの概念を導入する「理由」を示唆する1つの考えに言及します。

RDBMSがWHERE句を指定した順序で厳密に使用したと仮定してみましょう。

その場合、最適なクエリは、カーディナリティが最大の列が最初に指定されたクエリになります。つまり、最初に指定すると、行が考慮から除外さclass=5れるため、最初に指定する方が速くなりますつまり、行の「クラス」列に5が含まれていない場合(統計的には、「学校」列に2が含まれていない場合よりも多い)、 「学校」の列を評価する必要すらありません。

ただし、現実に戻ると、ほとんどすべての最新のリレーショナルデータベース管理システムは、「クエリプランの作成」および「クエリのコンパイル」と呼ばれる処理を実行することを知っておく必要があります。これには、特に、WHERE句で指定された列のカーディナリティ(および使用可能なインデックスなど)の評価が含まれます。したがって、本質的には、それらが同一であると言うのはおそらく真実であり、結果の数も同じになります。

于 2012-08-28T06:59:04.717 に答える
1

影響を受ける行の数は、sql-statementの「where句」で条件を並べ替えただけでは変更されない可能性があります。sql-serverが最初に一致するインデックスを探すため、実行時間も影響を受けません。

于 2012-08-28T06:56:52.863 に答える
-2

最初のクエリは2番目のクエリよりも高速に実行されます。これは、where句で最初に学校をフィルタリングするため、後でクラスの詳細を取得しやすくなるためです。

于 2012-08-28T06:57:28.313 に答える