四.关于性能优化
好的性能同优良的数据库设计及优秀的程序写法关系极大,可以这样说,如果一个数据库没有好的设计及对程序未进行优化的话即使对参数进行调整也不可能有好的性能。在http://www.isug.com/Sybase_FAQ/ASE/section1.5.html中有说过客户端应用程序和数据库的物理设计决定了性能的80%。
对于系统管理所能够做的就是减少IO,缩短响应时间。在性能优化方面程序员同DBA的工作有时是重叠的,例如,判断索引是否必须,索引类型是否正确。监视数据库的运行判断是否优化!
总的来说,性能的提升就是缩短响应时间和提高吞吐量。Sybase的查询优化是基于开销的计算的。索引的使用可以:
1. 避免表扫描。
2. 点查询中定位包含特定资料的特定资料页。
3. 范围查询确定上下限。
4. 索引覆盖,完全避免存取数据页。
5. 连接时避免排序。
建立索引的注意事项:
1.Unique和primary key可以创建唯一索引,缺省情况下unique创建nonclustered,primary key创建clustered索引。
2.Allpages表一般都需要创建clustered索引或分区以减少最后一页的争夺。
3.如果需要大量插入,不要将clustered索引建立在单调上升的字段上,如identity。对于dol表,此问题并不严重,但allpages却往往是锁争夺的根源。
4.对allpages表,如有可能不要将clustered索引建立在频繁更新的字段上。
5.使用索引覆盖来进行关键查询和不太频繁的查询。
6.如果索引字段元唯一建立唯一索引,优化程序知道只有一行纪录匹配。
7.索引键尽可能小,如果可能使用最小的数据类型。确保连接字段元数据类型相同,如果连接查询需要转换数据类型就不能使用索引。
8.使用索引尽可能使用前导字段元能够提供良好的性能。
锁带来的性能冲突:
1.一个事务等待另外的事务完成并释放锁影响响应时间和吞吐量。
2.事务频繁死锁,累计CPU时间少的事务必须重新再来。并且会严重影响相应时间同吞吐量。
改善锁冲突的建议:
1.添加索引减少争用。
2.保持事务短小以减少持有锁的时间。
3.避免热点。可通过表分区和clustered索引解决。
4.应用以相同顺序获得所以减少死锁的发生。在使用大量表和更新几个表的事务中应确定一个由所有开发人员共享的锁定顺序。
5.延迟死锁检测,”deadlock checking period”指定开始检查死锁前进程必须等待的毫秒数。
6.使用应用程序的最低锁定级。只在必要时使用隔离级别2或3。如果仅有几个查询需要级别3则在整个事物中使用holdlock或at isolotion,而不用set transaction isolotion at 3。如果绝大部分的查询需要级别3则使用set transaction isolotion at 3,而可以在查询级别1的查询使用holdlock或at isolation。
7.如果需要大量的查询,更新和删除,可通过在存储过程中使用光标频繁提交来减少阻塞。
8.如果应用程序需要返回一行,等待用户反应然后更新该行,可考虑使用时间戳或者tsequal函数而不要使用holdlock。
9.检查是否存在并发问题。