`
wanghaopk
  • 浏览: 48702 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

高手详解SQL性能优化十条经验

 
阅读更多

1.查询的模糊匹配

尽量避免在一个复杂查询里面使用 LIKE '%parm1%'—— 红色标识位置的百分号会导致相关列的索引无法使用,最好不要用.

解决办法:

其实只需要对该脚本略做改进,查询速度便会提高近百倍。改进方法如下:

a、修改前台程序——把查询条件的供应商名称一栏由原来的文本输入改为下拉列表,用户模糊输入供应商名称时,直接在前台就帮忙定位到具体的供应商,这样在调用后台程序时,这列就可以直接用等于来关联了。

b、直接修改后台——根据输入条件,先查出符合条件的供应商,并把相关记录保存在一个临时表里头,然后再用临时表去做复杂关联

2.索引问题

在做性能跟踪分析过程中,经常发现有不少后台程序的性能问题是因为缺少合适索引造成的,有些表甚至一个索引都没有。这种情况往往都是因为在设计表时,没去定义索引,而开发初期,由于表记录很少,索引创建与否,可能对性能没啥影响,开发人员因此也未多加重视。然一旦程序发布到生产环境,随着时间的推移,表记录越来越多

这时缺少索引,对性能的影响便会越来越大了。

这个问题需要数据库设计人员和开发人员共同关注

法则:不要在建立的索引的数据列上进行下列操作:

◆避免对索引字段进行计算操作

◆避免在索引字段上使用not,<>,!=

◆避免在索引列上使用IS NULL和IS NOT NULL

◆避免在索引列上出现数据类型转换

◆避免在索引字段上使用函数

◆避免建立索引的列中使用空值。

3.复杂操作

部分UPDATE、SELECT 语句 写得很复杂(经常嵌套多级子查询)——可以考虑适当拆成几步,先生成一些临时数据表,再进行关联操作

4.update

同一个表的修改在一个过程里出现好几十次,如:

update table1
set col1=...
where col2=...;
update table1
set col1=...
where col2=...
......

 

象这类脚本其实可以很简单就整合在一个UPDATE语句来完成(前些时候在协助xxx项目做性能问题分析时就发现存在这种情况)

5.在可以使用UNION ALL的语句里,使用了UNION

UNION 因为会将各查询子集的记录做比较,故比起UNION ALL ,通常速度都会慢上许多。一般来说,如果使用UNION ALL能满足要求的话,务必使用UNION ALL。还有一种情况大家可能会忽略掉,就是虽然要求几个子集的并集需要过滤掉重复记录,但由于脚本的特殊性,不可能存在重复记录,这时便应该使用UNION ALL,如xx模块的某个查询程序就曾经存在这种情况,见,由于语句的特殊性,在这个脚本中几个子集的记录绝对不可能重复,故可以改用UNION ALL)

6.在WHERE 语句中,尽量避免对索引字段进行计算操作

这个常识相信绝大部分开发人员都应该知道,但仍有不少人这么使用,我想其中一个最主要的原因可能是为了编写写简单而损害了性能,那就不可取了

9月份在对XX系统做性能分析时发现,有大量的后台程序存在类似用法,如:

 

......
where trunc(create_date)=trunc(:date1)

 

虽然已对create_date 字段建了索引,但由于加了TRUNC,使得索引无法用上。此处正确的写法应该是

 

where create_date>=trunc(:date1) and create_date

或者是

 

where create_date between trunc(:date1) and trunc(:date1)+1-1/(24*60*60)

 

注意:因between 的范围是个闭区间(greater than or equal to low value and less than or equal to high value.),

故严格意义上应该再减去一个趋于0的小数,这里暂且设置成减去1秒(1/(24*60*60)),如果不要求这么精确的话,可以略掉这步。

7.对Where 语句的法则

7.1 避免在WHERE子句中使用in,not  in,or 或者having

可以使用 exist 和not exist代替 in和not in。

可以使用表链接代替 exist。Having可以用where代替,如果无法代替可以分两步处理。

例子

SELECT *  FROM ORDERS WHERE CUSTOMER_NAME NOT IN 
(SELECT CUSTOMER_NAME FROM CUSTOMER)

 

优化

SELECT *  FROM ORDERS WHERE CUSTOMER_NAME not exist 
(SELECT CUSTOMER_NAME FROM CUSTOMER)

 

7.2 不要以字符格式声明数字,要以数字格式声明字符值。(日期同样)否则会使索引无效,产生全表扫描。

例子使用:

SELECT emp.ename, emp.job FROM emp WHERE emp.empno = 7369;
不要使用:SELECT emp.ename, emp.job FROM emp WHERE emp.empno = ‘7369’

 

8.对Select语句的法则

在应用程序、包和过程中限制使用select * from table这种方式。看下面例子

 

使用SELECT empno,ename,category FROM emp WHERE empno = '7369‘
而不要使用SELECT * FROM emp WHERE empno = '7369'

 

9. 排序

避免使用耗费资源的操作,带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句会启动SQL引擎 执行,耗费资源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要执行两次排序

10.临时表

慎重使用临时表可以极大的提高系统性能

分享到:
评论

相关推荐

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

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

    Oracle 高性能SQL引擎剖析:SQL优化与调优机制详解

    Oracle数据库的性能优化直接关系到系统的运行效率,而影响数据库性能...《Oracle 高性能SQL引擎剖析:SQL优化与调优机制详解》内容丰富且深入,破解了Oracle技术的很多秘密,适合Oracle数据库管理员、应用开发人员参考。

    高清完整版 Oracle 高性能SQL引擎剖析SQL优化与调优机制详解

    在实际操作中,SQL优化与调优是一个不断迭代的过程,需要数据库管理员结合具体的业务场景和性能指标,综合运用上述知识点,通过测试和实践不断调整和优化。由于是关于Oracle高性能SQL引擎的深入剖析,这本资料是...

    oracle_sql性能优化.pdf

    因此,对Oracle SQL的性能优化是数据库管理员和开发人员必须掌握的重要技能。本文档将介绍一些针对Oracle SQL的性能优化的方法和技巧,并在实际操作中如何根据服务器的实际情况做出调整。 一、Oracle优化器的选取 ...

    Oracle 高性能SQL引擎剖析SQL优化与调优机制详解

    深入揭示OracleSQL优化与调优的原理、核心技术与思想方法 盖国强鼎力推荐! Oracle数据库的性能优化直接关系到系统的运行效率,而影响数据库性能的一个重要因素就是SQL性能问题。本书是作者十年磨一剑的成果之一...

    Oracle SQL性能优化技巧大总结

    ### Oracle SQL性能优化技巧大总结 #### 一、选择最有效率的表名顺序 **背景**:在基于规则的优化器(RBO)中,Oracle解析器处理FROM子句中的表名是从右向左的。为了提高查询效率,需要合理安排表的顺序。 **技巧...

    Oracle高性能SQL引擎剖析 SQL优化与调优机制详解

    本书"Oracle高性能SQL引擎剖析 SQL优化与调优机制详解"深入探讨了Oracle SQL查询引擎的工作原理以及如何对其进行优化和调优,这对于数据库管理员(DBA)和开发人员来说是非常有价值的学习资源。 首先,SQL优化是...

    oracle 性能调整 sql性能优化大全

    `Oracle语句优化53个规则详解 详解 规则 优化 语句 ORACLE SQL 访问 共享 相同 _中国网管联盟-网管网-bitsCN_com.htm`可能列出了53条具体的SQL优化建议,如使用绑定变量、避免在WHERE子句中使用计算表达式等。...

    ORACLE SQL性能优化

    ### Oracle SQL性能优化详解 #### 一、优化器种类及其设置 在Oracle SQL性能优化过程中,选择合适的优化器至关重要。Oracle提供了三种类型的优化器:基于规则的优化器(Rule-based Optimizer, RBO),基于成本的优化...

    ORACLE索引详解及SQL优化

    总的来说,Oracle索引详解及SQL优化是一个深度广度兼具的主题,需要结合实际数据库结构和业务需求,灵活应用各种索引类型和优化策略,以实现数据库性能的最大化。通过深入学习和实践,你可以更好地驾驭Oracle数据库...

    sql语句性能测试详解

    【SQL语句性能测试详解】 在软件开发中,SQL语句的性能是数据库管理系统的关键因素,因为它直接影响到应用程序的响应时间和资源消耗。本篇将详细阐述如何使用LoadRunner工具来测试SQL语句或存储过程的执行性能,...

    ORACLE SQL性能优化系列

    ### ORACLE SQL性能优化系列知识点详解 #### 一、选用合适的Oracle优化器 在Oracle数据库中,优化器的选择对于SQL语句的执行效率至关重要。Oracle提供了三种不同的优化器模式: 1. **基于规则的优化器(RULE)**...

    Oracle sql性能优化

    ### Oracle SQL性能优化详解 #### 一、选用适合的Oracle优化器 在Oracle数据库中,SQL语句的执行效率很大程度上取决于所选的优化器。优化器负责决定SQL语句的执行计划,即如何最有效地从数据库中检索数据。Oracle...

    Oracle SQL 优化与调优技术详解-附录:SQL提示

    这里提供的知识是基于黄玮编写的《Oracle高性能SQL引擎剖析:Oracle SQL优化与调优技术详解》一书的内容,以及上述文档提供的相关知识点。在实际应用中,可以参考这些内容来优化Oracle数据库中的SQL查询。同时,为了...

    oracle SQL性能优化

    ### Oracle SQL性能优化关键知识点详解 #### 一、选择最佳执行路径 在Oracle数据库中,查询计划的选择至关重要。为了确保查询效率,系统会选择一个最佳的执行路径,这通常涉及到驱动表(driving table)的选择。当...

    详解MySQL性能优化(二)

    MySQL性能优化是一个涵盖广泛的主题,涉及数据库架构设计、索引优化、SQL查询优化以及事务处理等多个方面。在本文中,我们将深入探讨其中的关键点。 首先,数据库Schema设计的优化至关重要。高效模型设计包括选择...

    Oracle 高性能SQL引擎剖析SQL优化与调优机制详解.part1/4

    Oracle 高性能SQL引擎剖析SQL优化与调优机制详解(黄玮).

Global site tag (gtag.js) - Google Analytics