まず第一に、データが正規化されていないため、ここですでに問題があります。一連のテキスト列に何らかの種類のインデックスを作成することは、可能な限り避けるべきです。これらの列がテキストではない場合でも (そして私はテキストだと思います)、同じテーブルにアーティスト、アルバム、および曲を含めることは意味がありません。このためのはるかに優れた設計は次のようになります。
Artists (
ArtistID int NOT NULL IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
ArtistName varchar(100) NOT NULL)
Albums (
AlbumID int NOT NULL IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
ArtistID int NOT NULL,
AlbumName varchar(100) NOT NULL,
CONSTRAINT FK_Albums_Artists FOREIGN KEY (ArtistID)
REFERENCES Artists (ArtistID))
Songs (
SongID int NOT NULL IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
AlbumID int NOT NULL,
SongName varchar(100) NOT NULL,
NumberOfListens int NOT NULL DEFAULT 0
CONSTRAINT FK_Songs_Albums FOREIGN KEY (AlbumID)
REFERENCES Albums (AlbumID))
このデザインを作成すると、個々のアルバムやアーティスト、曲を検索できるようになります。また、カバリング インデックスを追加してクエリを高速化することもできます。インデックスははるかに小さいため、元の設計よりも高速になります。
範囲クエリを実行する必要がない場合 (おそらく必要ないでしょう)、IDENTITY
キーをROWGUID
if に置き換えることができます。この場合、それはあまり重要ではありません。単純なものに固執しIDENTITY
ます。
クラスタリング キーには注意が必要です。少しでもシーケンシャルではないキー (アーティスト、アルバム、曲名がシーケンシャルでないことは間違いありません) でクラスター化すると、ページが分割されたり、その他の問題が発生したりします。あなたはこれを望んでいません。Marc が言うように、このキーのコピーはすべてのインデックスに追加されます。キーの長さが 300 または 600 バイトの場合、これは絶対に必要ありません。
特定の曲の再生回数をアーティスト、アルバム、曲名ですばやくクエリできるようにしたい場合、上記の設計では実際には非常に簡単です。適切にインデックスを作成するだけで済みます。
CREATE UNIQUE INDEX IX_Artists_Name ON Artists (ArtistName)
CREATE UNIQUE INDEX IX_Albums_Artist_Name ON Albums (ArtistID, AlbumName)
CREATE UNIQUE INDEX IX_Songs_Album_Name ON Songs (AlbumID, SongName)
INCLUDE (NumberOfListens)
これで、このクエリは高速になります。
SELECT ArtistName, AlbumName, SongName, NumberOfListens
FROM Artists ar
INNER JOIN Albums al
ON al.ArtistID = ar.ArtistID
INNER JOIN Songs s
ON s.AlbumID = al.AlbumID
WHERE ar.ArtistName = @ArtistName
AND al.AlbumName = @AlbumName
AND s.SongName = @SongName
実行計画をチェックアウトすると、3 つのインデックス シークが表示されます。取得できる限り高速です。元の設計とまったく同じ独自性を保証し、速度を最適化しました。さらに重要なことは、正規化されているため、アーティストとアルバムの両方が独自のアイデンティティを持っているため、長期的に管理するのが非常に簡単になります. 「アーティスト X のすべてのアルバム」を検索する方がはるかに簡単です。「アルバム Y のすべての曲」を検索する方がはるかに簡単で高速です。
データベースを設計するときは、正規化が最初の関心事であり、インデックス作成は 2 番目の関心事です。そして、正規化された設計が得られると、最適なインデックス作成戦略が明らかになることに気付くでしょう。