Oracle Where子句研究结论 |
本文标签:Oracle Where子句 在向大家详细介绍Oracle Where子句之前,首先让大家了解下ORDER BY子句,然后全面介绍用Oracle Where子句替代ORDER BY: Oracle Where子句使用的索引和ORDER BY子句中所使用的索引不能并列 。例如: 表DEPT包含以下列:
避免改变索引列的类型: 当比较不同数据类型的数据时, Oracle自动对列进行简单的类型转换 。 假设 EMPNO是个数值类型的索引列:SELECT … FROM EMP WHERE EMPNO = ‘123 。 实际上,经过Oracle类型转换, 语句转化为: SELECT … FROM EMP WHERE EMPNO = TO_NUMBER(‘123) 。 幸运的是,类型转换没有发生在索引列上,索引的用途没有被改变 。现在,假设EMP_TYPE是个字符类型的索引列:SELECT … FROM EMP WHERE EMP_TYPE = 123 。 这个语句被Oracle转换为: SELECT … FROM EMP WHERETO_NUMBER(EMP_TYPE)=123 。因为内部发生的类型转换,这个索引将不会被用到! 为了避免Oracle对您的SQL进行隐式的类型转换,最好把类型转换用显式表现出来 。注意当字符和数值比较时,Oracle会优先转换数值类型到字符类型 。 需要当心的Oracle Where子句: 某些SELECT 语句中的Oracle Where子句不使用索引 。这里有一些例子: 避免使用耗费资源的操作: 带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句会启动SQL引擎执行耗费资源的排序(SORT)功能 。DISTINCT需要一次排序操作,而其他的至少需要执行两次排序 。通常,带有 UNION, MINUS , INTERSECT的SQL语句都能够用其他方式重写 。假如您的数据库的SORT_AREA_SIZE调配得好 。使用UNION , MINUS, INTERSECT也是能够考虑的, 毕竟他们的可读性很强 。 |