小编nia*_*her的帖子

索引这个非常大的表的最佳方法

我有下表

CREATE TABLE DiaryEntries
(
 [userId] [uniqueidentifier] NOT NULL,
 [setOn] [datetime] NOT NULL, -- always set to GETDATE().
 [entry] [nvarchar](255) NULL
)
Run Code Online (Sandbox Code Playgroud)

每个用户每天将插入大约 3 个条目。将有大约 1'000'000 名用户。这意味着该表中每天有 3'000'000 条新记录。一旦记录超过 1 个月,我们就会将其删除。

大多数查询都有以下 WHERE 子句:

WHERE userId = @userId AND setOn > @setOn
Run Code Online (Sandbox Code Playgroud)

大多数查询返回不超过 3 行,除了一个返回本月内插入的所有行(最多 90 行)。

插入记录后,日期和用户 ID 不能更改。

现在我的问题是 - 如何最好地安排这张表的索引?我坚持两种选择:

  1. (userId, setOn) 上的聚集索引 - 这将使我快速搜索,但我担心过度的页面拆分,因为我们将插入很多中间值(相同的用户 ID 但不同的日期)。
  2. (userId) 和 (setOn) 上的非聚集索引 - 这也会导致 (userId) 索引上的页面拆分(但它是否与第一个选项一样昂贵?)。搜索速度变慢了,因为我们使用了 NC 索引。
  3. 附加列 (id) 上的聚集索引和 (userId, setOn) 上的非聚集索引 - 这将消除数据表的页面拆分,但仍会导致 NC 索引上的一些。此选项也不是搜索的最佳选择,因为我们使用 …

indexing sql-server sql-server-2008

4
推荐指数
2
解决办法
2万
查看次数

标签 统计

indexing ×1

sql-server ×1

sql-server-2008 ×1