20个数据库设计最佳实践: 使用明确、统一的标明和列名,例如 School, SchoolCourse, CourceID。 数据表名使用单数而不是复数,例如 StudentCourse,而不是StudentCourses。 数据表名不要使用空格。 数据表名不要使用不必要的前缀或者后缀,例如使用School,而不是TblSchool,或者SchoolTable等等。 数据库中的密码要加密,到应用中再解密。 使用整数作为ID字段,也许现在没有这个必要,但是将来需要,例如关联表,索引等等。 使用整数字段做索引,否则会带来很大的性能问题 。 使用bit 作为布尔字段,使用整数或者varcha是浪费。同时,这类字段应该以“Is”开头。 要经过认证才能访问数据库,不要给每一个用户管理员权限。 尽量避免使用“select *”,而使用“select [required_column_list]”以获得更好的性能。 假如程序代码比较复杂,使用ORM框架,例如hibernate,iBatis。ORM框架的性能问题可以通过详细的配置去解决。 分割不常使用的数据表到不同的物理存储以获得更好的性能。 对于关键数据库,使用安全备份系统,例如集群,同步等等。 使用外键,非空等限制来保证数据的完整性,不要把所有的东西都扔给程序。 缺乏数据库文档是致命的。你应该为你的数据库设计写文档,包括触发器、存储过程和其他脚本。 对于经常使用的查询和大型数据表,要使用索引。数据分析工具可以帮助你决定如何建立索引。 数据库服务器和网页服务器应该放在不同的机器上。这回提高安全性,并减轻CPU压力。 Image和blob字段不应该定义在常用的数据表中,否则会影响性能。 范式(Normalization)要按照要求使用以提高性能。Normalization做的不够会导致数据冗余,而过度Normalization 会导致太多的join和数据表,这两种情况都会影响性能。 多花点时间在数据库设计上,否则你将来会付出加倍的时间来偿还。设置外键:方法一:SQL语句alter table 表名 add constraint 外键名 foreign key(字段名) references 主表名(字段名) on delete cascade方法二:不想写sql 语句也可以直接用图形化操作 选择你要创建外键的表,反键选择修改表,点击
B. ORACLE的SQL书写规范
/**
ORACLE的SQL规范,目的避免SQL执行错误,提高SQL脚本的质量;
一般执行SQL在command模式下,所以每个完整的语句需要在后面加上斜杠("/"),特别是过程或函数必须在其后加上斜杠("/")
多条非过程SQL语句在最后面一条语句后加上斜杠("/"),如insert、update、delete。在执行完,做下commit;
例子以表名TEST1说明,注意:create_str使用的varchar2类型,长度5000,如果SQL太长,要调整长度。
*/
declare
create_str varchar2(5000) := 'create table TEST1(ID int,REALNAME varchar2(32))';
count_flag number;
begin
select count(*)
into count_flag
from user_tables
where table_name = 'TEST1';
if count_flag < 1 then
execute immediate create_str;
else
execute immediate 'drop table TEST1';
execute immediate create_str;
--字段注解规范
execute immediate 'COMMENT ON COLUMN "TEST1"."ID" IS ''编号''';
execute immediate 'COMMENT ON COLUMN "TEST1"."REALNAME" IS ''姓名''';
end if;
end;
/
declare
add_str varchar2(5000) := 'alter table TEST1 add NICKNAME varchar(32)';
count_flag number;
begin
select count(*)
into count_flag
from user_tab_columns
where table_name = 'TEST1'
and column_name = 'NICKNAME';
if count_flag < 1 then
execute immediate add_str;
--字段注解规范
execute immediate 'COMMENT ON COLUMN "TEST1"."NICKNAME" IS ''昵称''';
end if;
end;
/
declare
add_str varchar2(5000) := 'alter table TEST1 modify NICKNAME varchar(100)';
count_flag number;
begin
select count(*)
into count_flag
from user_tab_columns
where table_name = 'TEST1'
and column_name = 'NICKNAME';
if count_flag = 1 then
execute immediate add_str;
--字段注解规范
execute immediate 'COMMENT ON COLUMN "TEST1"."NICKNAME" IS ''昵称''';
end if;
end;
/
declare
add_str varchar2(5000) := 'alter table TEST1 drop column NICKNAME';
count_flag number;
begin
select count(*)
into count_flag
from user_tab_columns
where table_name = 'TEST1'
and column_name = 'NICKNAME';
if count_flag = 1 then
execute immediate add_str;
end if;
end;
/
declare
create_str varchar2(5000) := 'create index IDX_TEST1_ID on TEST1(id)';
count_flag number;
begin
select count(*) into count_flag from user_indexes where table_name='TEST1' and index_name='IDX_TEST1_ID';
if count_flag < 1 then
execute immediate create_str;
else
execute immediate 'drop index IDX_TEST1_ID';
execute immediate create_str;
end if;
end;
/
declare
create_str varchar2(5000) := 'create sequence SEQ_TEST1 minvalue 1 maxvalue 999999999999 start with 1 increment by 1';
count_flag number;
begin
select count(*) into count_flag from user_sequences where sequence_name='SEQ_TEST1';
if count_flag < 1 then
execute immediate create_str;
else
execute immediate 'drop sequence SEQ_TEST1';
execute immediate create_str;
end if;
end;
/
insert into TEST1
(id, realname, nickname)
select 1, '网名', '网虫'
from al
where not exists (select * from TEST1 where id = 1);
/
update TEST1 set realname='网名', nickname='网虫' where id=1;
/
delete from TEST1 t where t.id=1;
/
C. sql查询语句格式是什么
sql查询语句格式是:
D. 如何编写健壮的sql代码
所谓健壮就是出错少,能扩展(重写次数少),执行效率高的代码。 这个是所有代码工的想法,不过要写这样的代码有一个必须的前提,就是你要足够了解业务。只有足够了解业务才能写出最合适的代码。 举个例子,在保险行业编写代码,为某一个险种写代码,所有的内容都是静态sql(按照一般的意义来说,静态sql都很健壮,因为不可能出错,解析快),但是也有问题,那就是可重复利用率不高,比如你要给10个险种写代码,代码类似,那么是不是要写10个静态sql,这样占地方不说,将来可能出现什么问题(比如某保险条款更改),那么可能要修改10次代码,甚至重写10次代码,这个工作量就很大(毕竟现在没有哪家保险公司只有10个险种)。 那么可能就要改为变量的动态sql(动态sql各种测试写起来麻烦,而且实际应用中出现问题的可能性远远大于静态sql),还是这10个险种。可能一个存储过程就搞定了,这样修改的话,可能也简单很多。 但是还有问题,假设修改某一个险种的内容,那么怎么改?去掉这个险种很容易,那么另外一个是不是要重新编写,一切从头来,这种代码也不能称为健壮。 那么什么样子是健壮?要用业务知识对这10个险种进行分类,假设其中有5个已经卖了10年以上,而且变化不大,近三年内没有变化,销售量也差不多,那么就说明这5个不太可能有变化,那么可以放在一起。另外5个中,有三个是今年刚刚出现的新险种,还要经过市场考验的,那么就单独设立。还有两个近三年内有较大变化,或者可能有什么其他问题(比如销售量很小,正在考虑取消等),那么这两个也可以作为一个存储过程,甚至单独设立,这就要根据实际情况判断了。 不过做到以上这些,没有业务知识是绝对办不到的,所以说健壮sql的前提是精通业务。 再精通业务的前提下,才是sql技巧(这里不考虑表的设置,如果考虑表,那么够论文的)。一般来说越简单的sql越健壮,但是实际应用中, select aaa from bbb的形式很少,大多数需求都比较复杂,那就要看sql的基本功了。 举个例子,一个人要两张表的笛卡尔积结果,如果不知道什么是笛卡尔积,那么怎么给出结果?写法很简单,但是不知道就不会(也就是说的“难者不会,会者不难”),所以基本上基础扎实加上经常写,那么sql技巧总会提高了。 以上两点搞定了,别说健壮sql,镔铁sql都行。
E. 在进行SQL脚本编写规范
没错,加了索引会更新索引。导致慢也就会有可能产生索死。
F. 访问oracle 的sql 语句的规范是什么
SQL的使用规范:
i. 尽量避免大事务操作,慎用holdlock子句,提高系统并发能力。
ii. 尽量避免反复访问同一张或几张表,尤其是数据量较大的表,可以考虑先根据条件提取数据到临时表中,然后再做连接。
iii. 尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该改写;如果使用了游标,就要尽量避免在游标循环中再进行表连接的操作。
iv. 注意where字句写法,必须考虑语句顺序,应该根据索引顺序、范围大小来确定条件子句的前后顺序,尽可能的让字段顺序与索引顺序相一致,范围从大到小。
v. 不要在where子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
vi. 尽量使用exists代替select count(1)来判断是否存在记录,count函数只有在统计表中所有行数时使用,而且count(1)比count(*)更有效率。
vii. 尽量使用“>=”,不要使用“>”。
viii. 注意一些or子句和union子句之间的替换
ix. 注意表之间连接的数据类型,避免不同类型数据之间的连接。
x. 注意存储过程中参数和数据类型的关系。
xi. 注意insert、update操作的数据量,防止与其他应用冲突。如果数据量超过200个数据页面(400k),那么系统将会进行锁升级,页级锁会升级成表级锁。
b) 索引的使用规范:
i. 索引的创建要与应用结合考虑,建议大的OLTP表不要超过6个索引。
ii. 尽可能的使用索引字段作为查询条件,尤其是聚簇索引,必要时可以通过index index_name来强制指定索引
iii. 避免对大表查询时进行table scan,必要时考虑新建索引。
iv. 在使用索引字段作为条件时,如果该索引是联合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用。
v. 要注意索引的维护,周期性重建索引,重新编译存储过程。
c) tempdb的使用规范:
i. 尽量避免使用distinct、order by、group by、having、join、cumpute,因为这些语句会加重tempdb的负担。
ii. 避免频繁创建和删除临时表,减少系统表资源的消耗。
iii. 在新建临时表时,如果一次性插入数据量很大,那么可以使用select into代替create table,避免log,提高速度;如果数据量不大,为了缓和系统表的资源,建议先create table,然后insert。
iv. 如果临时表的数据量较大,需要建立索引,那么应该将创建临时表和建立索引的过程放在单独一个子存储过程中,这样才能保证系统能够很好的使用到该临时表的索引。
v. 如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先truncate table,然后drop table,这样可以避免系统表的较长时间锁定。
vi. 慎用大的临时表与其他大表的连接查询和修改,减低系统表负担,因为这种操作会在一条语句中多次使用tempdb的系统表。
d) 合理的算法使用:
根据上面已提到的SQL优化技术和ASE Tuning手册中的SQL优化内容,结合实际应用,采用多种算法进行比较,以获得消耗资源最少、效率最高的方法。具体可用ASE调优命令:set statistics io on, set statistics time on , set showplan on 等。
G. sql语句的写法有什么规范吗大写小写的 谢谢
这个纯是个人书写习惯问题,没有什么规范,主要看自己用哪个舒服了
只有一种情况大小写敏感
select * from table where name ='A' ;
select * from table where name ='a' ;
也就这两种情况下区分大小写
H. 如何进行SQL性能优化
这里分享下mysql优化的几种方法。
1、首先在打开的软件中,需要分别为每一个表创建 InnoDB FILE的文件。
I. SQL编写规范
书写格式 示例代码 存储过程SQL文书写格式例selectc dealerCode round(sum(c submitSubletAmountDLR + c submitPartsAmountDLR + c submitLaborAmountDLR) / count(*) ) as avg decode(null x xx CNY )from (selecta dealerCode a submitSubletAmountDLR a submitPartsAmountDLR a submitLaborAmountDLRfrom SRV_C_F awhere (to_char(a ORIGSUBMITTIME yyyy/mm/dd ) >= Date Range(start) and to_char(a ORIGSUBMITTIME yyyy/mm/dd ) <= Date Range(end) and nvl(a deleteflag ) <> )union allselectb dealerCode b submitSubletAmountDLR b submitPartsAmountDLR b submitLaborAmountDLRfrom SRV_CHistory_F bwhere (to_char(b ORIGSUBMITTIME yyyy/mm/dd ) >= Date Range(start) and to_char(b ORIGSUBMITTIME yyyy/mm/dd ) <= Date Range(end) and nvl(b deleteflag ) <> )) cgroup by c dealerCodeorder by avg desc;Java source里的SQL字符串书写格式例strSQL = insert into Snd_FinanceHistory_Tb + (DEALERCODE + REQUESTSEQUECE + HANDLETIME + JOBFLAG + FRAMENO + INMONEY + REMAINMONEY + DELETEFLAG + UPDATECOUNT + CREUSER + CREDATE + HONORCHECKNO + SEQ) + values ( + draftInputDetail dealerCode + + + draftInputDetail requestsequece + + sysdate + + + frameNO + + requestMoney + + remainMoney + + + + + draftStruct employeeCode + + sysdate + + draftInputDetail honorCheckNo + + index + ) ; ) 缩进对于存储过程文件 缩进为 个空格对于Java source里的SQL字符串 不可有缩进 即每一行字符串不可以空格开头 ) 换行 > Select/From/Where/Order by/Group by等子句必须另其一行写 > Select子句内容如果只有一项 与Select同行写 > Select子句内容如果多于一项 每一项单独占一行 在对应Select的基础上向右缩进 个空格(Java source无缩进) > From子句内容如果只有一项 与From同行写 > From子句内容如果多于一项 每一项单独占一行 在对应From的基础上向右缩进 个空格(Java source无缩进) > Where子句的条件如果有多项 每一个条件占一行 以AND开头 且无缩进 > (Update)Set子句内容每一项单独占一行 无缩进 > Insert子句内容每个表字段单独占一行 无缩进 values每一项单独占一行 无缩进 > SQL文中间不允许出现空行 > Java source里单引号必须跟所属的SQL子句处在同一行 连接符( + )必须在行首 ) 空格 > SQL内算数运算符 逻辑运算符连接的两个元素之间必须用空格分隔 > 逗号之后必须接一个空格 > 关键字 保留字和左括号之间必须有一个空格 不等于统一使用 <> Oracle认为 != 和 <> 是等价的 都代表不等于的意义 为了统一 不等于一律使用 <> 表示 使用表的别名 数据库查询 必须使用表的别名 SQL文对表字段扩展的兼容性 在Java source里使用Select *时 严禁通过getString( )的形式得到查询结果 必须使用getString( 字段名 )的形式使用Insert时 必须指定插入的字段名 严禁不指定字段名直接插入values 减少子查询的使用 子查询除了可读性差之外 还在一定程度上影响了SQL运行效率请尽量减少使用子查询的使用 用其他效率更高 可读性更好的方式替代 适当添加索引以提高查询效率 适当添加索引可以大幅度的提高检索速度请参看ORACLE SQL性能优化系列 对数据库表操作的特殊要求 本项目对数据库表的操作还有以下特殊要求 ) 以逻辑删除替代物理删除注意 现在数据库表中数据没有物理删除 只有逻辑删除以deleteflag字段作为删除标志 deleteflag= 代表此记录被逻辑删除 因此在查询数据时必须考虑deleteflag的因素deleteflag的标准查询条件 NVL(deleteflag ) <> ) 增加记录状态字段数据库中的每张表基本都有以下字段 DELETEFLAG UPDATECOUNT CREDATE CREUSER UPDATETIME UPDATEUSER要注意在对标进行操作时必须考虑以下字段插入一条记录时要置DELETEFLAG= UPDATECOUNT= CREDATE=sysdate CREUSER=登录User查询一条记录时要考虑DELETEFLAG 如果有可能对此记录作更新时还要取得UPDATECOUNT作同步检查修改一条记录时要置UPDATETIME=sysdate UPDATEUSER=登录User UPDATECOUNT=(UPDATECOUNT+ ) mod 删除一条记录时要置DELETEFLAG= ) 历史表数据库里部分表还存在相应的历史表 比如srv_c_f和srv_chistory_f在查询数据时除了检索所在表之外 还必须检索相应的历史表 对二者的结果做Union(或Union All) 用执行计划分析SQL性能 EXPLAIN PLAN是一个很好的分析SQL语句的工具 它可以在不执行SQL的情况下分析语句通过分析 我们就可以知道ORACLE是怎样连接表 使用什么方式扫描表(索引扫描或全表扫描) 以及使用到的索引名称按照从里到外 从上到下的次序解读分析的结果EXPLAIN PLAN的分析结果是用缩进的格式排列的 最内部的操作将最先被解读 如果两个操作处于同一层中 带有最小操作号的将首先被执行目前许多第三方的工具如PLSQL Developer和TOAD等都提供了极其方便的EXPLAIN PLAN工具PG需要将自己添加的查询SQL文记入log 然后在EXPLAIN PLAN中进行分析 尽量减少全表扫描 ORACLE SQL性能优化系列 选择最有效率的表名顺序(只在基于规则的优化器中有效) ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名 因此FROM子句中写在最后的表(基础表driving table)将被最先处理在FROM子句中包含多个表的情况下 必须选择记录条数最少的表作为基础表当ORACLE处理多个表时 会运用排序及合并的方式连接它们首先 扫描第一个表(FROM子句中最后的那个表)并对记录进行排序 然后扫描第二个表(FROM子句中最后第二个表) 最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并例如:表 TAB 条记录表 TAB 条记录选择TAB 作为基础表 (最好的方法)select count(*) from tab tab 执行时间 秒选择TAB 作为基础表 (不佳的方法)select count(*) from tab tab 执行时间 秒如果有 个以上的表连接查询 那就需要选择交叉表(intersection table)作为基础表 交叉表是指那个被其他表所引用的表例如:EMP表描述了LOCATION表和CATEGORY表的交集SELECT *FROM LOCATION L CATEGORY C EMP EWHERE E EMP_NO BEEEN AND AND E CAT_NO = C CAT_NOAND E LOCN = L LOCN将比下列SQL更有效率SELECT *FROM EMP E LOCATION L CATEGORY CWHERE E CAT_NO = C CAT_NOAND E LOCN = L LOCNAND E EMP_NO BEEEN AND WHERE子句中的连接顺序 ORACLE采用自下而上的顺序解析WHERE子句根据这个原理 表之间的连接必须写在其他WHERE条件之前 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾例如 (低效 执行时间 秒)SELECT *FROM EMP EWHERE SAL > AND JOB = MANAGER AND < (SELECT COUNT(*) FROM EMP WHERE MGR=E EMPNO);(高效 执行时间 秒)SELECT *FROM EMP EWHERE < (SELECT COUNT(*) FROM EMP WHERE MGR=E EMPNO)AND SAL > AND JOB = MANAGER ; SELECT子句中避免使用 * 当你想在SELECT子句中列出所有的COLUMN时 使用动态SQL列引用 * 是一个方便的方法 不幸的是 这是一个非常低效的方法实际上 ORACLE在解析的过程中 会将 * 依次转换成所有的列名这个工作是通过查询数据字典完 lishixin/Article/program/Oracle/201311/18246
J. 请教写sql代码时,缩进格式的规范问题
有多种风格,但有一个基本点:增强可读性。
缩进是一种重要的格式化,所有格式化(换行、关键字大写、运算符前后加空格、。。。)都是这个目的。
附注:
A)分隔符【,】写在前,是为了复制、删除方便;
B )子查询缩进多少,AND是否缩进等,则取决于个人的目的。
当然,缩进过多会影响页面空间。所以,我个人是只喜欢缩进一个TAB。