首页 理论教育数据库性能管理与调优:正确使用SQL技巧

数据库性能管理与调优:正确使用SQL技巧

【摘要】:1)例子(一)正确使用SQL的例子(一)如图5-12所示。因此B.ORDD = : TrDay或B.ORDD = : WorkDay的扫描范围较窄,使用索引时响应速度非常快。在这种情况下,优化器使用OR从内部分为两个SQL语句并各自使用索引,再将执行结果合并为一个结果。图5-13正确使用SQL的例子(二)问题:连接的两个表的条件中决定扫描范围的条件是"AND SUBSTR LIKE : IN_org_cd AND SUBSTR < 600000"。因此可按以下方法变更条件公式并使用相应索引。

1)例子(一)

正确使用SQL的例子(一)如图5-12所示。

图5-12 正确使用SQL的例子(一)

(1)问题:在上述SQL中,ORDD是唯一性较好的列。因此B.ORDD = : TrDay或B.ORDD = : WorkDay的扫描范围较窄,使用索引时响应速度非常快。但当上述SQL中B.ORDD, B.RSV ORD_DVCD的值等于‘02’时应与:TrDay比较,否则应与:WorkDay比较。因此创建的条件公式为 B.ORDD=DECODE(B.RSV_ORD_DVCD,'02',:TrDay, :WorkDay)。但条件公式的两边是列时优化器会判断无法使用索引。此时上述条件与输入值无关,会对表进行全范围扫描,因此响应速度较慢。

(2)解决方案:可通过OR将以上条件分为两个条件。在这种情况下,优化器使用OR从内部分为两个SQL语句并各自使用索引,再将执行结果合并(CONCATENATION)为一个结果。

2)例子(二 )(www.chuimin.cn)

正确使用SQL的例子如图5-13所示。

图5-13 正确使用SQL的例子(二)

(1)问题:连接的两个表的条件中决定扫描范围的条件是"AND SUBSTR (A.AC_NO, 1, 3)LIKE : IN_org_cd AND SUBSTR (A.ac_ no, 4, 6) < 600000"。但因对列使用函数所以无法应用索引,即便条件的扫描范围较窄也无法改善响应速度(AC_NO由11位字符构成,后面8位字符保存为数字值)。

(2)解决方案:条件子句AND SUBSTR (A.ac_no,4,6) <'600000'解析后与BETWEEN'000001'| |' 00'和599999'| |' 99'相同。因此可按以下方法变更条件公式并使用相应索引。