中国电信陕西公司编码规范--SQL--2008年12月文档修订历史版本编号/更改记录编号变化状态简要说明(变更内容和变更范围)日期变更人*变化状态:C――创建,A——增加,M——修改,D——删除文档审批信息版本编号/更改记录编号审批人角色审批日期签字备注中国电信陕西公司编码规范_SQL中国电信陕西公司第3页共35页目录1.文档说明...........................................................................................................41.1.起草单位................................................................................................41.2.解释权....................................................................................................41.3.版本........................................................................................................41.4.参考资料................................................................................................42.SQL性能规范...................................................................................................42.1.索引设计规范........................................................................................42.2.查询操作规范........................................................................................72.3.增加操作规范......................................................................................152.4.更新操作规范......................................................................................152.5.删除操作规范......................................................................................162.6.其它规范..............................................................................................163.SQL相关检查点.............................................................................................184.SQL考核办法.................................................................................................194.1.1目的..................................................................................................194.2.适用范围..............................................................................................194.3.定义......................................................................................................194.4.考核主导思想......................................................................................204.5.考核周期................................................................错误!未定义书签。4.6.考核办法..............................................................................................214.7.基础指标因素......................................................................................225.附录.................................................................................................................255.1.《XXXX系统SQL分析报告(V0.1)》........................................25中国电信陕西公司编码规范_SQL中国电信陕西公司第4页共35页1.文档说明1.1.起草单位本规范的起草单位为陕西省电信有限公司。1.2.解释权本规范的解释权属于陕西省电信有限公司。1.3.版本本规范的版权属于陕西省电信有限公司。1.4.参考资料2.SQL性能规范2.1.索引设计规范索引虽然提高了数据的查询速度,但同时也增加了插入、更新和删除等维护任务的速度。按照存储方式分为:聚集与非聚集索引;按照维护与管理索引角度分为:单列的普通索引、复合索引和系统自动创建的索引(主键、外键、唯一约束)。……合理的索引设计要建立在对各种查询的分析和预测上。系统自动创建的索引的设计规范:(1)每张表都应该有主键(2)如果业务上某些字段有唯一性约束就必须建唯一索引(3)表之间存在依赖或者引用关系需加外键约束(此条作为参考但必须有以下保证:如果应用程序不能保证数据的完整性则必须在数据库上加外键;如果在效率上有要求在数据库上可不加外键,但必须在程序上要能中国电信陕西公司编码规范_SQL中国电信陕西公司第5页共35页保证数据的完整性)索引的设计原则:(1)经常被用作查询选择的字段、被用来作为排序基准(orderby、groupby、distinct后面的字段)的字段、在查询中用来连接表的字段、在union等集合操作的结果集字段,需要为其建立索引(2)内容很少变动,但经常被查询的表,按照查询条件创建索引(3)如果一个列具有很低的数据基数,又可以有空值,不应作为索引列(4)不能将某些数据类型的列指定为索引键列,如text、blob等(5)如果列的数据重复非常严重(例如,DISTINCT后只有原来数据的千分之一(这个比较不是固定的,一般而言,数据量越大,这个比较应该越小一些)),则不适合为它建立索引(6)经常性、例行性变动的表,则需要谨慎地创建确实必要的索引(参考性原则,是否创建取决于索引对更新类操作和查询类操作造成的影响)(7)避免对经常更新的表进行过多的索引,并且索引应保持较窄,就是说,列要尽可能少。(参考性原则,是否创建取决于索引对更新类操作和查询类操作造成的影响)(8)把索引建到不同的表空间中(数据库设计时考虑)(9)创建索引时考虑用NOLOGGING参数,重建索引的时候也一样(创建时考虑)(10)创建索引时INITRANS值应该比相应的table的值高一些(参创建时考虑)(11)经常修改的表建索引时把填充因子设小些,反之设为足够大(创建时考虑)单字段索引和复合索引:复合索引是指多字段联合索引,意思是查询时经常需要这几个字段结合一起为条件再查询;复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替。(1)如果单独用某列的概率比较高,可单独为它建立索引(2)经常同时存取多列,且每列都含有重复值可建立组合索引(3)如果检索条件的组合不固定,可以组合索引和单独索引一起使用,例如,A、B两个列都是int这种小数据类型,则A+B、B这样两个索引可以覆盖A、B单独检索及A+B组合搜索三种情况(单独搜索A时,可以利用A+B的复合索引)中国电信陕西公司编码规范_SQL中国电信陕西公司第6页共35页(4)如果几个字段经常同时以AND方式出现在Where子句中,而单字段查询极少甚至没有,则可建立复合索引;否则单字段索引。(5)如果某些字段经常单独出现在Where子句中,则分别建立单字段索引。(6)考虑复合索引中列的顺序,正确选择主列字段,一般是选择性较好的字段、用于等于(=)、大于()、小于()或BETWEEN搜索条件的列或者参与联接的列,其他列应该基于其非重复级别进行排序,就是说,根据列的唯一值概率,安排索引顺序。(7)对常用SQL语句的where条件中的列建立唯一索引或组合索引,组合条件查询中相应的组合索引更有效;(8)如果where语句中不得不对查询列采用函数查询,如upper函数,应建立相应的函数索引(9)如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引(参考性原则)(10)如果复合索引所包含的字段超过3个,应考虑减少复合的字段(参考性原则,如果3级索引都不能快速定位到查询的数据,那么这个索引基本上是不合理的)聚集索引与非聚集索引:一般来说:有大量重复值、且经常有范围查询(,,=,=)和orderby、groupby发生的列,可考虑建立聚集索引。使用聚集索引的场合为:①此列包含有限数目的不同值;②查询的结果返回一个区间的值;③查询的结果返回某值相同的大量结果集。使用非聚集索引的场合为:①此列包含了大量数目不同的值;②查询的结束返回的是少量的结果集;③WHERE子句用经常使用的列。④经常需要连接或分组的列。⑤orderby子句中使用了该列。创建索引的限制:(1)对小表不用建索引(2)限制表上的索引数目。对一个存在大量更新操作的表,所建索引的数目中国电信陕西公司编码规范_SQL中国电信陕西公司第7页共35页一般不要超过3个,最多不要超过5个。(3)不要在有大量相同取值(即枚举值)的字段(例如:性别)上,建立索引。(4)避免在取值朝一个方向增长的字段(例如:日期类型的字段)上,建立索引;对复合索引,避免将这种类型的字段放置在最前面。(5)对复合索引,按照字段在查询条件中出现的频度建立索引。将应用频度高的字段,放置在复合索引的前面。索引的维护:(1)定期检查索引表空间(2)检查是否需要重新建立索引(碎片率大于30%,进行索引重建,小于30%,则可以用索引碎片整理)(3)定期做索引的碎片整理(4)定期检查索引是否失效(5)定期进行表分析(6)删除不再使用,或者很少被使用的索引2.2.查询操作规范(1)条件子句需要有效的利用索引提高效率对于列函数作为where子句的条件应当使用函数索引。IN、OR子句常会使用工作表,使索引失效;如果不产生大量重复值,可以考虑把子句拆开,拆开的子句中应该包含索引。存在下面情况的SQL,不会用到索引:禁止数据类型隐形转换,需要显式转换为相同类型,如:select