SQL语言艺术(二)发动战争:高效访问数据库
这一章描述了高效访问数据库的基本原则,在战略大局上把握高性能的关键因素
查询识别
程序设计上应该考虑查询识别,即根据SQL讯速定位到调用该SQL的应用程序代码,有助于定位性能问题
减少于数据库交互的次数
使用连接池,避免反复建立数据库连接。连接建立后,尽量批量提交SQL,减少于数据库交互的次数
大局上跳出业务逻辑的限制
把握大局,跳出业务逻辑的限制。SQL是声明性语言,所以设法使你的代码超越业务过程的规格说明,尽量用一条SQL完成所需的操作,减少对表的重复访问,避免建立临时表,中间结果等。尽量避免借助cursor进行循环操作。
保持schema稳定
尽量不要在应用程序中使用DDL来改变Schema,DDL的作用是以核心数据库的数据字典为基础的,数据字典是所有数据库操作的中心,任何对数据字典的操作都会引起全局加锁,对系统性能影响巨大。唯一可以接受的DDL操作是对table进行truncate,它能极快地清空表中所有的数据,但是truncate操作无法通过回滚恢复
慎用自定义函数
自带函数比任何第三方代码更接近数据库核心,效率也更高些,SQL离核心越近,运行得越快。对自定义函数更应该谨慎,因为优化器对定义函数的代码无能为力
数据库负载符合业务逻辑的特性
数据库要符合业务逻辑的特性,于当时正在进行的业务活动保持合理一致性,如果查询customer表的次数比同一时间正在处理的客户量多20倍,则很有可能对表进行了重复访问,而不是一次性找出所需的信息
进攻式编程
一般情况下我们进行防御编程,先检查条件的合法性,再执行操作,对数据库编程而言,进攻式编程有切实的优势。比如插入数据的时候,我们很可能会先selectcount(*)来判断数据是否已存在,如果不存在再执行insert,好的作法是直接insert,再根据更新的行数来判断有无重复。乐观锁就属于进攻式编程,先假设更新无冲突,再检查执行结果,只有冲突真的发生时才进行控制处理,乐观锁比悲观锁吞吐量高得多