如何在内部进行页压缩操作? (DBMR: 2081, DBMR: 2132)

~ 0 min
2016-03-03 04:30

在锁的粒度小于页锁的情况下,页压缩将会强制锁定整个页以将锁提升至页锁;但是锁粒度的提升会增加锁超时的机会,或者在更高的并发性上导致死锁。我们可以通过一些有效方法来减少内部的页压缩操作。

在以下两种情况下,将更容易发生数据库的页压缩。一种是包括VARCHA数据类型的表;另一种是表可以包括其它任何数据类型,但没有初始值,并且使用了DEFAULT NULL。

关于VARCHAR,它是varchar的特殊行为。varchar类型适合实际数据大小并始终不分配固定空间。所以在varchar类型下更新数据时,很容易导致原始大小不能满足新数据大小的需求,而需要寻找其它的连续空间。在页可用空间足够大但不连续的情况下,DBMaster服务器会自动通过压缩页来收集片段空间。数据库在进行页压缩的时候会强制性的将整个页锁住 ,然后试图使用该页空闲部分,在这个时候有可能real lock(deadlock 或者lock time-out)就发生了。

DBMaster数据库支持的其它数据类型,一开始它们的初始值就被设定为“DEFAULT NULL”,所以不用在表初始化中预设存储空间。当要把新的数据行添加其中时,DBMaster数据库会检查页中的连续可用空间。如上述情况。

为了减少页压缩,我们可以参考以下方法:

  1. 把varchar数据类型替换为char数据类型,并像其它数据类型一样设定数据初始值为NOT NULL。
  2. 调整填充因子的值为适当的值。
  3. 方法1和2 只是减少了发生页压缩的机会,但并不能彻底避免页压缩。如果方法1和2都不能满足需要,我们会视客户的要求来解决这个问题。

版本: DBMaster4.x, DBMaster5.x

产品: Normal / Bundle

平台: All

平均分: 0 (0 投票)

你不能对该内容发表评论

标签