0

私たちが持っているとしましょう:

  SELECT * 
    FROM Pictures 
    JOIN Categories ON Categories.CategoryId = Pictures.CategoryId
   WHERE Pictures.UserId = @UserId
ORDER BY Pictures.UploadDate DESC

この場合、データベースは最初に2つのテーブルを結合してから派生テーブルで作業します。これは、特定の列にバインドされたインデックスを作成できない限り、個々のテーブルのインデックスが役に立たないことを意味すると思います派生テーブル?

4

3 に答える 3

3

SQL の仕組みについて根本的な誤解があります。SQL 言語は、返される結果セットを指定します。データベースがこれらの結果を達成する方法については何も述べていません。

ステートメントを解析し、正しい結果を生成する実行計画 (できれば効率的な計画) を考え出すのは、データベース エンジン次第です。最新のリレーショナル データベースの多くには、ステートメントを完全に分解し、元のクエリとは関係がないように見える実行計画を導き出す高度なクエリ オプティマイザがあります。(少なくとも素人の目には)

エンジンがコストベースのオプティマイザーを使用している場合、同じクエリの実行計画は時間の経過とともに変化することさえあります。コストベースのオプティマイザは、データとインデックスについて収集された統計に基づいて決定を下します。統計が変化すると、実行計画も変化する可能性があります。

単純なクエリでは、データベースが where 句を適用する前に、テーブルを結合して一時的な結果セットを作成する必要があると想定しています。それが問題についての考え方かもしれませんが、データベースは自由にまったく異なる方法で実装できます。単純なクエリに対して一時的な結果セットを作成するデータベースが (あるとしても) 多くあるとは思えません。

これは、インデックスがいつ使用されるか、または使用されないかを予測できないと言っているわけではありません。ただし、データベースがクエリを実行する方法を理解するには、練習と経験が必要です。

于 2012-06-28T03:26:19.543 に答える
1

これにより、テーブルが結合され、画像の「CategoryId」がテーブルの「Categories」の CategoryId フィールドにある場合、すべてのカテゴリ情報が提供されます。(そのようなカテゴリがない場合、特定の「写真」の結果はありません)

このクエリは、複数行のデータを返す可能性があります。アクセスするテーブルに関係なく、いずれかのテーブルのインデックスが役立ちます。

通常、プログラムは結果セットをループします。

CategoryId は、そのカテゴリ内のすべての関連フィールドを含むカテゴリの行を提供し、「Picture.Id」(そのようなフィールドがあると仮定) は、データベース内の正確な画像行への参照を提供します。

次に、関連するインデックス "UPDATE Categories SET .... WHERE CategoryId = " + "UPDATE Pictures ..... WHERE PictureId =" + またはプログラミング環境に応じてそのようなものを使用して、いずれかのテーブルを操作できます。

于 2012-06-28T02:12:38.657 に答える
0

インデックスの使用はオプティマイザー次第であり、クエリで何が発生しているかによって異なります。投稿されたクエリについては、インデックスの使用を止める明白な理由はありません。ただし、すべてのデータベースが同じように動作するわけではありません。MySQL では、SELECT ごとに 1 つのインデックスしか使用できません (オプティマイザーが JOIN を解釈して別のインデックスが使用される可能性があるため、クエリ プランを確認してください)。

インデックスが使用できないことを保証する可能性が高いのは、データを変更する関数/操作です。IE: 日付から月などを取得し、LIKE 句の左側をワイルドカード化する...

于 2012-06-28T01:48:51.140 に答える