DB2 LUW SQL 调优指南
2010-02-04 00:00:00 来源:WEB开发网在 Optimized Statement 中应该看到选择谓词 c1 between 2000 and 2009 被下推到 Union All 里面变成:
select * from (select * from T1 where c1 between 2000 and 2009 union all
select * from T2 where c1 between 2000 and 2009) as V1
如果没有下推,可能是由于选择谓词过于复杂,也可能是 DB2 的查询重写器无法判定下推谓词是否会提高效率。这时候如果确信下推后会产生较好的计划,可以手动改变 SQL 的书写形式。还可以试试适当提高优化级别,可能会使原来没有下推的谓词被下推。
5. 子查询
检查子查询的使用是否合理。在 SQL 语言中,当一个查询语句嵌套在另一个查询的查询条件中时,称为子查询。如果一个列同时出现在外部查询和 Where 子句中,很可能当外部查询中的列值改变之后,子查询必须重新查询一次。查询嵌套的层次越多,效率越低,因此应当尽量避免子查询。如果子查询不可避免,那么首先要在子查询中过滤掉尽可能多的行,其次考虑将子查询转换成连接。子查询转换为连接后,可以使 DB2 有机会考虑更多的连接方法和连接顺序,甚至使索引得以利用,从而生成更优的计划。特别是 Exist 和 IN 子句,可以方便的转换成连接。例如,
select * from T1 where exists(select * from T2 where T1.c1 = T2.c1)
可以转换为,
select distinct T2.c1, T1.* from T1, T2 where T1.c1 = T2.c1
注意:除非 T2.c1 有唯一性(unique),否则关键词 distinct 是必须的,这是为了保证最终结果和原来的 SQL 一致。
6. Fetch First N Rows Only 的使用
- ››sql server自动生成批量执行SQL脚本的批处理
- ››sql server 2008亿万数据性能优化
- ››SQL Server 2008清空数据库日志方法
- ››sqlserver安装和简单的使用
- ››SQL Sever 2008 R2 数据库管理
- ››SQL SERVER无法安装成功,sqlstp.log文件提示[未发...
- ››Sql Server中通过父记录查找出所有关联的子记录
- ››SqlServer触发器、存储过程和函数
- ››SQL Server 中的事务(含义,属性,管理)
- ››Sqlite数据库插入和读取图片数据
- ››Sql server 2005拒绝了对对象 'xx表' (数...
- ››Sql server 2005拒绝了对对象 'xx表' (数...
更多精彩
赞助商链接