‘壹’ 怎么优化这条sql
case when 的效率低于isnull(),这是第一个要改的
-----------------------------------------------------------
然后可以使用表表达式来优化查询语句本身,表表达式在查询中只执行一次,这就避免了一些重复的工作 。
started与endeds可以共用一个表表达式:
select storeUuid
,case when createOpeTime < #{starttime} then 0 else 1 end started
,max(createOpeTime) createOpeTime
from store_capital_virtual_account_detail
where createOpeTime >= #{endtime}
group by storeUuid
,case when createOpeTime < #{starttime} then 0 else 1 end
类似的,added与reced也可以共用一个表表达式:
select storeUuid
,inOrOut
,sum(operAmount) add_amount
from store_capital_virtual_account_detail
where (inOrOut=1 or (inOrOut=1 and businessType != 52))
and createOpeTime between #{starttime} and #{endtime}
group by storeUuid,inOrOut
------------------------------------------------------------
再然后如果还需要进一步优化,那么,就要考虑那些可选的条件了。例如,where 条件直接写成smi.storeName LIKE .... and smi.storeNo LIKE ...,对参数进行预处理,没有它们就处理为''
如果能够限定这两个参数至少有一个不为空,那么,可以预见smi集就会小很多,那么,可以进一步把smi相关的查询部分也做成cte,并且用它们对cte_1和cte_2进行过滤以减少cte_1和cte_2做group时前中间集的大小,就能进一步提高效率。
----------------------------------------------------------
如果还不能满足需要,那么,还可以对表结构进行优化。
很多使用java的程序员设计表时为了方便,将很多字段都设计为字符类型,这减少了java代码中对类型的转换处理,但是,查询过程中计算压力都转稼到了sql引擎。当数据量大的时候,对字符字段的搜索效率是远低于一个适当的字段类型的,因为在查询过程中动态索引时,字段宽度与索引时间是强相关的。
inOrOut可以定义为tinyint,这只需要一个字节,可以存放256个不同的值(0~255或-128~127),记录时间的字段首选timestamp,如果不能满足需要可用datetime,它们分别需要4字节与8字节存储空间。
‘贰’ sql语句中的字段的值是一个表达式时,怎么书写才是规范的
插入的语法
insert into table1(字段1,字段2……) values(值1,值2)
insert into table1(字段1,字段2……) select 字段1,字段2…… from table2
修改的语法
update table set 字段1=值1,字段2=值2
‘叁’ 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;
/
‘肆’ SQL语句为什么是大写
在oracle里,如果同样的一条语句,但大小写不同的话,oracle会认为这是2个不同的SQL。所以oracle会对这2个SQL语句解析两次。这样就导致了buffer hit的命中率和soft parse的百分比。如果有很多这样的情况发生,会导致oracle整体性能的下降。
所以强烈建议制定SQL的书写规范
‘伍’ 数据库管理员的职责主要包括哪些
数据库管理员的主要职责为:
1、数据库管理员规定用户访问权限和为不同用户组分配资源。
2、监视监控数据库的警告日志,定期做备份删除。
3、对数据库的备份策略要根据实际要求进行更改,数据的日常备份情况进行监控。
4、规范数据库用户的管理定期对管理员等重要用户密码进行修改。
5、对SQL语句的书写规范的要求一个SQL语句,如果写得不理想,对数据库的影响是很大的。
(5)sql书写规范优化扩展阅读
技术分工
产品的整个生命周期里数据库管理员的职责重要而广泛,这催生了各个纵向的运维技术方向,凡是关系到数据库质量、效率、成本、安全等方面的工作,及涉及到的技术、组件,主要包括:
1、数据库监控技术:包括监控平台的研发、应用,服务监控准确性、实时性、全面性的保障。
2、数据库故障管理:包括服务的故障预案设计,预案的自动化执行,故障的总结并反馈到产品/系统的设计层面进行优化以提高产品的稳定性。
3、数据库容量管理:测量服务的容量,规划服务的机房建设,扩容、迁移等工作。
4、数据库性能优化:从各个方向,包括SQL优化、参数优化、应用优化、客户端优化等,提高数据库的性能和响应速度,改善用户体验。
‘陆’ SQL语句必须用大写,是不是规范为什
SQL推荐使用大写,但是使用小写也也可以!没有严格规定。
‘柒’ 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
‘捌’ 万得资讯数据处理员的复试,主要是什么样的流程、会问什么
复试一般都是管理层的直接对你面试。谈的大概是薪酬、以及你对自己将来职业生涯的规划等等一些问题,再有,不了解你那个公司大不大。一般公司不大的话复试不会特别严格,自由发挥就好,大公司更要讲究应变了,对着他笑绝对有用,一下是数据库管理员的职责。供参考
数据库管理员的职责:
一、 一般监视
1. 监控数据库的警告日志。Alert<sid>.log,定期做备份删除。
2. Linstener.log的监控,/network/admin/linstener.ora。
3. 重做日志状态监视,留意视图v$log,v$logfile,该两个视图存储重做日志的信息。
4. 监控数据库的日常会话情况。
5. 碎片、剩余表空间监控,及时了解表空间的扩展情况、以及剩余空间分布情况,如果有连续的自由空间,手工合并。
6. 监控回滚段的使用情况。生产系统中,要做比较大的维护和数据库结构更改时,用rbs_big01来做。
7. 监控扩展段是否存在不满足扩展的表。
8. 监控临时表空间。
9. 监视对象的修改。定期列出所有变化的对象。
10. 跟踪文件,有初始化参数文件、用户后台文件、系统后台文件
二、 对数据库的备份监控和管理
数据库的备份至关重要,对数据库的备份策略要根据实际要求进行更改,数据的日常备份情况进行监控。由于我们使用了磁带库,所以要对legato备份软件进行监控,同时也要对rman备份数据库进行监控。
三、 规范数据库用户的管理
定期对管理员等重要用户密码进行修改。对于每一个项目,应该建立一个用户。DBA应该和相应的项目管理人员或者是程序员沟通,确定怎样建立相应的数据库底层模型,最后由DBA统一管理,建立和维护。任何数据库对象的更改,应该由DBA根据需求来操作。
四、 对SQL语句的书写规范的要求
一个SQL语句,如果写得不理想,对数据库的影响是很大的。所以,每一个程序员或相应的工作人员在写相应的SQL语句时,应该严格按照《SQL书写规范》一文。最后要有DBA检查才可以正式运行。
五、 DBA深层次要求
一个数据库能否健康有效的运行,仅靠这些日常的维护还是不够的,还应该致力于数据库的更深一层次的管理和研究:数据库本身的优化,开发上的性能优化;项目的合理化;安全化审计方面的工作;数据库的底层建模研究、规划设计;各种数据类型的处理;内部机制的研究;ora-600错误的研究、故障排除,等等很多值得探讨的问题。
‘玖’ 请教写sql代码时,缩进格式的规范问题
有多种风格,但有一个基本点:增强可读性。
缩进是一种重要的格式化,所有格式化(换行、关键字大写、运算符前后加空格、。。。)都是这个目的。
附注:
A)分隔符【,】写在前,是为了复制、删除方便;
B )子查询缩进多少,AND是否缩进等,则取决于个人的目的。
当然,缩进过多会影响页面空间。所以,我个人是只喜欢缩进一个TAB。