表索引字段嵌套函数引起的性能问题
2009-06-05 16:12
162 查看
先看这句SQL
SELECT agentalias, COUNT (DISTINCT (callin))
FROM (SELECT agentalias, ani callin
FROM table_a
WHERE TO_DATE (starttime, 'yyyymmddhh24miss') BETWEEN TRUNC
(SYSDATE)
AND SYSDATE
AND connectlength > 0
AND agentalias = '4003'
UNION ALL
SELECT agentalias, connectno callout
FROM table_b
WHERE TO_DATE (starttime, 'yyyymmddhh24miss') BETWEEN TRUNC
(SYSDATE)
AND SYSDATE
AND connectlength > 0
AND LENGTH (TRIM (connectno)) > 5
AND agentalias = '4003')
GROUP BY agentalias
再看同样功能的SQL
SELECT agentalias, COUNT (DISTINCT (callin))
FROM (SELECT agentalias, ani callin
FROM table_a
WHERE starttime BETWEEN TO_CHAR (TRUNC (SYSDATE), 'yyyymmdd')
AND TO_CHAR (SYSDATE, 'yyyymmddhh24miss')
AND connectlength > 0
AND agentalias = '4003'
UNION ALL
SELECT agentalias, connectno callout
FROM table_b
WHERE starttime BETWEEN TO_CHAR (TRUNC (SYSDATE), 'yyyymmdd')
AND TO_CHAR (SYSDATE, 'yyyymmddhh24miss')
AND connectlength > 0
AND LENGTH (TRIM (connectno)) > 5
AND agentalias = '4003')
GROUP BY agentalias
table_a、table_b 表中 starttime 都是 index
执行结果中,第一个SQL很慢,查看查询计划走的是全表扫描,第二个SQL很快,因为走的索引
结论:通过SQL比较,发现在当在查询字段starttime,亦即index字段上加上函数后就会出现不走index而走全表扫描的情况。这里是不是可以得出如果在当index字段作为搜索条件时,如果在index上使用了函数那么该index将不会起到作用?
SELECT agentalias, COUNT (DISTINCT (callin))
FROM (SELECT agentalias, ani callin
FROM table_a
WHERE TO_DATE (starttime, 'yyyymmddhh24miss') BETWEEN TRUNC
(SYSDATE)
AND SYSDATE
AND connectlength > 0
AND agentalias = '4003'
UNION ALL
SELECT agentalias, connectno callout
FROM table_b
WHERE TO_DATE (starttime, 'yyyymmddhh24miss') BETWEEN TRUNC
(SYSDATE)
AND SYSDATE
AND connectlength > 0
AND LENGTH (TRIM (connectno)) > 5
AND agentalias = '4003')
GROUP BY agentalias
再看同样功能的SQL
SELECT agentalias, COUNT (DISTINCT (callin))
FROM (SELECT agentalias, ani callin
FROM table_a
WHERE starttime BETWEEN TO_CHAR (TRUNC (SYSDATE), 'yyyymmdd')
AND TO_CHAR (SYSDATE, 'yyyymmddhh24miss')
AND connectlength > 0
AND agentalias = '4003'
UNION ALL
SELECT agentalias, connectno callout
FROM table_b
WHERE starttime BETWEEN TO_CHAR (TRUNC (SYSDATE), 'yyyymmdd')
AND TO_CHAR (SYSDATE, 'yyyymmddhh24miss')
AND connectlength > 0
AND LENGTH (TRIM (connectno)) > 5
AND agentalias = '4003')
GROUP BY agentalias
table_a、table_b 表中 starttime 都是 index
执行结果中,第一个SQL很慢,查看查询计划走的是全表扫描,第二个SQL很快,因为走的索引
结论:通过SQL比较,发现在当在查询字段starttime,亦即index字段上加上函数后就会出现不走index而走全表扫描的情况。这里是不是可以得出如果在当index字段作为搜索条件时,如果在index上使用了函数那么该index将不会起到作用?
相关文章推荐
- oracle 10g recyclebin引起的dba_free_space性能问题
- Race Condition引起的性能问题 转
- FND: Debug Log Enabled引起的性能问题
- 循环中读取数据库、嵌套循环引起的性能问题
- 外键不加索引引起的性能问题
- jradius session lock引起的性能下降问题排查
- 记一次处理oracle分区表索引"乱用"引起的SQL性能问题
- gc cr引起的数据库性能问题
- Oracle数据类型引起的性能问题(已经解决)!
- StringBuffer使用不当,引起的性能问题
- Android性能优化(二)——context 引起的内存问题
- aix下 maxperm设置引起数据库性能问题
- Exception引起的性能问题
- Hibernate分页可能引起的性能问题
- 记一次线上事故,redis 的keys问题,cpu引起的性能问题
- 开启两个相同trace引起的性能问题
- 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题
- 一次由查询转换引起的性能问题的分析
- 数组初始化引起的性能问题
- Java和guava关于hashmap在初始化的时候最好给个初始容量,避免扩容引起性能问题的探究。