我的数据库中有几个表(User 和 UserRecord),它们变得极其碎片化(例如 99%),导致整个数据库以及网站陷入瘫痪。
UserRecord 有点像该用户在某个时间点的快照。用户就像该用户的主记录。用户有 0 到多个 UserRecord。 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 到多个 UserRecord)
我们设置了一个 SQL 维护计划来每天重建索引,这确实有帮助,但有时还不够。
一位朋友建议我们使用两个数据库,一个用于读取,一个用于写入,并且我们将读取数据库与写入数据库同步。我并不知道如何执行此操作,但我看到此解决方案的第一个问题是我们在查看网站时需要最新数据。例如,如果我们更新用户详细信息或用户记录,我们希望立即看到这些更改。
有谁对我如何在问题失控之前解决这个问题有任何建议吗?
聚集索引控制DISK上数据的顺序。这是通常建议您设置一个始终递增的整数键来充当聚集索引的主要原因之一。这样,当更多数据添加到表中时,它们就会添加到当前现有数据的末尾。
如果它不是自动递增的数字,并且新行可能包含在现有值之间排序的值,那么 SQL Server 基本上会将数据推送到其所属的磁盘上(以保留聚集索引键值的顺序),从而产生碎片当 IO 写入进一步减慢数据库时,可能会产生严重的开销。
我怀疑您的 UserRecord 值也有同样的问题。
所以我要做的就是向每个表添加一个单独的集群自动递增主键,并在必要时重新处理 FK 引用和查询。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)