1

すべての従業員とその注文のリストを取得するためのwhere 句のない次のクエリがあります。

SELECT LastName, FirstName, OrderID, OrderDate
FROM Employees inner JOIN Orders 
 ON Employees.ID = Order.EmployeeID

2 つのインデックスを定義できます。1) columnEmployees.ID2) columnOrder.EmployeeIDです。インデックスを 1 つだけにしたい場合、結合を高速化するにはどのインデックスを定義すればよいですか?

Android用のSQLiteを使用しています

4

1 に答える 1

2

クエリでは、テーブルのサイズや構造など、多くの詳細が省略されています。ただし、エンティティの名前に基づいて、詳細の一部を推測できます。

まず、SQLite では、すべてのテーブルに主キーが与えられます。各テーブルに主キーを定義して、これを利用する必要があります。

Employees.IDが主キーの候補であるEmployees(つまり、値が一意である)と仮定すると、それを主キーとして定義する必要があります。これはインデックスのように機能します。

この構造では、エンジンはテーブルを読み取り、Ordersテーブル内の値を検索することでクエリを処理する必要がありEmployeesます。Ordersテーブルが よりも大きいと仮定すると、Employeesこれがクエリを満たすための最も効率的な方法になると思います。

つまり、それEmployees.IDが主キーであることを確認してください。

編集:

両方のテーブルを読み取る必要があります。基本的に 3 つのオプションがあります。両方のテーブルを並べ替えてから、それらをマージできます。ソートにはコストがかかるため、これはコストがかかります。

いずれかのテーブルを順番に読み取り、もう一方の値を調べることができます。テーブルのシーケンシャル読み取りは、(インデックス ルックアップによる) ランダム読み取りよりも高速です。ordersおそらく小さいテーブルのインデックスルックアップを使用して、大きなテーブルでシーケンシャル読み取りを行う方が高速employeesです。

ordersテーブルの幅が非常に広い (列が多い) 場合は、インデックスを付けるorders(id, orderdate)ことで改善される可能性があります。これは「カバリング」インデックスであるため、元のデータにアクセスする必要はありません。

于 2013-09-07T12:12:08.707 に答える