我有一个大型数据库(90GB数据,70GB索引)在过去一年中一直在缓慢增长,并且增长/变化不仅引起了索引的大量内部碎片,而且导致了表本身的大量内部碎片.
很容易解决(大量)非常分散的索引 - REORGANIZE或REBUILD将根据它们的碎片程度来处理它 - 但我在清理实际表碎片时可以找到的唯一建议是添加聚簇索引到桌子.之后我会立即删除它,因为我不希望桌面上有聚簇索引,但是有没有另一种方法可以在没有聚簇索引的情况下执行此操作?一个"DBCC"命令会这样做吗?
谢谢你的帮助.
sql-server sql-server-2005 fragmentation dbcc database-fragmentation
我的数据库中有几个表(User&UserRecord)变得非常分散(如99%)并导致整个数据库,因此网站停止运行.
UserRecord有点像某个时间点的用户快照.用户就像该用户的主记录.用户有0到多个UserRecords.用户有大约一百万行,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
Run Code Online (Sandbox Code Playgroud)
(不确定列表是否重要,但认为我将其包含在内,因为它与User_Record有关.列表有0到多个UserRecords)
我们已经设置了一个SQL维护计划来每天重建索引,这确实有帮助,但有时还不够.
一位朋友建议我们使用两个数据库,一个用于读取,一个用于写入,我们从写入DB同步读取DB.并不是说我对此有所了解,但我在解决这个问题时遇到的第一个问题是我们在查看网站时需要最新的数据.例如,如果我们更新用户详细信息或UserRecord,我们希望立即看到这些更改.
有没有人有任何关于我如何能够在失控之前解决这个问题的建议?
database sql-server database-design database-fragmentation sql-server-2012
我试图理解顺序guid如何比常规guid更好.
是因为使用常规guid,索引使用guid的最后一个字节进行排序?由于它是随机的,它会导致很多碎片和页面拆分,因为它经常将数据移动到另一个页面以插入新数据?
顺序guid正弦它是顺序的,它会导致很少的页面拆分和碎片?
我的理解是否正确?
如果有人能够在这个问题上有更多的亮点,我会非常感激.
谢谢
编辑:
顺序guid = NEWSEQUENTIALID(),
常规guid = NEWID()
“简单谓词的一个重要方面是它们的完整性;另一个是它们的最小性。simple predicates Pr:
当且仅当每个应用程序对属于任何最小项片段的任何元组进行访问的概率相等时,一组谓词才被认为是完整的。到Pr2
。
Example:-
PROJ
考虑中给出的关系的碎片Example 3.8
。如果唯一访问的应用程序PROJ
想要根据位置访问元组,则该集合是完整的,因为每个片段的每个元组PROJi (Example 3.8)
具有相同的被访问概率。但是,如果有第二个应用程序仅访问 所在的项目元组budget is less than or equal to $200,000
,则Pr is not complete
. PROJi
由于第二个应用程序,每个元组中的一些元组有更高的概率被访问。为了使谓词集完整,我们需要添加(BUDGET <= 200000, BUDGET > 200000)\nto Pr
:
Pr = {LOC=\xe2\x80\x9cMontreal\xe2\x80\x9d, LOC=\xe2\x80\x9cNew York\xe2\x80\x9d, LOC=\xe2\x80\x9cParis\xe2\x80\x9d, BUDGET <= 200000, BUDGET > 200000}"
我上传了图 3.3 和示例 3.8:-
\n\n\n\n\n\n现在我不明白我怎么知道 Pr 是否完整
\n\n那么\n“每个应用程序对属于任何最小项片段的任何元组的访问概率相等”是什么意思
\n\n有什么例子如何计算每个应用程序访问任何元组的相等概率?
\n假设我在列上有一个带有聚簇索引的下表(例如,a)
CREATE TABLE Tmp
(
a int,
constraint pk_a primary key clustered (a)
)
Run Code Online (Sandbox Code Playgroud)
然后,让我们假设我有两组非常大的行要插入到表中.
你认为在第一组和第二组中插入值之间会有性能差异吗?如果是这样,为什么?
谢谢
sql-server clustered-index database-performance insert-statement database-fragmentation