ユーザー ユーザーのコメントを格納するテーブルがあります。1億以上のコメントがあります。
2 つの方法で作成できます。
オプション 1: PK としてのユーザー名とコメント ID。こうすることで、すべてのコメントがユーザー名とコメント ID によって物理的に保存されます。
CREATE TABLE [dbo].[Comments](
[user] [varchar](20) NOT NULL,
[com_id] [int] IDENTITY(1,1) NOT NULL,
[com_posted_by] [varchar](20) NOT NULL,
[com_posted_on] [smalldatetime] NOT NULL CONSTRAINT DEFAULT (getdate()),
[com_text] [nvarchar](225) COLLATE NOT NULL,
CONSTRAINT [PK_channel_comments] PRIMARY KEY CLUSTERED
([channel] ASC, [com_id] ASC) WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]) ON [PRIMARY]
長所: 私のクエリは、comment_id DESC によるユーザー オーダーのすべてまたは上位 10 件のコメントを取得します。これがSEEKです
オプション 2: コメント ID を PK にすることができます。これにより、ユーザー名ではなく、コメント ID で並べ替えられたコメントが保存されます。
短所: 特定のユーザーの最新の上位 10 件のコメントを取得することは、データがユーザー別に保存されていない (つまり、ユーザー別にソートされていない) ため、もはやシークではありません。そのため、クエリのパフォーマンスを向上させるために別のインデックスを作成する必要があります。
どの方法で進めるのが最善ですか?挿入と削除はどうですか?これらの操作は許可されています。でも読む頻度は高いです。
ユーザーはコメントを変更できません。
両方のテーブルを 110 万行でテストしました。結果は次のとおりです。
table_name rows reserved data index_size unused
comments2 1079892 99488 KB 62824 KB 36576 KB 88 KB (PK: com_id Second Index on (user_name, com_id))
comments1 1079892 82376 KB 82040 KB 328 KB 8 KB (PK: user_name, no other indices)
--------------------------------------------------------------------
diff: same rows 17112KB -19216KB 36,248KB 80KB
したがって、PK として com_id を持つテーブルは、2 つのインデックスのためだけに 36MB の余分なディスク領域を使用しています SEEK を使用して両方のテーブルでトップ クエリを選択しますが、PK として com_id を持つテーブルは遅くなりますが、PK として com_id を持つ場合、挿入はわずかに速くなります
コメントはありますか?