1

SQLテーブルの「適切な」インデックス作成がパフォーマンスの鍵であるといつも聞いています。私はこれの実際の例を見たことがなく、 SQLFiddleを使用して作成したいと思っていますが、SQL構文でそうするかどうかはわかりません。

私が3つのテーブルを持っているとしましょう:1)Users2)Comments3)Items。また、各アイテムはどのユーザーでもコメントできるとしましょう。したがって、item = 3のコメントを取得するには、SQLSELECTは次のようになります。

SELECT * from comments join users on comments.commenter_id=users.user_id 
WHERE comments.item_id=3

一般的に言って、行数が大きくなる場合、つまり数千/百万になる場合は、WHEREおよびJOINed列にインデックスを付ける必要があると聞いています。したがって、この場合comments.item_id、、、、comments.commenter_idおよびusers.user_id

SQLFiddleを作成して、これらのテーブルにインデックスを付けることと、テーブルごとに数千、数百万の行を使用しないことを比較したいと思います。誰かがこのSQLFiddleの生成を手伝ってくれるでしょうか?

4

2 に答える 2

11

私はSQLFiddleの所有者です。パフォーマンステスト用の巨大なデータベースを生成する場所ではありません。メモリ、hdd構成など、制御できない(ただし、実際には制御する必要がある)他の変数が多すぎます。また、共有環境として、それを使用している他の人がいます。テストにも影響します。そうは言っても、sqlfiddleで小さなデータベースを構築してから、インデックスがある場合とない場合のクエリの実行プランを表示できます。これらは他の環境要因に関係なく一貫しており、最適化を学習するための優れた情報源になります。

于 2013-01-04T14:47:02.607 に答える
1

テーブルにインデックスを付けるにはかなりの数の異なる方法があり、最もよく使用されるSELECTステートメントに応じて、複数のテーブルに異なるインデックスを付けることを選択できます。インデックスの2つの基本的なタイプは、クラスター化および非クラスター化と呼ばれます。

クラスタ化インデックスは、データベースがプルして実際のデータを見つけるために使用できる参照のリストを格納するのではなく、インデックス自体にすべての情報を格納します。これを視覚化する最も簡単な方法は、インデックスとテーブル自体を別々のオブジェクトと考えることです。クラスタ化インデックスでは、インデックスを作成した列が(WHERE句で)基準として使用される場合、クエリが取得する情報は、テーブルではなくインデックスから直接取得されます。

一方、非クラスター化インデックスは、参照テーブルに似ています。要求している実際の情報がテーブルオブジェクト自体のどこに格納されているかをクエリに通知します。したがって、本質的には、非クラスター化インデックスを使用する場合、テーブル自体から実際にデータを取得するという追加の手順が必要になります。

クラスター化インデックスは、データを物理的にハードディスクに順番に格納します。その結果、テーブルに含めることができるクラスター化インデックスは1つだけです(ディスクドライブには1つの「物理的」な方法でしかテーブルを格納できないため)。 。クラスタ化インデックスも一意である必要があります(これは肉眼では当てはまらない場合がありますが、データベース自体には常に当てはまります)。このため、ほとんどのクラスター化インデックスは主キーに配置されます(ほとんどの主キーは一意であるため)。

クラスター化インデックスとは異なり、非クラスター化インデックスは、実際のテーブル自体の単なる参照テーブルであるため、テーブルに必要な数だけ含めることができます。非クラスター化インデックスには基本的に無制限の数のオプションがあるため、ユーザーは、SELECTステートメントのWHERE句で一般的に使用される列に必要な数のオプションを配置することを好みます。

しかし、すべてのものと同様に、過剰は必ずしも良いとは限りません。テーブルに配置するインデックスが多いほど、そのテーブルには「オーバーヘッド」が多くなります。インデックスはクエリの実行を高速化する可能性がありますが、過度のオーバーヘッドもクエリの実行速度を低下させます。重要なのは、特定の状況に対して、インデックスが多すぎる場合とインデックスが不足している場合のバランスを見つけることです。

インデックスの有無にかかわらずクエリのパフォーマンスをテストするのに適した場所である限り、SQLServerを使用することをお勧めします。SQL Server Management Studioには、クエリの実行にかかるコストと時間を通知する「実行プラン」という関数があります。

于 2013-01-04T15:16:33.490 に答える