操作员优化
IN运算符
SQL用IN写的好处是写起来简单明了,比较适合现代软件开发的风格。
然而,带有IN的SQL的性能总是很低。从oracle执行的步骤中分析带in的SQL与不带IN的SQL有以下区别:
ORACLE试图将其转换为多个表的连接。如果转换不成功,将首先执行in中的子查询,然后查询外部表记录。如果转换成功,多个表的连接将直接用于查询。可以看出,带IN的SQL至少多了一个转换过程。一般情况下,SQL可以转换成功,但是对于包含分组统计的SQL,不能转换。
建议:尽量不要在业务密集型SQL中使用IN操作符。
不在运算符中
不建议对强列执行此操作,因为它不能应用表的索引。
推荐方案:用不存在或(外部连接判断为空)方案代替。
运算符(不等于)
不等式运算符永远不会使用索引,因此处理它只会产生全表扫描。
建议:用其他功能相同的操作代替,比如
将a0更改为a0或a0
“”已更改为“”
IS NULL或IS NOT NULL操作(确定字段是否为空)
通常,不会应用索引来确定字段是否为空,因为B树索引不会索引空值。
推荐方案:
请使用具有相同功能的其他操作,例如
Is not null更改为a0或a ' '等等。
不允许该字段为空,而是使用默认值代替空值。例如,如果业务扩展应用程序中的状态字段不允许为空,则默认值为该应用程序。
建立位图索引(分区表无法建立,位图索引难以控制。比如字段值太多会降低索引的性能,多人更新操作会增加数据块锁的现象)
And运算符(大于或小于运算符)
一般情况下,大于或小于运算符不需要调整,因为会按索引进行搜索,但在某些情况下可以优化,比如一个有100万条记录的表,一个数值字段A,30万条记录的A=0,30万条记录,1,39万条记录的A=2,100条记录=3。那么执行A2的效果和A=3的效果就大不一样了,因为在A2中,ORACLE会找到2的记录索引然后进行比较,而在A=3中,ORACLE会直接找到=3的记录索引。
LIKE运算符
通配符查询可以应用于LIKE操作符,其中通配符的组合可能几乎是任意查询,但如果用不好,就会造成性能问题。例如,like' t00% '不会引用索引,而like' x5400% '会引用范围索引。一个实际的例子:像' T00% '这样的业务号YY_BH,可以用YW_YHJBQK表中业务号后面的账户识别号来查询。这种情况将导致全表扫描。如果改成像' X5400% '这样的YY _ BH或者像' B5400% '这样的YY _ BH,用YY _ BH的索引在两个范围内查询,性能肯定会有很大提升。