知识大全 ORACLE SQL性能优化系列 (十三)

Posted 索引

篇首语:也许就是那么一颗不甘服输的心带着我奋斗下去!本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 ORACLE SQL性能优化系列 (十三)相关的知识,希望对你有一定的参考价值。

ORACLE SQL性能优化系列 (十三)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

   用WHERE替代ORDER BY  ORDER BY 子句只在两种严格的条件下使用索引     ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序     ORDER BY中所有的列必须定义为非空     WHERE子句使用的索引和ORDER BY子句中所使用的索引不能并列     例如:        表DEPT包含以下列:         DEPT_CODE PK NOT NULL         DEPT_DESC NOT NULL         DEPT_TYPE NULL         非唯一性的索引(DEPT_TYPE)        低效: (索引不被使用)           SELECT DEPT_CODE           FROM DEPT           ORDER BY DEPT_TYPE        EXPLAIN PLAN:           SORT ORDER BY              TABLE ACCESS FULL        高效: (使用索引)           SELECT DEPT_CODE           FROM DEPT         WHERE DEPT_TYPE >     EXPLAIN PLAN:        TABLE ACCESS BY ROWID ON EMP            INDEX RANGE SCAN ON DEPT_IDX        ORDER BY 也能使用索引! 这的确是个容易被忽视的知识点 我们来验证一下:     SQL> select * from emp order by empno;     Execution Plan            SELECT STATEMENT Optimizer=CHOOSE       TABLE ACCESS (BY INDEX ROWID) OF EMP       INDEX (FULL SCAN) OF EMPNO (UNIQUE)      避免改变索引列的类型  当比较不同数据类型的数据时 ORACLE自动对列进行简单的类型转换     假设 EMPNO是一个数值类型的索引列     SELECT …     FROM EMP     WHERE EMPNO =     实际上 经过ORACLE类型转换 语句转化为:     SELECT …     FROM EMP     WHERE EMPNO = TO_NUMBER( )     幸运的是 类型转换没有发生在索引列上 索引的用途没有被改变     现在 假设EMP_TYPE是一个字符类型的索引列     SELECT …     FROM EMP     WHERE EMP_TYPE =     这个语句被ORACLE转换为:     SELECT …     FROM EMP     WHERE TO_NUMBER(EMP_TYPE)=     因为内部发生的类型转换 这个索引将不会被用到!     为了避免ORACLE对你的SQL进行隐式的类型转换 最好把类型转换用显式表现出来 注意当字符和数值比较时 ORACLE会优先转换数值类型到字符类型      需要当心的WHERE子句   某些SELECT 语句中的WHERE子句不使用索引 这里有一些例子     在下面的例子里 != 将不使用索引 记住 索引只能告诉你什么存在于表中 而不能告诉你什么不存在于表中     不使用索引:     SELECT ACCOUNT_NAME     FROM TRANSACTION     WHERE AMOUNT != ;     使用索引:     SELECT ACCOUNT_NAME     FROM TRANSACTION     WHERE AMOUNT > ;     下面的例子中 || 是字符连接函数 就象其他函数那样 停用了索引     不使用索引:     SELECT ACCOUNT_NAME AMOUNT     FROM TRANSACTION     WHERE ACCOUNT_NAME||ACCOUNT_TYPE= AMEXA ;     使用索引:     SELECT ACCOUNT_NAME AMOUNT     FROM TRANSACTION     WHERE ACCOUNT_NAME = AMEX     AND ACCOUNT_TYPE= A ;     下面的例子中 + 是数学函数 就象其他数学函数那样 停用了索引     不使用索引:     SELECT ACCOUNT_NAME AMOUNT     FROM TRANSACTION     WHERE AMOUNT + > ;     使用索引:     SELECT ACCOUNT_NAME AMOUNT     FROM TRANSACTION     WHERE AMOUNT > ;     下面的例子中 相同的索引列不能互相比较 这将会启用全表扫描     不使用索引:     SELECT ACCOUNT_NAME AMOUNT     FROM TRANSACTION     WHERE ACCOUNT_NAME = NVL(:ACC_NAME ACCOUNT_NAME);     使用索引:     SELECT ACCOUNT_NAME AMOUNT     FROM TRANSACTION     WHERE ACCOUNT_NAME LIKE NVL(:ACC_NAME % );     如果一定要对使用函数的列启用索引 ORACLE新的功能: 基于函数的索引(Function Based Index) 也许是一个较好的方案     CREATE INDEX EMP_I ON EMP (UPPER(ename)); /*建立基于函数的索引*/     SELECT * FROM emp WHERE UPPER(ename) = BLACKSNAIL ; /*将使用索引*/ cha138/Article/program/Oracle/201311/17864

相关参考

知识大全 Oracle SQL性能优化系列学习三

OracleSQL性能优化系列学习三  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!正在看的ORAC

知识大全 oracle认证辅导:oracle优化和管理sql1

  oracle认证辅导oracle优化和管理sql  查看当前正在执行的等待情况  SELECTTAsid  TAseq#  TBUsername  TBTerminal  TBProgram  D

知识大全 Oracle中优化SQL的原则

Oracle中优化SQL的原则  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  已经检验的语句和已

知识大全 ORACLE优化SQL语句,提高效率(2)

ORACLE优化SQL语句,提高效率(2)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  索引是

知识大全 oracle数据库sql的优化总结

  自己对oraclesql的一些优化总结自己也记录下来也希望对大家有帮助  一使用where少使用having;  二查两张以上表时把记录少的放在右边;  三减少对表的访问次数;  四有where子

知识大全 SQL Server 性能优化工具

SQLServer性能优化工具  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  数据和工作负荷示例

知识大全 系统优化中SQL的性能如何调整

系统优化中SQL的性能如何调整  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一问题的提出   

知识大全 SQL Server 性能优化的原则

SQLServer性能优化的原则  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  使SQLServ

知识大全 高手详解SQL性能优化十条经验

高手详解SQL性能优化十条经验  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  查询的模糊匹配  

知识大全 九大Oracle性能优化基本方法详解

九大Oracle性能优化基本方法详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Oracle