数据库任务重构

在SQL擅长的地方使用SQL。如果是SQL很容易就能完成的事,就没必要在代码中做这种事,譬如汇总。SQL能更快地处理数据。设计SQL就是为了做这些事的。
假定成功。先执行后检查执行是否像预期的那样起了作用。
更改代码结构。如果接连有两条语句访问同一个表,那么你必须质疑该程序在这两条语句之间所做的事情是否有足够的理由对数据库服务器访问两次。
合并语句。通常只要在where子句中加上or和聪明的使用case,就能将运行时间缩短2倍、3倍或更多倍,这就看你能将多少条语句合在一起了
使用汇总
用coalesce()或nvl()代替if ... is null
使用异常。避免多次访问同一张表,条件判断在异常处理块内解决
逻辑变换。即使不能将其改成一条语句,一点改进也能带来显著的改进。
select from A where ...
test on result of the query
if some condition
  update table B
else
  update table C

如果更新表C是最常发生的情况,并且执行包含查询语句的更新操作比"先执行查询再更新"更快,那么下面代码可能执行得更快
update table C where (includes condition on A)
if nothing is updated then
  update table B


去掉count()。放到获取记录的sql中,例如count(*) over(...)
避免过度。是否执行一条语句的决策权属于调用程序。更值得关注的是那些要根据查询结果进行分支的情形,其结构快类似于下面这段代码:
select c1, ...
  into var1, ...
  from T
 where ...
if (var1 = ...)
then
  New operations against the database
end if;

去掉循环。

猜你喜欢

转载自wanglei8.iteye.com/blog/1545127