`

SQL优化规范

    博客分类:
  • sql
 
阅读更多
优化规范
1.1 限制输出原则
  在OLTP系统中,原则上都是小事务、小查询,应当限制输出的行数,使执行计划经过索引,保证响应速度。而且,对于用户来说,返回过多的行是没有意义的。
  
规范1:结果集不能超过500行
可以通过以下方法限制输出行数:
对于多个可选输入条件的查询,要至少有一个强条件,而且这个条件字段应该有索引。
对于时间范围的查询,要预估结果集,从而确定最长时间范围。
  例如:每周录入保单数据1000条,则需要限制查询时间范围为3天,如果3天内没有 查到结果,用户可以自行向前推3天继续查询。
不要使用like作为查询条件。因为like的条件可能会变化很大,如果使用绑定变量的话,会共享执行计划,造成前后执行的cost相差巨大。
  例如:
  查询条件是 policyno like :B1;
  第一次查询,:B1的值是'6204130080120150001823',执行计划会走policyno索引,
  第二次查询,:B1的值是'62041300801%',执行计划还会去走policyno索引,这时候会 有几万的保单被查出来,执行效率极差。
可以使用rownum <= 500来限制输出,但不能嵌套使用
  例如:
  select * from (
              select policyno, suminsured, sumgrosspremium
                   from nbz_policy_main
                 where inputdate between :B1 and :B2
                      order by policyno )
               where rownum <= 500;
  上面的查询虽然限制了输出500行,但参与排序的可能远远超过500行,这条sql的效率同样会很低,应该修改为下面的写法:
  select policyno, suminsured, sumgrosspremium
       from nbz_policy_main
    where inputdate between :B1 and :B2
          and rownum <= 500
         order by policyno;
需注意:上面两种写法的结果是不同的,如果使用上面一种写法,需限制子查询中参与排序的条数,尽量不超过500行。

规范2:不能使用SELECT *,要根据实际需要,列举所有字段
这样可以减少内存消耗,以及网络传输的数据量。
而且,会减少bug的发生概率。因为表结构经常会变更,如果增加了字段,select *获取的字段数量也会增加,如果接收数据的结构没有变化的话,可能会有报错。

1.2 软解析原则
  SQL第一次执行时,会进行硬解析,硬解析就是生成执行计划的过程,这个动作会消耗大量的CPU、内存资源,我们应该尽量避免硬解析。

规范3:所有业务查询都要使用绑定变量 
如果sql文本相同,Oralce会尽量重用已有的执行计划,保证sql文本相同的方法就是使用绑定变量。

规范4:要控制SQL中变量的数量,尽量不超过14个
所谓变量,是每次查询都会不同,例如policyno。
对于一些不会改变的值,则无需使用绑定变量,例如rownum < 500,所有查询中这个值都是500,则不需要改成绑定变量。
11g中有自适应游标的特性,对于收集直方图的列,oracle会跟踪sql的执行情况,根据实际的cost调整执行计划。这个特性要求变量数量不超过14个。
  
规范5:程序中变量长度定义要与数据库中字段长度相同
Oracle中,即使使用绑定变量,也不一定能重用执行计划,变量的长度变化是不能重用的主要原因。对于varchar2类型的变量,长度范围如下:
字符串长度从1~32
字符串长度从33~128
字符串长度从129~2000
字符串长度从2001~
如果字符串长度跨范围,oracle需要重新硬解析,生成新的执行计划。
所以,要尽量固定变量的长度,代码中变量长度与数据库保持一致,减少不必要的硬解析。

1.3 使用索引原则
  OLTP系统中,业务表基本都是大表,为了保证效率,所有的查询尽量用到索引,要杜绝大表全表扫描的发生。

规范6:数据类型要准确,与数据库保持一致
数据类型不一致会造成隐式转换,可能无法用到索引,例如:
select /*djtest*/ * from nbz_policy_main t where t.policyno = 0000241364;
policyno是varchar2类型,但等号后面是数字类型,执行计划会自动做隐式转换,走全表扫描:

规范7:不要在WHERE子句中使用函数或表达式
where条件中,等号左边只允许有字段名,不允许有函数或表达式,这会导致索引无法用到。
如果一定要有函数,需通知DBA,考虑增加函数索引。

规范8:不要过多的创建索引
索引可以改善查询性能,但索引的维护成本也很高,特别是经常做DML的字段,尽量不要创建索引。

规范9:对用户输入的数据要做校验,杜绝垃圾数据进入数据库
对客户录入的数据,要先进行校验,符合规则的数据才能入库。垃圾数据会导致数据库生成错误的执行计划,严重影响性能。
而且,垃圾数据也不利于后期的数据分析,客户数据管理。

1.4 优化sql写法
规范10:尽量避免复杂查询,表连接的数量不超过5个
Oracle在硬解析时有时间限制,如果sql写法太复杂、连接的表太多,优化器无法尝试所有的连接方法,导致无法找到最优的执行计划,所以复杂sql的效率往往不高。要根据业务逻辑,尽量简化sql,以获取最优性能。
对于超过5张表的连接,应使用hint /*+ leading*/ 来指定最优的连接顺序。

规范11:尽量避免排序
排序操作会消耗大量的CPU资源,特别是大量数据的排序,可能无法在内存完成,大大降低性能。应尽量避免排序操作,不要使用 distinct / order by / union等。
分享到:
评论

相关推荐

    sql高效优化编程规范

    SQL优化是提升性能的核心环节。文档提供了SQL设计优化建议,如避免子查询,正确使用JOIN操作,优化分页查询(如使用LIMIT和OFFSET的替代方案),避免类型隐式转换问题,并充分利用索引来优化WHERE、ORDER BY和GROUP ...

    ORACLE SQL性能优化规范

    Oracle SQL性能优化规范是一套指导原则,旨在帮助数据库管理员和开发人员提高SQL查询在Oracle数据库中的执行效率。这些规范考虑了数据库设计、查询构造、索引使用和优化器策略等多个方面,以确保数据检索的速度和...

    关于SQL优化的电子书

    尽管给定描述并未提供具体的信息,但从标题“关于SQL优化的电子书”及标签“sql优化”,结合部分内容可以看出,此电子书聚焦于SQL应用的优化技术。以下将深入解析与SQL优化相关的专业知识点: ### SQL优化的核心...

    SQL书写规范;书写优化性能建议;经验性规则

    SQL编程规范 一、sql书写规范: 二、书写优化性能建议 三、其他经验性规则 一、sql书写规范: 1、sql语句的所有表名、字段名全部小写,系统保留字、内置函数名、sql保留字大写。 2、连接符or、in、and、以及=、...

    《收获,不止SQL优化》一书的代码

    9. **数据库设计与规范化**:良好的数据库设计可以减少冗余数据,提高数据一致性,对SQL优化也有积极影响。 10. **数据库调优工具与策略**:如SQL Tuning Advisor、Database Replay、SQL Access Advisor等工具的...

    Oracle SQL编写规范

    Oracle SQL编写规范 Oracle SQL编写规范是指在编写SQL语句时的一些基本原则和方法,旨在提高SQL语句的执行效率和可读性。以下是Oracle SQL编写规范的详细解释: 1. 尽量用索引,特别在从大量数据中返回小部分数据...

    ORACLE-SQL性能优化大全.pdf

    - **SQL优化机制**: - **SQL语句处理过程**:理解SQL语句在Oracle中的处理流程对于优化至关重要。 - **共享SQL区域**:Oracle会在内存的共享池中缓存已执行过的SQL语句,以便后续执行时可以直接使用而无需重新...

    SQL优化

    SQL优化是提高数据库性能的关键环节,它涉及到查询效率、资源消耗以及数据处理速度等多个方面。在这个主题中,我们将深入探讨SQL优化的一些核心概念和实践策略。 首先,理解索引对SQL查询的影响至关重要。索引是...

    SQL编写规范和优化讲稿.pptx

    - **实践与经验**: 经常查看执行计划有助于提高SQL优化的能力。 **2.2 表级优化** - **过滤与SPOOL**: 如果过滤性不很强,又不需要重分布,对大表尽可能不要只做一下过滤就进一次SPOOL,最好是直接与别的表 JOIN,...

    SQL优化.pdf

    SQL优化规则_01_Alias相关: 别名使用规则是SQL优化中非常基础但又非常重要的一个方面。首先,建议使用AS关键字来显示声明列或表的别名。在SQL语句中,使用AS关键字可以使别名的定义更加明确,减少歧义,使得SQL语句...

    sql优化小工具

    SQL优化小工具是一款非常实用的辅助程序,专为数据库管理员和开发人员设计,旨在帮助他们更有效地管理和优化SQL查询。这个工具的主要功能是将复杂的、难以阅读的SQL语句整理成清晰、规范的格式,提高代码的可读性...

    DBA对Oracle SQL编写规范的总结

    #### 四、SQL语句及PL/SQL优化类编码规范 这部分涵盖了更多高级的优化技巧,可以帮助开发人员进一步提高查询效率和代码质量。 ##### 4.1 多表关联编写顺序 - **规范要求**:当涉及到多表关联时,应当按照逻辑关系...

    SQL编写规范.doc

    本文档详细阐述了一套适用于东方口岸科技有限公司内部使用的SQL编写规范,该规范覆盖了SQL编写的各个方面,包括但不限于格式要求、性能优化技巧以及一些最佳实践。 #### 二、范围 本规范主要针对SQL的数据查询语言...

    oracle数据库sql优化大全

    SQL性能优化是数据库...总结来说,Oracle数据库的SQL性能优化是一个综合性的过程,涉及需求分析、规范化设计、查询优化技术和持续的数据库维护。通过全面考虑这些因素,可以构建出高效、稳定且易于管理的数据库系统。

    ORACLESQL性能优化.pptx

    必须遵守既定的开发规范,未经过 SQL 语句优化的模块不要上线。 SQL 语句优化的过程包括定位有问题的语句、检查执行计划、检查执行过程中优化器的统计信息、分析相关表的记录数、索引情况、改写 SQL 语句、使用 ...

    HIVE-SQL开发规范.docx

    总结,Hive SQL开发规范强调了正确选择数据类型、合理设计表结构、优化查询性能以及遵循安全原则的重要性。理解并遵循这些规范,将帮助开发者写出高效、稳定的Hive查询,实现大数据分析的目标。

    SQL优化总结,很实用

    SQL优化是提高数据库性能的关键环节,特别是在大数据量和高并发的环境下。以下是对SQL优化的总结,主要聚焦于Oracle数据库的SQL语句调优。 1. **理解执行计划**:优化SQL的第一步是理解查询的执行计划。Oracle的`...

    编码规范--SQL语言规范

    综上所述,《SQL编码规范》提供了全面而细致的指导原则,涵盖了从命名到执行、从性能优化到安全保障的各个环节,旨在提升SQL程序的质量与效能,是所有从事数据库开发与管理工作的工程师不可或缺的参考指南。...

    sql优化初级学习资料

    在SQL优化初级学习中,掌握基本概念和技术是至关重要的。SQL(Structured Query Language)是用于管理关系数据库的标准语言,而优化则是提升SQL查询性能的关键环节。以下是一些关于SQL优化的基础知识: 1. **理解...

    传智播客mysql的sql优化

    MySQL是世界上最受欢迎的关系型数据库管理系统之一,SQL优化是提高数据库性能的关键步骤,尤其对于有大量数据和高并发访问的应用来说更是如此。传智播客的MySQL SQL优化课程针对已有数据库开发经验的开发者,旨在...

Global site tag (gtag.js) - Google Analytics