数据库编码规范
- 格式:docx
- 大小:53.90 KB
- 文档页数:13
数据库编码规范V1.02022-8-28目的范围术语设计概要命名规范(逻辑对象)数据库对象命名脚本注释数据库操作原则常用字段命名(参考)1)目的为了统一公司软件开辟的设计过程中关于数据库设计时的命名规范和具体工作时的编程规范,便于交流和维护,特制定此规范。
2)范围本规范合用于开辟组全体人员,作用于软件项目开辟的数据库设计、维护阶段<3)术语数据库对象:在数据库软件开辟中,数据库服务器端涉及的对象包括物理结构和逻辑结构的对象。
物理结构对象:是指设备管理元素,包括数据文件和事务日志文件的名称、大小、目录规划、所在的服务器计算极名称、镜像等,应该有具体的配置规划。
普通对数据库服务器物理设备的管理规程,在整个项目/产品的概要设计阶段予以规划。
逻辑结构对象:是指数据库对象的管理元素,包括数据库名称、表空间、表、字段/域、视图、索引、触发器、存储过程、函数、数据类型、数据库安全性相关的设计、数据库配置有关的设计以及数据库中其他特性处理相关的设计等。
4)设计概要设计环境<数据库:ORACLE9i、MSSQLSERVER2000 等,操作系统:LINUX7.1 以上版本,显示图形操作界面;RedHat9 以上版本WINDOWS2000SERVER 以上设计使用工具手使用PowerDesigner 做为数据库的设计工具,要求为主要字段做详尽说明。
对于SQLServer 尽量使用企业管理器对数据库进行设计,并且要求对表,字段编写详细的说明(这些将作为扩展属性存入SQLServer 中) 手通过PowerDesigner 定制word 格式报表,并导出word 文档,作为数据字典保存。
(PowerDesignerv10 才具有定制导出word 格式报表的功能)<对于SQLServer 一旦在企业管理器进行数据库设计时加入扩展属性,就可以通过编写简单的工具将数据字典导出。
4 编写数据库建数据库、建数据库对象、初始化数据脚本文件设计原则4 采用多数据文件手禁止使用过大的数据文件,unix 系统不大于2GB,window 系统不超过500MB$oracle 数据库中必须将索引建立在索引表空间里。
数据库编码规范在当今数字化的时代,数据库作为存储和管理数据的核心组件,其重要性不言而喻。
为了确保数据库的高效运行、数据的准确性和一致性,以及便于维护和扩展,制定一套完善的数据库编码规范是至关重要的。
首先,让我们来谈谈数据库命名规范。
数据库中的对象,如表、视图、存储过程等,都应该有清晰、有意义且易于理解的名称。
表名应该准确反映其所存储的数据内容,例如,如果是存储用户信息的表,可以命名为“users”。
避免使用模糊、无意义的名称,如“table1”、“temp_table”等。
同样,视图的名称应该能够表明其提供的数据视图的性质,存储过程的名称应该能够清晰地表达其功能。
对于字段命名,也要遵循相似的原则。
字段名应该具有描述性,使用完整的单词而不是缩写,除非缩写是行业内普遍认可且不会产生歧义的。
例如,“user_name”比“uname”更清晰易懂。
此外,要保持命名的一致性,比如,如果采用了驼峰命名法,就应在整个数据库中都保持这种命名风格。
接下来是数据类型的选择。
正确选择数据类型不仅可以节省存储空间,还能提高数据处理的效率。
对于整数类型,如果值的范围较小,可以选择 tinyint 或 smallint;如果范围较大,则选择 int 或 bigint。
对于字符串类型,如果长度固定且较短,使用 char 类型;如果长度不固定且长度可能较大,使用 varchar 类型。
对于日期和时间类型,根据具体的需求选择 date、datetime 或 timestamp 等。
在设计表结构时,要遵循数据库的范式原则。
通常,达到第三范式是一个比较理想的状态。
这意味着每个表中的非主键字段都完全依赖于主键,且不存在传递依赖。
例如,如果有一个订单表,订单号是主键,而客户信息应该存储在单独的客户表中,通过客户 ID 与订单表关联,而不是直接将客户信息存储在订单表中。
索引的使用也是数据库优化的重要方面。
索引可以大大提高数据查询的效率,但过多或不当的索引也会影响数据的插入、更新和删除操作。
oracle mysql 编码规则Oracle和MySQL是两个常用的关系型数据库管理系统,它们在编码规则方面有些不同。
下面我将为您介绍Oracle和MySQL的编码规则。
一、Oracle编码规则:1.字符集选择:Oracle支持多种字符集,如AL32UTF8、UTF8、ZHS16GBK等。
其中,AL32UTF8是Unicode编码的扩展,能够存储任何字符,建议使用AL32UTF8字符集,以适应全球化的需求。
2.字符长度限制:Oracle中的VARCHAR2类型的字符长度限制为4000字节,在AL32UTF8字符集下,这对应于4000个ASCII字符或者1333个汉字。
如果需要存储更多字符,可以使用CLOB类型。
3.使用国际化支持函数:Oracle提供了丰富的国际化支持函数,如NLS_LOWER、NLS_UPPER、NLS_INITCAP等,可以在各种字符集之间进行转换和比较。
4.字符编码转换:在涉及到不同字符集之间的数据传输和处理时,需要进行字符编码转换,Oracle提供了一系列的函数和工具来实现字符编码转换,如CONVERT、NLS_CHARSET_ID等。
5.字符串比较规则:在Oracle中,字符串比较默认是不区分大小写的,如果需要进行区分大小写的比较,可以使用BINARY_CI规则或者设置NLS_SORT参数。
6.字符集的设置:在创建数据库时,需要设置数据库的字符集,可以在CREATE DATABASE语句中指定字符集,也可以使用ALTER DATABASE语句来修改数据库的字符集。
二、MySQL编码规则:1.字符集选择:MySQL支持多种字符集,如utf8mb4、utf8、gbk 等。
其中,utf8mb4是Unicode编码的超集,能够存储任何字符,建议使用utf8mb4字符集,以适应全球化的需求。
2.字符长度限制:MySQL中的VARCHAR类型的字符长度限制为65535字节,在utf8mb4字符集下,这对应于65535个ASCII字符或者21845个汉字。
MySQL编码规则是指MySQL数据库中字符集和排序规则的设置。
字符集定义了存储在数据库中的字符数据的类型,而排序规则定义了对这些字符数据的比较和排序方式。
MySQL支持多种字符集和排序规则,其中最常用的是utf8字符集和utf8_general_ci排序规则。
utf8字符集可以存储任何Unicode字符,而utf8_general_ci排序规则则按照字典顺序对字符进行排序。
在MySQL中,可以通过以下命令查看当前数据库的编码规则:
```
SHOW VARIABLES LIKE 'character%';
SHOW VARIABLES LIKE 'collation%';
```
如果需要修改编码规则,可以使用以下命令:
```
ALTER DATABASE database_name CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
```
其中,database_name是要修改编码规则的数据库名称,table_name是要修改编码规则的数据表名称。
数据库设计规范_编码规范数据库设计规范包括数据库表结构的设计原则和数据库编码规范。
数据库表结构的设计原则包括表的命名规范、字段的命名规范、主键和外键的设计、索引的使用、约束的定义等。
数据库编码规范包括SQL语句的书写规范、存储过程和函数的命名规范、变量和参数的命名规范、注释的使用等。
1.表的命名规范-表名使用有意义的英文单词或短语,避免使用拼音或缩写。
- 使用下划线(_)作为单词之间的分隔符,如:user_info。
- 表名使用单数形式,如:user、order。
2.字段的命名规范-字段名使用有意义的英文单词或短语,避免使用拼音或缩写。
- 字段名使用小写字母,使用下划线(_)作为单词之间的分隔符,如:user_name。
- 字段名要具有描述性,可以清楚地表示其含义,如:user_name、user_age。
3.主键和外键的设计-每张表应该有一个主键,用于唯一标识表中的记录。
- 主键字段的命名为表名加上“_id”,如:user_id。
- 外键字段的命名为关联的表名加上“_id”,如:user_info_id,指向user_info表的主键。
4.索引的使用-对于经常用于查询条件或连接条件的字段,可以创建索引,提高查询性能。
-索引的选择要权衡查询性能和写入性能之间的平衡。
-不宜为每个字段都创建索引,避免索引过多导致性能下降。
5.约束的定义-定义必要的约束,保证数据的完整性和一致性。
-主键约束用于保证唯一性和数据完整性。
-外键约束用于保证数据的一致性和关联完整性。
6.SQL语句的书写规范-SQL关键字使用大写字母,表名和字段名使用小写字母。
-SQL语句按照功能和逻辑进行分行和缩进,提高可读性。
-使用注释清晰地描述SQL语句的功能和用途。
7.存储过程和函数的命名规范-存储过程和函数的命名要具有描述性,可以清楚地表示其功能和用途。
-使用有意义的英文单词或短语,避免使用拼音或缩写。
- 使用下划线(_)作为单词之间的分隔符,如:get_user_info。
命名和注释规范1.数据库涉及字符规范采用26个英文字母(区分大小写)和0-9这十个自然数,加上下划线_组成,共63个字符。
不能出现其他字符(注释除外)。
2.数据库对象命名规范数据库对象包括表、视图(查询)、存储过程(参数查询)、函数、约束。
对象名字由前缀和实际名字组成,长度不超过30。
在SYBASE ASE下,对象名区分大小写,统一使用大写,其他数据库按照本规范。
前缀:使用小写字母字典表d_视图view存储过程proc函数func实际名字:实际名字尽量描述实体的内容,由单词或单词组合,每个单词的首字母大写,其他字母小写,不以数字和_开头。
如视图User_List存储过程User_Delete因此,合法的对象名字类似如下。
视图view_Message_List存储过程proc_Message_Add3.视图命名规范我们约定,字段由前缀和实际名字组成,中间用下划线连接。
前缀:使用小写字母view,表示视图。
因此,合法的视图名类似如下。
view_Userview_UserInfo4.存储过程命名规范我们约定,过程由前缀和实际名字加操作名字组成,中间用下划线连接。
前缀:使用小写字母proc,表示存储过程。
操作名字:Insert|Delelte|Update|Caculate|Confirm|Init例如:proc_User_Insert5.存储过程设计注释规范注释大致格式如下:CREATE OR REPLACE PROCEDURE proc_xxxx_xxxx ()IS(或AS)/*************************************************** 存储过程名:proc_xxxx_xxxx* 作者:Yezi(叶子)* 日期:2004-12-17* 版本: 1.0* 描述:保存用户资料* 入口参数:* 出口参数:* 具体流程:* 变更过程及变更内容描述:*************************************************/6.sql语句规范所有sql关键词全部大写,比如SELECT,UPDATE,FROM,ORDER,BY等。
数据库设计规范_编码规范1.命名规范:表名、字段名和约束名应该具有描述性,遵循一致的命名规则。
避免使用保留字作为名称,使用下划线或驼峰命名法。
2.数据类型选择:选择合适的数据类型来存储数据,避免过大或过小的数据类型。
这有助于减小数据库的存储空间,提高查询性能。
3.主键和外键:每个表都应该有一个主键来唯一标识每条记录。
外键用于建立表之间的关系,确保数据的一致性和完整性。
4.表的范式:根据具体需求,遵循规范化设计原则。
将数据分解为多个表,减少数据冗余和更新异常。
5.索引设计:根据查询需求和数据量,设计适当的索引。
避免过多或不必要的索引,以减小索引维护的开销。
6.分区设计:对大型表进行分区,将数据分散存储在不同的物理磁盘上,提高查询性能。
7.安全性设计:为数据库设置适当的权限和访问控制,限制不必要的用户访问和操作。
数据库编码规范:1.编码一致性:统一使用同一种编码方式,如UTF-8,避免不同编码之间的转换问题。
2.参数化查询:使用参数化查询语句,预编译SQL语句。
这样可以防止SQL注入攻击,提高查询性能。
3.事务管理:使用事务控制语句(如BEGIN、COMMIT和ROLLBACK)来管理数据库事务,确保数据的一致性和完整性。
4.错误处理:在代码中捕获和处理数据库错误和异常,提高系统的容错性。
5.SQL语句编写:编写简洁且优化的SQL语句,避免使用多个嵌套的子查询,使用JOIN操作符进行表之间的关联。
6.数据库连接管理:优化数据库连接,避免频繁地打开和关闭数据库连接。
7.缓存机制:对于频繁查询的数据,使用缓存机制来减少数据库的压力。
8.日志记录:记录数据库操作日志,包括增删改查的操作,以便后续的问题跟踪和审计。
综上所述,数据库设计规范和编码规范对于确保数据库系统的性能、安全性和可维护性至关重要。
遵循这些规范能够提高数据库系统的效率和可靠性,减少潜在的问题和风险。
因此,在进行数据库设计和编码时,应该遵循这些规范。
Oracle数据库编码规范1目的使用统一的命名和编码规范,使数据库命名及编码风格标准化,以便于阅读、理解和继承。
2适用范围本规范适用于公司范围内所有以ORACLE作为后台数据库的应用系统和项目开发工作。
3规范3.1书写规范丑陋的书写规范不仅可读性较差,而且给人以敬而远之的感觉;而良好的书写规范则给人以享受和艺术的体验。
3.1.1大小写风格规则3.1.1.1所有数据库关键字和保留字命名使用大小写不做要求。
3.1.2缩进风格规则3.1.2.1程序块严格采用缩进风格书写,保证代码清晰易读,风格一致,缩进格数统一为2/4个。
必须使用空格,不允许使用【Tab】键。
以免在用不同的编辑器阅读程序时,因【Tab】键所设置的空格数目不同而造成程序布局不整齐。
规则3.1.2.2当同一条语句需要占用多于一行时,每行的其他关键字与第一行的关键字进行右对齐。
IF flag = True THENSelect usernameInto vUserInfoFrom userInfoWhere userId = ‘id’END IF;3.1.3空格及换行规则3.1.3.1不允许把多个语句写在一行中,即一行只写一条语句且一行最长不能超过80字符;规则3.1.3.2避免将复杂的SQL语句写到同一行,建议要在关键字和谓词间换行。
WHERE子句书写时,每个条件占一行。
规则3.1.3.3相对独立的程序块之间必须加空行。
BEGIN、END独立成行。
3.1.4其它规则3.1.4.1确保变量和参数在类型和长度上与表数据列相匹配。
如果与表数据列宽度不匹配,则当较宽或较大的数据传进来时会产生运行异常。
3.2命名规范对于命名规范来说,想要做到完全统一的确是不可能的任务。
命名规范更多的是个人层面的爱好,既使无法完全做到一致,但是我们仍然要尽量去遵守。
3.2.1字段命名规范在此仅提供几种常见的命名方法,如表3-2-1所示。
表3-2-1 命名规范表规则3.2.1.1不建议使用数据库关键字和保留字,原因是为了避免不必要的冲突和麻烦。
、Q/TD 天津天地伟业数码科技有限公司企业标准Q/TD PC.006-2009 TIANDY 数据库编码规范2009-12-21发布 2009-01-01实施 天津天地伟业数码科技有限公司发 布前 言数据库设计是软件产品设计的重要组成部分,数据库设计的好坏直接关系到软件产品的整体水平,因此,有效地控制和规范数据库设计是软件产品设计过程中一项非常重要的工作。
本规范对数据库对象(表、视图、索引、字段等)的命名、定义、编程等方面制定了若干规定,并设计了若干设计图表。
设计人员应严格按照规范进行数据库设计。
本文档内的规范按照遵守的程度,分为两种:必须( must )和建议( suggest ),这将在每个规范条款前面注明。
其中建议条款只为编码人员提供参考,并不作为代码审核的依据;必须条款作为代码审核的依据,是编码人员必须要遵守的条款。
本标准起草部门:研发基础行业中心本标准起草人: 韩强本标准维护部门:研发产业中心工艺部本标准于2009年12月21 日首次发布目录1数据库命名规范 (1)1.1字段命名约定 (1)1.2数据库对象命名约定 (1)2数据库设计规范 (2)2.1总体规范 (2)2.2字段设计规定 (2)2.3视图设计规定 (2)2.4索引设计规定 (2)3SQL语句规范 (3)3.1通用注释 (3)3.2 函数注释 (3)3.3条件执行语句 (3)3.4书写格式 (3)Q/TD PC.006-20091数据库命名规范1.1字段命名约定1.1.1【必须】字段命名采用在字段名字前加上能反映其类型的前缀(匈牙利前缀),再加“_”的定义方式,要求字段名称全部大写,字段名要尽量反映其所代表的实际意义。
例如:定义一int类型的字段,表示一物品编号,字段名命名为:I_GOODSID定义一字符串型的字段,表示物品名:S_GOODSNAME下表规定常用类型的字段前缀格式:字段类型 前缀 字段描述CHAR CH 1字节字符NUMBERIC NUM 4字节浮点数DECIMAL, FLOAT DEC,F 8字节浮点数REAL R 4字节浮点数TINYINT TI 8位无符号整数SMALLINT SI 16位无符号整数INT I 32位有符号整数VARCHAR S 变长字符串DATETIME DT 8字节日期型SMALLDATETIME SDT 4字节日期型BIT BIT 1位BINARY BIN 多位VARBINARY VBIN 可变位TEXT TXT 文本型IMAGE IMG 图形型MONEY MNY 8字节日期型SMALLMONEY SMNY 4字节日期型特殊类型或自定义类型的命名要在详细设计文档中注明。
Oracle数据库编码规范数据库命名规范1、编写目的使用统一的命名和编码规范,使数据库命名及编码风格标准化,以便于阅读、理解和继承。
2、适用范围本规范适用于公司范围内所有以ORACLE作为后台数据库的应用系统和项目开发工作。
3、对象命名规范3.1数据库和SID数据库名定义为系统名+模块名★全局数据库名和例程SID 名要求一致★因SID 名只能包含字符和数字,所以全局数据库名和SID 名中不能含有“_”等字符3.2表相关3.2.1 表空间★面向用户的专用数据表空间以用户名+_+data命名,如Aud 用户专用数据表空间可命名为Aud_data★面向应用的表空间:应用名+_+模块名+_data (数据空间)应用名+_+模块名+_idx (索引空间)应用名+_+模块名+_tmp (临时空间)3.2.2 表空间文件表空间文件命名以表空间名+两位数序号(序号从01开始)组成,如dms_vorder_data01 等3.2.3 表表命名要遵循以下原则:★一般表采用“系统名+t_+模块名+_+表义名”格式构成(模块名一般不超过10位) ★若数据库中只含有单个模块,命名可采用“系统名+t_+表义名”格式构成★模块名或表义名均以其英文命名,命名过程中适当截取,最多不超过50个字符;★表别名命名规则:取表义名的前3 个字符加最后一个字符。
如果存在冲突,适当增加字符(如取表义名的前4 个字符加最后一个字符等)★临时表采用“系统名+t_tmp_+表义名”格式构成★表的命名如dmst_vorder_declare:系统名(经销商管理系统 dms)+t_+模块名(整车订单 vorder)+_+表义名(申报 declare)★关联表命名为Re_表A_表B,Re 是Relative的缩写,表A 和表B均采用其表义名或缩写形式。
3.2.4 属性(列或字段)属性命名遵循以下原则:★采用有意义的列名,为实际含义的英文截取,且字符间可有下划线★属性名前不要加表名等作为前缀★属性后不加任何类型标识作为后缀★关联字段命名以“cd+_+关联表的表义名(或缩写)+_+字段名”进行所有表必须有以下字段:字段名中文字段类型备注Id Id号Number 表主键,对应sequence 为seq_+表名factorycode 工厂编码Varchar2(50)createtime 创建时间Date 默认系统时间createby 创建人Varchar2(100)updatedtime 修改时间Dateupdatedby 修改人Varchar2(100)Lockedflag 锁定标记Varchar2(2) 默认为0,1为锁定,0为解锁Lockedtime 锁定时间DateLockedby 锁定人Varchar2(100)Deleteflag 删除标记Varchar2(2) 默认为0,1为删除,0为正常可用注意:在用POWER DESIGNER进行设计时,注意将每个字段的备注都填上(内容可为其中文含义及特殊说明,以便数据库文档的生成及后续开发的人员的理解)3.2.5 主键★任何表都必须定义主键★表主键命名为:“pk+_+表名(或缩写)+_+主键标识3.2.6 外键表外键命名为:“fk+_+表名(或缩写)+_主表名(或缩写)+_+主键标识3.2.7 CHECK约束CHECK 约束命名为:“chk+_+CHECK约束的列名(或缩写)”3.2.8 UNIQUE约束UNIQUE 约束命名为:“unq+_+UNIQUE约束的列名(或缩写)”3.2.9 索引索引的命名为:“idx_+表名(或缩写)+_+列名”。
数据库编码规范技术研发中心2020年12月12日文档修订目录1. 概述 (4)1.1 编写目的 (4)1.2 使用范围 (4)1.3 参考文献 (4)2. 数据库开发 (5)2.1 概述 (5)2.2 注释编写规范 (5)2.3 SQL在JAVA代码中的编写规范 (5)2.4 SQL编写原则 (6)3.附录 (10)3.1 建议 (10)3.2 SQL优化 (13)3.2.1 利用Navicat Premium工具分析SQL执行效率 (13)1.概述1.1编写目的本文描述了使用SQL技术进行编程的一些规范。
为保证在开发过程中产出高效、格式统一、易阅读、易维护的SQL代码,利于不同开发人员维护,所有的数据库代码和相关文档都应遵循本文档描述的规则和约定。
1.2使用范围开发人员、工程实施人员、系统维护人员1.3参考文献《数据库开发规范》2.数据库开发2.1概述1、数据库开发工具使用Navicat Premium,便于应用统一的美化器对所有数据库程序代码实现统一的格式化;便于使用数据库程序模版创建统一格式的数据程序对象。
2、数据库中存储的程序代码不可具备事务提交功能,所有事务的提交在应用层完成。
3、数据库中的程序代码统一使用存储包的形式,不再出现单独的存储过程或者函数。
4、存储包超过6000行需另建存储包。
5、动态SQL执行必须使用BIND变量。
6、程序代码内中不可出现DDL语句。
2.2注释编写规范每个数据库程序对象(包、包内过程函数、触发器、自定义类等)、变量及常量必须使用注释。
注释方式:/**/2.3SQL在JAVA代码中的编写规范SQL语句在程序中应尽量少的出现(写在数据库存储过程中,后台执行效率较高),必须出现则一般以字符串的形式出现,现对程序中的SQL书写做以下约定。
●java代码中出现的SQL语句包括(字段名,表名,SQL关键字、保留字)均应采用大写形式;●避免在java代码中,使用循环语句多次执行数据库查询;●用于查询/更新/删除的SQL,WHERE条件固定的,必须使用预编译方式;●对SQL语句加上适当的注释,特别是对语句上出现的枚举值要标明其含义;●合理使用空格和缩进,保证SQL语句结构清晰;➢在SQL内置运算符前后加上空格;➢在SQL关键字、保留字前后都要有空格;➢拼接SQL时,新一行加上空格;●SQL语句较长时,应把SQL语句放在一个方法内;➢在每一个子句及逻辑判断占一行;➢对子查询使用缩进,一般为4个字符;➢SQL语句应该保持在80行以内;●代码中严禁使用SELECT * 代替具体的字段名。
Oracle在解析的过程中, 会将’*’依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。
在做插入SQL时,必须列出要插入表的字段名。
不允许出现类似如下SQL:●SQL中有特殊业务含义的值的引用,要加上注释说明如:2.4SQL编写原则1)多表查询,要使用别名;当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column 上。
这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误。
2)多表关联效率优化1) 大数量的表和数据量非常小的表不宜直接做关联,可以考虑通过程序或子查询的方式先处理小表,根据获取的数据,再检索大表。
2) WHERE 条件顺序SQL解析器采用自下而上的顺序解析WHERE子句,建议将表之间的连接放在其他条件之前,将可以过滤掉最大数量记录的条件放在WHERE 子句的末尾。
3)FROM子句顺序(选择基础表):ORACLE 的解析器按照从右到左的顺序处理FROM 子句中的表名,因此FROM 子句中写在最后的表(基础表driving table)将被最先处理。
在FROM 子句中包含多个表的情况下,你必须选择记录条数最少的表(放置在from子句的最后面)作为基础表。
例如:表TAB1共 16,384 条记录表TAB2共 1条记录选择TAB2作为基础表(最好的方法)select count(*) from tab1,tab2 执行时间0.96秒选择TAB2作为基础表(不佳的方法)select count(*) from tab2,tab1执行时间26.09秒4)不要对索引列使用函数,不要在索引列上使用NOT,不要在索引列上使用计算,不要在索引列上使用IS NULL和IS NOT NULL,不要改变索引列的类型。
a)对索引列使用函数会使索引失效,执行全表扫描,导致查询性能降低。
b)对索引列使用NOT,会产生与上述操作相同的影响。
c)对索引列使用计算,优化器将不再使用索引而使用全表扫描。
例如:低效:SELECT … FROM DEPT WHERE SAL * 12 > 25000;高效:SELECT … FROM DEPT WHERE SAL > 25000/12;d)索引列上使用IS NULL和IS NOT NULL,该索引失效。
例如:低效: (索引失效) SELECT … FROM DEPARTMENT WHERE DEPT_CODE IS NOT NULL;高效: (索引有效) SELECT … FROM DEPARTMENT WHERE DEPT_CODE >=0;e)改变索引列类型,该索引失效。
故查询时值应该与索引列类型保持一致。
当比较不同数据类型的数据时, ORACLE自动对列进行简单的类型转换。
假设EMPNO是一个数值类型的索引列:SELECT … FROM EMP WHERE EMPNO =‘123'。
实际上,经过Oracle类型转换, 语句转化为: SELECT … FROM EMPWHERE EMPNO = TO_NUMBER(‘123') 。
幸运的是,类型转换没有发生在索引列上,索引的用途没有被改变。
现在,假设EMP_TYPE是一个字符类型的索引列:SELECT … FROM EMP WHERE EMP_TYPE = 123 。
这个语句被Oracle转换为:SELECT … FROM EMP WHERETO_NUMBER(EMP_TYPE)=123。
因为内部发生的类型转换, 这个索引将不会被用到! 为了避免Oracle对你的SQL进行隐式的类型转换, 最好把类型转换用显式表现出来。
例如:低效:SELECT … FROM DEPT WHERE SUBSTR(STARTDATE,0,4)>’2012’;高效:SELECT … FROM DEPT WHERE STARTDATE >TO_DATE(‘2012-01-01’,’yyyy-MM-dd’);5)若索引建立在多个列上,则只有第一列作为查询条件时,优化器才会使用它,否则,忽略该索引使用全表扫描。
这也是一条简单而重要的规则。
6)其他索引失效的情况有:(1)‘!=’ 将不使用索引。
记住, 索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中。
(2)‘||’是字符连接函数。
就象其他函数那样, 停用索引。
(3)‘+’、‘-’、‘*’、‘/’、‘%’是数学函数。
就象其他数学函数那样,停用索引。
7)使用IN语句时,要确保IN中的数据不能超过1000。
8)用EXISTS替换DISTINCT当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT。
一般可以考虑用EXIST替换, EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果。
例子:(低效): SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D , EMP E WHERED.DEPT_NO =E.DEPT_NO(高效): SELECT DEPT_NO,DEPT_NAME FROM DEPT D WHERE EXISTS ( SELECT ‘X' FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO);9)不准使用CROSS JOIN,使用OUTER,INNER JOIN10)用EXISTS替代IN、用NOT EXISTS替代NOT IN语句在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接。
在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率,而在子查询中,NOT IN子句将执行一个内部的排序和合并。
无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历)。
为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS。
11)若业务允许,用UNION-ALL替换UNIONUNION ALL 是将多个查询语句,查询列意义相同并且一一对应,在一起执行。
UNION ALL 与UNION的区别是UNION会对查询出的多个结果集做排序和DISTINCT操作。
而UNION ALL 不会。
因此在查询性能上,UNION ALL 会比UNION 快很多。
因此在使用时要根据情况,看是否多个sql查询出的结果是否会有重复行,如果没有或业务上不关注重复,建议使用UNION ALL语法。
12)DATA_DATE的使用对时间条件可使用“=”、“>=”、“<=”、“BETWENN...AND”、to_Date,不可使用任何函数。
13)对较长的SQL要进行执行计划分析,对于在系统使用比较复杂的sql,需要与有经验的同事或技术经理讨论。
3.附录3.1建议1)减少访问数据库的次数Oracle在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等。
2)用Where子句替换HAVING子句避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤。
这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销。
3)优化GROUP BY提高GROUP BY 语句的效率,可以通过将不需要的记录在GROUP BY 之前过滤掉。
下面两个查询返回相同结果但第二个明显就快了许多。
低效:SELECT JOB ,AVG(SAL)FROM EMPGROUP by JOBHAVING JOB = “PRESIDENT‟OR JOB = “MANAGER‟高效:SELECT JOB ,AVG(SAL)FROM EMPWHERE JOB = “PRESIDENT‟OR JOB = “MANAGER‟GROUP by JOB4)用>=替代>如果DEPTNO 上有一个索引,高效:SELECT * FROM EMPWHERE DEPTNO >=4低效:SELECT *FROM EMPWHERE DEPTNO >3两者的区别在于,前者DBMS将直接跳到第一个DEPT 等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT 大于3的记录。