7

我的数据库中有几个表(用户和用户记录)变得非常分散(如 99%)并导致整个数据库以及因此网站停止运行。

UserRecord 有点像该用户在某个时间点的快照。用户就像该用户的主记录。用户有 0 到多个 UserRecords。User 有大约 100 万行,UserRecord 有大约 250 万行。这些表被写入很多。他们也被大量搜索。他们都会变得更大。严重碎片化的主要索引是 User 和 UserRecord 表的主键。

数据库是 SQL Server 2012,我使用的是实体框架,我没有使用任何存储过程。

表看起来像这样:

USER
UserName string PK ClusteredIndex
FirstName string
LastName string
+SeveralMoreRows

USER_RECORD
UserRecordId int PK ClusteredIndex
ListId int FK(List)
UserName string FK(User) NonClusteredIndex
Community string NonClusteredIndex
DateCreated datetime
+LotsMoreRows

LIST 
ListId int PK & ClusteredIndex
Name string
DateCreated datetime

(不确定 List 这是否重要,但我认为我会包括它,因为它与 User_Record 相关。List 有 0 到许多 UserRecords)

我们设置了一个 SQL 维护计划来每天重建索引,这确实有帮助,但有时还不够。

一位朋友建议我们使用两个数据库,一个用于读取,一个用于写入,我们将读取 DB 与写入 DB 同步。并不是说我对此一无所知,但我看到这个解决方案的第一个问题是我们在查看网站时需要最新数据。例如,如果我们更新用户详细信息或用户记录,我们希望立即看到这些更改。

有没有人对我如何在它失控之前解决这个问题有任何建议?

4

1 回答 1

5

聚集索引控制磁盘上数据的顺序。这是为什么通常建议您设置一个始终递增的整数键来充当聚集索引的主要原因之一。这样,随着更多数据添加到表中,它们将添加到当前现有数据的末尾。

如果它不是一个自动递增的数字并且新行可能包含在现有值之间排序的值,那么 SQL Server 基本上会将数据推送到它所属的磁盘上(以保留聚集索引键值的顺序),从而产生碎片以及潜在的严重开销,因为 IO 写入会进一步减慢数据库的速度。

我怀疑你的 UserRecord 值有同样的问题。

所以我要做的是为每个表添加一个单独的集群自动增加主键,并在必要时重新处理您的 FK 引用和查询。

于 2013-11-15T11:12:35.117 回答