`
tomrose
  • 浏览: 145213 次
  • 来自: ...
社区版块
存档分类
最新评论

简单查询语句性能优化

阅读更多

 

 SQL 性能的优化
 ------------------------------------------
 1.1 IN 操作符

    用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格。

    但是用IN的SQL性能总是比较低的,从ORACLE执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别:

    ORACLE试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采用

    多个表的连接方式查询。

    由此可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。

    推荐方案:在业务密集的SQL当中尽量不采用IN操作符而使用EXISTS。

    1.2 NOT IN操作符

    此操作是强列推荐不使用的,因为它不能应用表的索引。

    推荐方案:用NOT EXISTS代替

    1.3 <> 操作符(不等于)

    不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。

    推荐方案:用其它相同功能的操作运算代替,如

    a<>0 改为 a>0 or a<0
    a<>’’ 改为 a>’’

    1.4 IS NULL 或IS NOT NULL操作(判断字段是否为空)

    判断字段是否为空一般是不会应用索引的,因为B树索引是不索引空值的。

    推荐方案:

    用其它相同功能的操作运算代替,如

    a is not null 改为 a>0 或a>’’等。

    不允许字段为空,而用一个缺省值代替空值。

    1.5 > 及 < 操作符(大于或小于操作符)

    大于或小于操作符一般情况下是不用调整的,因为它有索引就会采用索引查找,但有的情况下可以对它进行优化,

    如一个表有100万记录,一个数值型字段A,30万记录的A=0,30万记录的A=1,39万记录的A=2,1万记录的A=3。

    那么执行A>2与A>=3的效果就有很大的区别了,因为A>2时ORACLE会先找出为2的记录索引再进行比较,而A>=3时ORACLE则直接找到=3的记录

    索引。

    1.6 LIKE操作符

    LIKE操作符可以应用通配符查询,里面的通配符组合可能达到几乎是任意的查询,但是如果用得不好则会产生性能上的问题,

    如LIKE ‘%5400%’ 这种查询不会引用索引,而LIKE ‘X5400%’则会引用范围索引。

    一个实际例子:用YW_YHJBQK表中营业编号后面的户标识号可来查询营业编号 YY_BH LIKE ‘%5400%’ 这个条件会产生全表扫描,

    如果改成YY_BH LIKE ’X5400%’ OR YY_BH LIKE ’B5400%’ 则会利用YY_BH的索引进行两个范围的查询,性能肯定大大提高。

    1.7 UNION操作符

    UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。

    select * from gc_dfys
    union
    select * from ls_jg_dfys

    这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会

    导致用磁盘进行排序。

    推荐方案:

    采用UNION ALL操作符替代UNION,因为UNION ALL操作只是简单的将两个结果合并后就返回。

    select * from gc_dfys
    union all
    select * from ls_jg_dfys

    1.8 group by用法

    Oracle的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句。

    select topicid,userid,sum(counter) from cis_topic_stat group by rollup(topicid,userid);

    也就是说,如果是ROLLUP(A, B, C)的话,首先会对(A、B、C)进行GROUP BY,然后对(A、B)进行GROUP BY,

    然后是(A)进行GROUP BY,最后对全表进行GROUP BY操作。

    select topicid,userid,sum(counter) from cis_topic_stat group by cube(topicid,userid);

    和ROLLUP相比,CUBE又增加了对STATUS列的GROUP BY统计。

    如果是GROUP BY CUBE(A, B, C),则首先会对(A、B、C)进行GROUP BY,然后依次是(A、B),(A、C),(A),(B、C),(B),(C),

    最后对全表进行GROUP BY操作。

    1.9 如何使用Hint提示

    在select/delete/update后写/*+ hint */

    如 select /*+ index(TABLE_NAME INDEX_NAME) */ col1...

    注意/*和+之间不能有空格

    如用hint指定使用某个索引

    select /*+ index(cbotab) */ col1 from cbotab;
    select /*+ index(cbotab cbotab1) */ col1 from cbotab;
    select /*+ index(a cbotab1) */ col1 from cbotab a;

    其中

    TABLE_NAME是必须要写的,且如果在查询中使用了表的别名,在hint也要用表的别名来代替表名;

    INDEX_NAME可以不必写,Oracle会根据统计值选一个索引;

    如果索引名或表名写错了,那这个hint就会被忽略;
分享到:
评论
1 楼 huanghanjun 2008-08-14  
    

相关推荐

    SQL语句性能优化

    《SQL语句性能优化》有些程序员在撰写数据库应用程序时,常专注于 OOP 及各种 framework 的使用,却忽略了基本的 SQL 语句及其「性能 (performance) 优化」问题。曾听过台湾某半导体大厂的新进程序员,所组出来的一...

    oracle性能优化之SQL语句优化

    oracle性能优化中SQL语句优化,简单的优化思想、常见的优化命令

    JAVA-SQL语句优化.doc

    在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前系统需要解决的...

    SQL语句优化提高数据库性能

    为了获得稳定的执行性能,SQL语句越简单越好。对复杂的SQL语句,要设法对之进行简化,本文给大家介绍优化SQL语句提高数据库性能,对sql语句优化性能优化相关知识感兴趣的朋友一起学习吧

    MySQL查询性能优化

    有了这些概念,我们就来看看如何优化查询。 二、慢查询基础:优化数据访问 通常查询慢的原因,我们可以简单地分为以下两类: 1. 确认程序是否需要检索大量超过需要的数据,这通常意味着访问了太多的行,也可能是...

    MySQL DBA性能优化文档每天必看

    除了上述方法外,还有其他一些优化方法,例如,优化索引、优化查询语句、优化存储引擎等。这些方法可以根据实际情况进行调整和优化。 MySQL DBA 性能优化是一个复杂的过程,需要根据实际情况进行调整和优化。需要...

    mysql的explain分析sql语句性能(慢查询和加没加索引)

    MySQL 的 Explain 分析 SQL 语句性能是数据库性能优化的重要工具之一。通过 Explain 命令可以分析 SQL 语句的执行计划,了解 SQL 语句的执行过程,找出性能瓶颈,并对其进行优化。 Explain 命令的使用格式为:...

    Oracle+SQL性能优化40条.docx

    Oracle SQL 性能优化 40 条 以下是 Oracle SQL 性能优化 40 条的知识点总结: 一、SQL 语句执行步骤 * 语法分析:检查 SQL 语句的语法正确性 * 语义分析:分析 SQL 语句的逻辑含义 * 视图转换:将 SQL 语句转换为...

    Oracle SQL性能优化方法研究.docx

    因此, Database Administrator 需要掌握 Oracle SQL性能优化的方法来提高数据库的性能,减少查询时间,提高用户体验。 综述: Oracle SQL性能优化的方法可以从多个方面入手,包括:数据库架构优化、SQL语句优化、...

    MySQL架构执行与SQL性能优化 MySQL高并发详解 MySQL数据库优化训练营四期课程

    MySQL架构执行与SQL性能优化-MySQL高并发详解课程,课程的目标简单明确,核心就是MySQL的性能优化与高并发。课程内容进行了精华的浓缩,有四大内容主旨,MySQL架构与执行流程,MySQL索引原理详解,MySQL事务原理与...

    ORACLE培训SQL性能优化.pptx

    ORACLE 培训 SQL 性能优化 在本课程中,我们将深入探讨 SQL 语句执行的过程、ORACLE 优化器、表之间的关联、如何得到 SQL 执行计划、如何分析执行计划等内容,帮助大家逐步掌握 SQL 优化的过程。 首先,让我们了解...

    MySQL中(JOIN/ORDER BY)语句的查询过程及优化方法

    sql语句性能达不到你的要求,执行效率让你忍无可忍,一般会造成很多影响。那么我们如何解决这些问题呢,下面由小编来和大家简单讲下

    Oracle语句优化30个规则详解

     可惜的是ORACLE只对简单的表提供高速缓冲(cache buffering) ,这个功能并不适用于多表连接查询。  数据库管理员必须在init.ora中为这个区域设置合适的参数,当这个内存区域越大,就可以保留更多的语句,当然被...

    SQL性能优化

    1 性能优化 1.1 避免频繁 commit,尤其是把 commit 写在循环体中每次循环都进行commit。 1.2 使用绑定变量,避免常量的直接引用。 示例:以下书写不符合本规范。 INSERT INTO sm_users (user_id, user_name, ...

    数据库系统概论-第九章关系查询处理和查询优化.ppt

    好的查询优化方法可以提高系统的性能和效率,而不好的查询优化方法可能会导致系统的性能下降。 关系查询处理和查询优化是数据库系统中两个非常重要的方面,它们直接影响了系统的性能和效率。 поэтому,关系...

    关于Oracle多表连接,提高效率,性能优化操作

    这是因为ORACLE只对简单的表提供高速缓冲(cache buffering) ,这个功能并不适用于多表连接查询..数据库管理员必须在init.ora中为这个区域设置合适的参数,当这个内存区域越大,就可以保留更多的语句,当然被共享的可能性...

    2021年数据库题库语句题.docx

    * 数据库性能优化:了解数据库性能优化的方法和技术,包括查询优化、索引优化、系统配置优化等。 本文档涵盖了数据库题库语句题的相关知识点,旨在帮助读者快速了解和掌握数据库设计、SQL语句、数据类型、查询优化...

    ORACLE SQL性能优化系列

    可惜的是ORACLE只对简单的表提供高速缓冲(cache buffering) ,这个功能并不适用于多表连接查询. 数据库管理员必须在init.ora中为这个区域设置合适的参数,当这个内存区域越大,就可以保留更多的语句,当然被共享的可能...

    ORACLE SQL性能优化

    ORACLE SQL性能优化 通过init.ora文件中OPTIMIZER_MODE声明 RULE (基于规则) 所遵循的是Oracle内部预定的一些规则。比如当一个where子句中的一列有索引时去走索引。 COST (基于成本) 你必须经常运行analyze ...

Global site tag (gtag.js) - Google Analytics