- 浏览: 92033 次
- 性别:
- 来自: 上海
文章分类
最新评论
优化规范
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等。
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等。
发表评论
-
oracle赋权
2016-12-07 16:29 0create user seki identified by ... -
mangodb
2015-08-20 10:53 0http://www.cnblogs.com/huangxin ... -
MySQL
2015-06-18 13:52 0函数TimeStampDiff()是MySQL本身提供的可以计 ... -
游标使用
2015-04-16 14:59 436简单游标 declare cursor cur_pol ... -
动态SQL
2015-01-26 15:36 284DECLARE v_sql VARCHAR2(10000) ... -
NoSQL存储
2013-11-30 11:33 422NoSQL不仅仅是No SQL,还是Not only SQL, ... -
NVARCHAR2&VARCHAR2
2013-01-21 14:13 5961、NVARCHAR2(10)是可以存进去10个汉字的,如果用 ... -
PL/SQL多行数据处理
2012-12-28 11:48 6241.游标 申明游标 使用时打开 cursor c_cursor ... -
oracle常见错误
2012-11-26 10:39 610ORA-01476: divisor is equal to ... -
ALTER 操作
2012-11-15 13:40 596--新增列 ALTER TABLE Table_name AD ... -
savepoint&rollback
2012-03-17 13:37 804A simple rollback or commit era ... -
oracle NULL
2012-02-24 21:29 334当变量赋为NULL时,需特别注意 if v_tmp exp ... -
having&group by
2012-01-18 16:24 664GROUP BY 是分组查询, 一般 GROUP BY 是和聚 ... -
CURSOR
2012-01-11 10:16 797--定义 CURSOR c_mycursor IS sele ... -
oracle表&视图
2012-01-09 19:43 684user_tables用于存储用户分配的表视图 dba_ta ... -
oracle数据导入导出
2012-01-05 15:20 755--将数据库db完全导出 exp user/pwd@db fi ... -
UNION 与 UNION ALL
2011-12-27 21:03 703UNION 与 UNION ALL UNION 有一个内部的 ... -
索引 CREATE INDEX
2011-11-21 13:45 635B-树 数据结构 CREATE INDE ... -
trigger 控制
2011-11-21 13:43 805alter trigger TRI_TABLE__BIU_A ... -
oracle 表解锁
2011-09-20 23:05 1006全部解锁 declare v_sid V$LOCKED ...
相关推荐
SQL优化是提升性能的核心环节。文档提供了SQL设计优化建议,如避免子查询,正确使用JOIN操作,优化分页查询(如使用LIMIT和OFFSET的替代方案),避免类型隐式转换问题,并充分利用索引来优化WHERE、ORDER BY和GROUP ...
Oracle SQL性能优化规范是一套指导原则,旨在帮助数据库管理员和开发人员提高SQL查询在Oracle数据库中的执行效率。这些规范考虑了数据库设计、查询构造、索引使用和优化器策略等多个方面,以确保数据检索的速度和...
尽管给定描述并未提供具体的信息,但从标题“关于SQL优化的电子书”及标签“sql优化”,结合部分内容可以看出,此电子书聚焦于SQL应用的优化技术。以下将深入解析与SQL优化相关的专业知识点: ### SQL优化的核心...
- **SQL优化机制**: - **SQL语句处理过程**:理解SQL语句在Oracle中的处理流程对于优化至关重要。 - **共享SQL区域**:Oracle会在内存的共享池中缓存已执行过的SQL语句,以便后续执行时可以直接使用而无需重新...
SQL编程规范 一、sql书写规范: 二、书写优化性能建议 三、其他经验性规则 一、sql书写规范: 1、sql语句的所有表名、字段名全部小写,系统保留字、内置函数名、sql保留字大写。 2、连接符or、in、and、以及=、...
9. **数据库设计与规范化**:良好的数据库设计可以减少冗余数据,提高数据一致性,对SQL优化也有积极影响。 10. **数据库调优工具与策略**:如SQL Tuning Advisor、Database Replay、SQL Access Advisor等工具的...
Oracle SQL编写规范 Oracle SQL编写规范是指在编写SQL语句时的一些基本原则和方法,旨在提高SQL语句的执行效率和可读性。以下是Oracle SQL编写规范的详细解释: 1. 尽量用索引,特别在从大量数据中返回小部分数据...
SQL优化是提高数据库性能的关键环节,它涉及到查询效率、资源消耗以及数据处理速度等多个方面。在这个主题中,我们将深入探讨SQL优化的一些核心概念和实践策略。 首先,理解索引对SQL查询的影响至关重要。索引是...
- **实践与经验**: 经常查看执行计划有助于提高SQL优化的能力。 **2.2 表级优化** - **过滤与SPOOL**: 如果过滤性不很强,又不需要重分布,对大表尽可能不要只做一下过滤就进一次SPOOL,最好是直接与别的表 JOIN,...
SQL优化规则_01_Alias相关: 别名使用规则是SQL优化中非常基础但又非常重要的一个方面。首先,建议使用AS关键字来显示声明列或表的别名。在SQL语句中,使用AS关键字可以使别名的定义更加明确,减少歧义,使得SQL语句...
SQL优化小工具是一款非常实用的辅助程序,专为数据库管理员和开发人员设计,旨在帮助他们更有效地管理和优化SQL查询。这个工具的主要功能是将复杂的、难以阅读的SQL语句整理成清晰、规范的格式,提高代码的可读性...
#### 四、SQL语句及PL/SQL优化类编码规范 这部分涵盖了更多高级的优化技巧,可以帮助开发人员进一步提高查询效率和代码质量。 ##### 4.1 多表关联编写顺序 - **规范要求**:当涉及到多表关联时,应当按照逻辑关系...
本文档详细阐述了一套适用于东方口岸科技有限公司内部使用的SQL编写规范,该规范覆盖了SQL编写的各个方面,包括但不限于格式要求、性能优化技巧以及一些最佳实践。 #### 二、范围 本规范主要针对SQL的数据查询语言...
SQL性能优化是数据库...总结来说,Oracle数据库的SQL性能优化是一个综合性的过程,涉及需求分析、规范化设计、查询优化技术和持续的数据库维护。通过全面考虑这些因素,可以构建出高效、稳定且易于管理的数据库系统。
必须遵守既定的开发规范,未经过 SQL 语句优化的模块不要上线。 SQL 语句优化的过程包括定位有问题的语句、检查执行计划、检查执行过程中优化器的统计信息、分析相关表的记录数、索引情况、改写 SQL 语句、使用 ...
总结,Hive SQL开发规范强调了正确选择数据类型、合理设计表结构、优化查询性能以及遵循安全原则的重要性。理解并遵循这些规范,将帮助开发者写出高效、稳定的Hive查询,实现大数据分析的目标。
SQL优化是提高数据库性能的关键环节,特别是在大数据量和高并发的环境下。以下是对SQL优化的总结,主要聚焦于Oracle数据库的SQL语句调优。 1. **理解执行计划**:优化SQL的第一步是理解查询的执行计划。Oracle的`...
综上所述,《SQL编码规范》提供了全面而细致的指导原则,涵盖了从命名到执行、从性能优化到安全保障的各个环节,旨在提升SQL程序的质量与效能,是所有从事数据库开发与管理工作的工程师不可或缺的参考指南。...
在SQL优化初级学习中,掌握基本概念和技术是至关重要的。SQL(Structured Query Language)是用于管理关系数据库的标准语言,而优化则是提升SQL查询性能的关键环节。以下是一些关于SQL优化的基础知识: 1. **理解...
本规范涵盖了 SQL 书写规范、书写优化性能建议和其他经验性规则,旨在帮助开发者编写高效、可靠的 SQL 代码。 SQL 书写规范 SQL 书写规范旨在提高 SQL 代码的可读性和可维护性。主要规则包括: 1. SQL 语句的所有...