增强SQL语句性能的有关规范
1、 noholdlock的使用
noholdlock使服务器不持有在执行该select语句时所需的任何锁,而不考虑当前的有效事务隔离级。
holdlock通过在事务完成以前占有指定的表或视图的共享锁,使共享锁更具有限制性。
对于select操作应该仔细分析该查询操作是否必须持有对应表或视图的共享锁,在不需要持有指定的表或视图的共享锁的情况下,请注意select语法中对于每个无需持有共享锁的表或视图必须都加上自己的noholdlock选项,以提高并发性,编程的时候必须特别注意!
例如,如果事务隔离级别设置为 3 (这通常会导致 select 查询在事务结束前一直持有锁),以下命令在扫描离开页或行时释放锁:
select balance from account noholdlock where acct_number < 100
对于要检索多个无需持有共享锁的表或视图的select语句则应该在每个表或视图后加上自己的n
oholdlock选项。如:
select balance,price from account noholdlock,merchant noholdlock
where acct_number < 100
2、 set rowcount的使用
set rowcount <number>为用户的工作会话过程设置服务器的查询处理选项,使得服务器在查询影响到指定的行数后停止处理查询(select、insert、update或delete),注意该选项仅影响当前会话。set rowcount <number>的使用能有效地帮助我们将一个大事务分解为若干个小事务,当然要想处理所有符合查询处理条件的数据我们必须从应用逻辑上加以判断和控制,保证所有符合条件的数据被正确处理。
例如:set rowcount 4
      select title_id,price from titles 则即使titles表中有成千上万条的记录也会在查询影响前面的四行后停止查询。
若要在当前会话取消该选项,使用 set rowcount 0 即可。
3、 尽量少使用游标
在使用游标时如果没有使用set cursor rows命令指定执行一次fetch返回的行或是没有考虑到一次fetch操作可能返回非常多的数据行,就容易产生大事务操作,从而加剧资源的竞争。另外,声明、打开、使用、关闭游标也是一个相当繁琐的过程,会消耗一定的系统资源。建议在编程中尽量少使用游标,在使用游标的时候一定要考虑使用技巧避免产生大事务操作。
例如,如果估计打开一个cursor返回的数据量远远超过1000条,则应该适当地选择拆分条件使得打开cursor返回的数据量在1000左右,这将极大地提高游标循环处理的性能,有效地避免大事务操作;如果相同的应用逻辑可以不使用游标来处理实现,则尽量避免使用游标。
4、 必须避免大事务操作
大事务操作必然引起数据库log的大量使用和锁资源的长时间占用,这样会引起锁资源的竞争阻塞其他的事务;log的大量使用在严重的情况下会用完所有的log设备,导致必须增加或扩充log设备,极端情况下如果处理不当会诱发灾难性的数据库服务器事故。编程中务必避免大
事务!
批处理中事务如果不大(参考值:单条语句的数据库修改操作10万条以下)则可以不改变现有处理模式,可以仍然采用一次提交;
批处理中如果采用通过游标进行后续循环处理得话,则参考值为1000条;
如果要处理的记录较大也建议做事务拆分
sql语句的功能有      例如:一组操作中包含:delete selectinsert等三个操作,一共有20000条记录;
      1) 如果记录间没有关联关系,则可以考虑将20000条记录delete操作commit一次,然后insert操作commit一次,这也是一种拆分方式;(这种模式对表锁释放有利,会提高处理效率);
      2)如果一组操作间有很大的关联关系无法拆分,而且记录数又非常多,请将这类问题提交给相应的应用开发部门,应用开发部门将会联系技术总监室从应用角度和系统角度综合考虑给出合理的解决方案。
5、 CICS联机交易中不建议使用存储过程
    CICS对数据库的访问有自己完备的事务一致性保障,从编程的规范性考虑 CICS联机交易中不建议使用存储过程。