Sybase ASE 优化常见问答
对于数据量庞大的表而言,统计信息更新可能会对生产系统带来较大的影响,可以采用两种方式来降低此影响。
方式一、使用采样;
方式二、将数据库DUMP/LOAD到另一机器(比如failover的备机),在该机器上更新统计信息,然后使用 optdiag 导入/导出统计信息。
经常听到这样的说法:系统慢,出现好多死锁。
这里面存在概念性的错误。死锁,英文为
deadlock;锁阻塞英文为
lock block。
何谓锁阻塞?打个比方,食堂里排队买饭,打饭窗口只有一个师傅,于是排队打饭的人得一个个依次序来。碰上一个麻烦的,在窗口前挑上半天,队列老是不走,这就是阻塞。死锁呢,还是打个比方,你左手上拿个苹果,同事左手上拿个梨;你右手去拿同事左手上的梨,同事右手去拿你左手上的苹果。两个都不相让,结果是一直僵持,除非有外力来解除。这就是死锁。
对于死锁,数据库(基本上是任何数据库)是有自动解除机制的,换句话说,用户是很难“看”到死锁的。锁阻塞则不同,数据库本身不加干涉,需要人工处理,通常也能自行解除。需要注意的是,在繁忙系统中,当一个锁阻塞发生一段时间后,极有可能导致一连串的锁阻塞。显然,这是我们能“看”到的。
对于 ASE 数据库,死锁是会输出到错误日志的,选项
print deadlock information允许输出详细的信息。锁阻塞可以通过sp_who或sp_lock发现。
不论是死锁,还是锁阻塞,都应从应用的代码上找原因。对于死锁,应避免对资源的调用顺序不一致,从而导致资源调用发生循环。对于锁阻塞,应查找导致性能低的因素,从SQL语句上和数据库结构上予以优化。
另外,如果表的锁类型为APL,可调整为DOL,然后再观察。
补充:一个DB2的DBA朋友给了一个很有趣的例子来说明死锁与锁阻塞:阻塞就是二环堵车了,死锁就是两个车撞了等待交警处理。
--
FlybeanZhou - 30 Nov 2006