SQL应用及优化.ppt
《SQL应用及优化.ppt》由会员分享,可在线阅读,更多相关《SQL应用及优化.ppt(35页珍藏版)》请在三一办公上搜索。
1、SQL应用及优化,2009.04,目录,一、Sql应用查询语句函数多表查询和子查询DML语句应用二、Sql优化SQL语句的优化器调优SQL语句的相关工具影响CBO模式的统计信息SQL语句优化的基本原则RBO模式下的规则和建议SQL语句中的hint写SQL语句的一些提示三、附录:常见Oracle HINT的用法监控数据库性能的SQL,SQL应用,一、基本查询语法:SELECT*|DISTINCT column|expression alias,.FROM tableWHERE condition(s)ORDER BY column,expr,alias ASC|DESC;SELECT colum
2、n,group_function FROM table WHERE condition GROUP BY group_by_expression HAVING group_condition ORDER BY column;Where 中可以使用的一些运算 any,some,all,not,and,or(需要注意,建议使用or的地方都加上括号),in,not in,between,exists,Is null,is not null,likeOrder by asc,desc 排序字段必须在 选择的列表中,对null 要注意,默认是在最后的。可以通过nulls last 或nulls firs
3、t来改变。Order by、having 中可以使用子查询表的集合操作:union、union all、minus、intersectDual 选择系统变量和计算表达式。如select sysdate,user from dual;Select 中的 Group by使用与having 典型实例:1、汇总 2、查重等SELECT file_name,COUNT(*)FROM log_file_twhere modual=IMP and partition_id_month=3 GROUP BY file_name HAVING COUNT(*)1其他select使用 如:复制表结构 Creat
4、e table t1 as Select*from t where 1=2;,SQL应用,二、函数使用中注意单行函数和多行函数CASE expressionCASE expr WHEN comparison_expr1 THEN return_expr1 WHEN comparison_expr2 THEN return_expr2 WHEN comparison_exprn THEN return_exprn ELSE else_exprENDDECODE functionDECODE(col|expression,search1,result1,search2,result2,.,defa
5、ult)示例:update serv_biz_code set carry_type=case when service_type=MAS then SMS when service_type=400 then VOICE else carry_typeend;update serv_biz_code set carry_type=case service_type WHEN MAS then SMS when 400 then VOICE else carry_typeend;好处:只使用一次全表扫描。简单明了。,SQL应用,三、多表查询和子查询注意:避免笛卡尔积 建议:对表使用别名,关联相
6、关的字段。外连接使用(+)Oracle9i开始支持,sql 99标准。,SELECTtable1.column,table2.columnFROMtable1,table2WHEREtable1.column=table2.column(+);,SQL应用,示例对NOT in 的改进语句的几种方法SELECT s.ec_code FROM serv_biz_code s WHERE s.ec_code NOT IN(SELECT t.customer_code FROM bill_item_usage_detail t)SELECT s.ec_code FROM serv_biz_code s
7、 WHERE NOT EXISTS(SELECT 1 FROM bill_item_usage_detail b WHERE s.ec_code=b.customer_code)SELECT s.ec_code FROM serv_biz_code s,bill_item_usage_detail bWHERE s.ec_code=b.customer_code(+)AND b.customer_code IS NULL 多列的子查询(,)in(,)SELECT s.ec_code,s.product_code FROM serv_biz_code s WHERE(s.ec_code,s.pr
8、oduct_code)NOT IN(SELECT t.customer_code,t.product_code FROM bill_item_usage_detail t)其他DML中的子查询update/*+ROWID(bb)*/ur_sms_200904_t bb set bb.charge1=(select b.charge1 from jxj_rater_ur_20090417 b where bb.rowid=b.id)where exists(select 1 from jxj_rater_ur_20090417 aa where aa.id=bb.rowid);注意:aa.id和
9、bb.rowid 的值是物理地址,如果表或记录变更过该语句讲实效。Rowid 和rownum 的使用 rowmum的数据具有随机性,可以通过建立子查询的视图,根据固定的关键字进行order by 后再使用,尽量保证数据唯一性。,SQL应用,子查询单行子查询和多行子查询,注意使用的条件With as 使用介绍提高查询的性能,如果一个sql中相同的部分比较多,可以放到一起,执行一个with as在实际应用中,可以应用到各个环节,SQL应用示例,-数据库为bill数据库,目的为了检查Rater计算结果是否正确,从bill_item_usage_detail表中取出的累计条数与本身套餐值直接计算,看是
10、否-与bill_item_usage_detail表中累计的钱相同,如果相同,认为Rater计算正确,如果不相同,需要查找原因-创建帐单汇总表,找到指定月份指定出账日前的所有计费的话单条数累计-drop table zhp_200903_bill_item;CREATE TABLE zhp_200903_bill_item as SELECT customer_code,SUM(accu_occurence)bill_count,SUM(charge)bill_charge-,SUM(charge)/SUM(accu_occurence)fee FROM bill_item_usage_det
11、aillink_imp b WHERE b.acct_month=200904 AND b.charge_item IS NOT NULL and product_code=010101001 AND b.partition_id_day 0/*如果达不到累计数量,则bill_count-y=0*/THEN b.bill_count-y ELSE 0 END COUNT-Y,CASE WHEN z 0 THEN CASE WHEN(b.bill_count-y)*z=to_date(20090401,yyyymmdd)t1,chg_plan_inst_bridge t2 WHERE t1.ch
12、g_plan_inst_id=t2.cp_inst_id/*AND t2.svc_opt_code=Comm_Fee*/),ec2info AS(SELECT DISTINCT t1.customer_code ec_code,t2.param_name,t2.param_value FROM(SELECT customer_code,chg_plan_inst_id FROM ecgroup2.subscribed_chg_plan a,ecgroup2.cus_product_bridge b WHERE a.sub_id=b.id AND b.product_code=010101001
13、 and a.expiry_date=to_date(20090401,yyyymmdd)t1,chg_plan_inst_bridge t2 WHERE t1.chg_plan_inst_id=t2.cp_inst_id/*AND t2.svc_opt_code=Comm_Fee*/)/*两个ecgroup中的定购套餐*/SELECT t.ec_code,nvl(t.param_value,0)x,nvl(tt.param_value,0)y,nvl(ttt.param_value,0)z FROM(SELECT*FROM ec1info WHERE param_name=x)t,(SELE
14、CT*FROM ec1info WHERE param_name=y)tt,(SELECT*FROM ec1info WHERE param_name=z)tttWHERE t.ec_code=tt.ec_code(+)AND tt.ec_code=ttt.ec_code(+)AND(t.param_value 0 OR tt.param_value 0)UNION ALLSELECT t.ec_code,nvl(t.param_value,0)x,nvl(tt.param_value,0)y,nvl(ttt.param_value,0)z FROM(SELECT*FROM ec2info W
15、HERE param_name=x)t,(SELECT*FROM ec2info WHERE param_name=y)tt,(SELECT*FROM ec2info WHERE param_name=z)tttWHERE t.ec_code=tt.ec_code(+)AND tt.ec_code=ttt.ec_code(+)AND(t.param_value 0 OR tt.param_value 0)aa,zhp_200903_bill_item bWHERE aa.ec_code=b.customer_code;,SQL应用,四、DML1、insert nologing 和append2
16、、update 3、delete4、merge事物控制语句COMMITSAVEPOINTROLLBACK生产数据一定先备份,然后再操作。同时注意,减少for update的操作。(锁表,同时操作步骤(sql)、数据等没有备份对以后问题的查找会有一定得影响,尽量使用update语句,对操作现场和数据保留)Delete-truncate table(DDL)truncate 没有回滚段,不能undo,不进行trigger 的触发。且自动完成commit。比较危险,慎用!好处:快。如果数据表经常的delete 和insert 会产生很多碎片,即使数据少任然会很慢,此时可以用truncate,对表进行
17、清理。此时如果有索引最好rubuild一下。,SQL应用,insert append需要注意的一个小问题1.append方式添加记录对insert into.values语句不起作用。2.以append方式批量插入的记录,其存储位置在hwm 之上,即使hwm之下存在空闲块也不能使用。3.以append方式插入记录后,要执行commit,才能对表进行查询。否则会出现错误:ORA-12838:无法在并行模式下修改之后读/修改对象4.在归档模式下,要把表设置为nologging,然后以append方式批量添加记录,才会显著减少redo数量。在非归档模式下,不必设置表的nologging属性,即可减少
18、redo数量。如果表上有索引,则append方式批量添加记录,不会减少索引上产生的redo数量,索引上的redo数量可能比表的redo数量还要大。用insert append可以实现直接路径加载,速度比常规加载方式快。但有一点需要注意:insert append时在表上加“6”类型的锁,会阻塞表上的所有DML语句。因此在有业务运行的情况下要慎重使用。若同时执行多个insert append对同一个表并行加载数据,并不一定会提高速度。因为每一时刻只能有一个进程在加载(排它锁造成)。Insert ALL When cond1 then Into table1 When cond2 then Int
19、o table2 Select*from tab;,SQL应用 示例,MERGE INTO table_name table_alias USING(table|view|sub_query)alias ON(join condition)WHEN MATCHED THEN UPDATE SET col1=col_val1,col2=col2_val WHEN NOT MATCHED THEN INSERT(column_list)VALUES(column_values);MERGE INTO copy_emp c USING employees e ON(c.employee_id=e.e
20、mployee_id)WHEN MATCHED THEN UPDATE SET c.first_name=e.first_name,c.last_name=e.last_name,.c.department_id=e.department_idWHEN NOT MATCHED THEN INSERT VALUES(e.employee_id,e.first_name,e.last_name,e.email,e.phone_number,e.hire_date,e.job_id,e.salary,mission_pct,e.manager_id,e.department_id);DELETE/*
21、+ROWID(T)*/log_file_t WHERE ROWID IN(SELECT row_id FROM(SELECT file_name,MIN(ROWID)row_id,COUNT(*)FROM log_file_t where modual=IMP and partition_id_month=3 GROUP BY file_name HAVING COUNT(*)1)课后:请指出这条语句的问题?,SQL优化-基本原则,SQL语句的优化器调优SQL语句的相关工具影响CBO模式的统计信息SQL语句优化的基本原则RBO模式下的规则和建议SQL语句中的hint执行计划的稳定性,SQL优化
22、,什么是优化器?优化器(Optimizer)是一组Oracle的内部例行程序,该例行程序用以决定SQL语句的最有效的访问路径。Oracle数据库会自动进行查询优化,这些操作对于用户来说是透明的优化器模式通过初始化参数optimizer_mode设置优化模式在Oracle9i,两种优化模式可以被选择:基于规则的 Rule-based:使用一个分级系统语法(Syntax)驱动和字典(dictionary)驱动的Oracle从早期版本提供RBO优化器,至Oracle10g该优化器不再被支持基于代价的 Cost-based:选择最低代价的路径统计(Statistics)驱动从Oracle7(1992)
23、-Oracle10g主要支持的优化器,SQL优化,设置优化模式在实例级:optimizer_mode=choose|rule|first_rows|first_rows_n|all_rows在会话级:alter session set optimizer_mode=choose|rule|first_rows|first_rows_n|all_rows在语句级:使用提示(hints)Oracle10g?RBO不再被支持缺省的优化器模式为all_rowsOptimizer_modechoose/rule 参数不再支持all_rows/first_rows/first_rows_n 是Oralce
24、10g支持的优化目标,SQL优化-诊断工具概述,STATSPACKEXPLAIN PLANSQL trace 和 TKPROFSQL*Plus autotrace 特性Oracle SQL Analyze,STATSPACK和EXPLAIN PLAN,STATSPACK对数据库进行数据的采集,通过分析报告诊断问题。采集的数据量比较大在STATSPACK中关于SQL的报告STATSPACK 收集了下列关于SQL的信息:SQL ordered by getsSQL ordered by readsSQL ordered by executionsSQL ordered by parse calls
25、EXPLAIN PLAN不需要打开跟踪就可以使用需要 PLAN_TABLE 表:创建解释表:查询 plan_table 表显示执行计划:直接查询 PLAN_TABLE使用脚本 utlxpls.sql(隐藏了并行查询的信息)使用脚本 utlxplp.sql(显示并行查询信息),SQL$ORACLE_HOME/rdbms/admin/utlxplan,SQLExplain plan for 2 select last_name from hr.employees;,使用 SQL Trace 和 TKPROF,SQL TRACE是Oracle提供的用于进行SQL跟踪的手段,是强有力的辅助诊断工具。在
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SQL 应用 优化
链接地址:https://www.31ppt.com/p-2963776.html