SQL应用及优化.ppt

上传人:仙人指路1688 文档编号:2963776 上传时间:2023-03-05 格式:PPT 页数:35 大小:1.13MB
返回 下载 相关 举报
SQL应用及优化.ppt_第1页
第1页 / 共35页
SQL应用及优化.ppt_第2页
第2页 / 共35页
SQL应用及优化.ppt_第3页
第3页 / 共35页
SQL应用及优化.ppt_第4页
第4页 / 共35页
SQL应用及优化.ppt_第5页
第5页 / 共35页
点击查看更多>>
资源描述

《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跟踪的手段,是强有力的辅助诊断工具。在

26、日常的数据库问题诊断和解决中是非常常用的方法。一般,一次跟踪可以分为以下几步:1、界定需要跟踪的目标范围,并使用适当的命令启用所需跟踪。2、经过一段时间后,停止跟踪。此时应该产生了一个跟踪结果文件。3、找到跟踪文件,并对其进行格式化,然后阅读或分析。为了使用 SQL trace 和 TKPROF:设置初始化参数.Alter session set SQL_Trace=true运行应用.Alter session set SQL_Trace=false使用 TKPROF格式化显示跟踪文件的内容.解释输出的结果.启用或禁用 SQL Trace在实例级:SQL_TRACE=TRUE|FALSE在会话

27、级:SQL alter session set SQL_TRACE=true|false;SQL execute DBMS_SESSION.SET_SQL_TRACE 2(true|false);SQL execute DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION 2(session_id,serial_id,true|false);其它方法:Dbms_system.set_evEvent 10046,使用TKPROF格式化跟踪文件,$tkprof tracefile.trc output.txt optionsTKPROF 提供的统计信息Count:执行调用的次数

28、CPU:CPU 使用的描秒数Elapsed:总的持续时间Disk:物理读数Query:一致性读(consistent read)的逻辑读数Current:当前模式(current mode)的逻辑读数Rows:处理的行数,SQL*Plus AUTOTRACE,在SQL*Plus环境下使用的执行计划功能创建 PLAN_TABLE 表创建和授予 Plustrace 角色 SQL$ORACLE_HOME/sqlplus/admin/plustrce.sqlSQL grant plustrace to scott;Autotrace 语法:set autotrace off|on|traceonly

29、explain|statistics,影响CBO模式的统计信息,管理统计信息使用 ANALYZE 命令收集或者删除统计.也可以使用 DBMS_STATS 包:GATHER_TABLE_STATSGATHER_INDEX_STATSGATHER_SCHEMA_STATSGATHER_DATABASE_STATS存放统计信息的数据字典下列数据字典和特殊视图在执行ANALYZE命令后可以提供非常有用的统计信息:DBA_TABLES,DBA_TAB_COLUMNSDBA_CLUSTERSDBA_INDEXES,INDEX_STATSINDEX_HISTOGRAM,DBA_TAB_HISTOGRAMS这

30、些统计信息是静态的,将一直保持到再次执行ANALYZE命令或者DBMS_STATS包.,影响CBO模式的统计信息,表的统计信息行数块数和空块数平均可用的空闲空间行链和行迁移数平均行长度最后一次 ANALYZE 时间和样例值大小数据字典:DBA_TABLES索引的统计信息索引级别(高度)叶子块数和唯一值数每个关键字的平均叶子块数每个关键字的平均数据块数索引记录数聚簇因子(Clustering factor)数据字典:DBA_INDEXES列的统计信息唯一值数最小值,最大值(以 RAW binary 格式存储)最后一次 ANALYZE 的时间和样例值大小数据字典:USER_TAB_COL_STAT

31、ISTICS,SQL优化基本原则:,减少重分析合理使用索引使用合理的表连接方式减少不必要的排序降低逻辑读,SQL优化,SQL解析Is it in an open cursor(SESSION_CACHED_CURSORS=on)?|no|yes OPEN A CURSOR|Statement is Hashed and compared(with the Hashed value in the sql area)|Is it in sql area?-YES-(Soft Parse)-|EXECUTE|no PARSE STATEMENT(Hard Parse)-|EXECUTE|Soft p

32、arse 软解析,通过hash计算查找sql在共享池中存在于是重用执行计划的过程Hard parse 硬解析,通过hash计算查找发现sql在共享池中不存在,于是重新产生执行计划的过程 软解析和硬解析对资源的消耗差异很大,SQL优化,SQL语句的解析执行步骤:1 语法分析 分析语句的语法是否符合规范,衡量语句中各表达式的意义。2 语义分析 检查语句中涉及的所有数据库对象是否存在,且用户有相应权限。3 视图转换 将涉及视图的查询语句转换为相应的对基表查询语句。4 表达式转换 将复杂的SQL表达式转换为较简单的等效连接表达式。5 选择优化器 不同的优化器一般产生不同的“执行计划”6 选择连接方式

33、ORACLE有三种连接方式,对多表连接ORACLE可选择适当的连接方式。7 选择连接顺序 对多表连接ORACLE选择哪一对表先连接,选择这两表中哪个表做为源数据表。8 选择数据的搜索路径 根据以上条件选择合适的数据搜索路径,如是选用全表搜索还是利用索引或是其他的方式。9 产生“执行计划”并执行,SQL优化,数据库共享池为什么要使用共享池SQL解析代价比较高有限周期内系统一般运行大量重复代码系统的sql数量总是有限的合理的使用共享池能够降低重分析的次数如何减少重分析的次数配置足够大的共享池采取统一的语句书写规则使用绑定变量在不能使用绑定变量的基础上使语句实现代码共享,SQL优化,绑定变量如果想使

34、你的数据库陷入困境,只要不使用绑量这一个条件就足够了!select*from t where col=123;select*from t where col=234;select*from t where col=:v;不使用绑定的影响使用更多的共享池来缓存sql和执行计划使用更多的cpu资源将产生更多的数据库内部锁导致共享池管理代价的增加,SQL优化,数据库对绑定的补救措施Cursor_sharing=force/exact/similar我们为什么还要强调在程序中绑定 cursor_sharing 存在bug cursor_sharing 影响sql执行计划 cursor_sharing

35、消耗额外内存和cpu 在应用中绑定的代价低,维护的代价很高 由数据库设置Cursor_sharing 风险很高,SQL优化,表之间三种连接方式合并连接(sort merge join):是集合的合并操作,一般是在没有有效的索引时使用循环嵌套连接(nested loop join):是一种循环的行操作,对于事务型处理是首选。在OLTP系统中常见,使用有效的索引来执行操作。散列连接(hash join):使用连接表的全表扫描完成。Oracle执行每个表的全表扫描,并根据内存情况,将每个表分成所需的多散列分区,然后通过另一个表的相应分区试探这个散列表。散列连接适合大表的连接。注意设置合适的参数:ha

36、sh_area_size和hash_mutilblock_io_count,SQL优化,RBO下Sql语句的优化规则在RBO模式下,Sql语句的执行遵循着规则级别的优先级:Single row by ROWIDSingle row by cluster join Single row by hash cluster key with unique key Single row by unique index Cluster join Hash cluster keyIndexed cluster key Composite key Single-column non-unique indexB

37、ounded range search on indexed columnsUnbounded range search on indexed columnsSort-merge join MAX or MIN of indexed column ORDER BY on indexed columns Full table-scan,写SQL语句的一些提示,从I/O的观点来看,使用索引没有意义时建议使用全表扫描如果查询中包含了子查询,那么注意首先优化子查询注意关联子查询,尽量减少关联子查询的使用,因为它的代价很高,并且非常消耗CPU在Sql语句中使用not exists 代替 not in用表

38、连接替换EXISTS 使用带有前导字段的like来替换substr函数考虑使用union all代替多个or连接操作如果经常执行主细表的联合查询,建立外键索引考虑使用非唯一索引支持唯一性约束条件主动的确定使用循环嵌套、合并连接、散列连接,尽可能测试使用一种代价较小的连接方式。如果需要在pl/sql 程序中使用动态sql,建议使用execute immediate对于非常大的表,考虑使用表和索引的分区如果需要在创建索引的时候减少所需时间,可以在会话集设置比较大的sort_area_size考虑更多的使用decode函数,而不是在pl/sql中作判断一定要周期性的收集信息,及时发现系统中的潜在问题

39、选择最有效率的表名顺序(只在基于规则的优化器中有效)两个表联合查询,数据量小的表放最后;三个以上表联合查询,交叉表放最后。WHERE子句中的连接条件书写顺序 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾 使用TRUNCATE替代DELETE 尽量多使用COMMIT(保证数据完整性的基础上)减少对表的访问次数(减少逻辑读)避免索引列的类型 隐式转换造成的索引无效,Oracle hints,Hints主要用来改变SQL执行计划:指定优化模式 指定表数据的获取方式 指定表连接的顺序 指定表连接的方式 语法:/*+HINT HINT.*/(在PLSQL中,+与hint的第一个字符之间的

40、空格是很重要的/*+ALL_ROWS*/是正确的,但/*+ALL_ROWS*/是错误的)建议少用,使用不好会影响效率。如:并行太多会影响整个数据库的性能。,1、与Optimizer Mode优化模式相关:FIRST_ROWS,ALL_ROWS:Force CBO first rows or all rows RULE:Force Rule if possible ORDERED:Access tables in the order of the FROM clause 2 读取方式:FULL(tab):Use FTS on tab CACHE(tab):If table within trea

41、t as if it had the CACHE option set.Only applies if FTS used.NOCACHE(tab):Do not cache table even if it has CACHE option set.Only relevant for FTS ROWID(tab):Access tab by ROWID directly SELECT/*+ROWID(table)*/.FROM tab WHERE ROWID between HASH(tab):Use hash scan to access tab INDEX(tab index):Use i

42、ndex to access tab INDEX_ASC(tab index):Use index to access tab for range scan.INDEX_DESC(tab index):Use descending index range scan INDEX_FFS(tab index):Index fast full scan-rather than FTS.3 连接:USE_NL(tab):Use table tab as the driving table in a Nested Loops join.If the driving row source is a com

43、bination of tables name one of the tables in the inner join and the NL should drive off the entire row-source.Does not work unless accompanied by an ORDERED hint.USE_MERGE(tab.):Use tab as the driving table in a sort-merge join.Does not work unless accompanied by an ORDERED hint.USE_HASH(tab1 tab2):

44、Join each specified table with another row source with a hash join.tab1 is joined to previous row source using a hash join.(=7.3)4 并行查询选项:PARALLEL(table,):Use parallel degree/instances as specified PARALLEL_INDEX(table,index,degree,instances):Parallel range scan for partitioned index 5 其他:APPEND:Onl

45、y valid for INSERT.SELECT.Allows INSERT to work like direct load or to perform parallel insert.NOAPPEND:Do not use INSERT APPEND functionality REWRITE(v1,v2):8.1+With a view list use eligible materialized view Without view list use any eligible MV NOREWRITE:8.1+Do not rewrite the query,附录:在SQL优化过程中常

46、见Oracle HINT的用法,在SQL语句优化过程中,我们经常会用到hint,现总结一下1./*+ALL_ROWS*/表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化.例如:SELECT/*+ALL+_ROWS*/EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO=SCOTT;2./*+FIRST_ROWS*/表明对语句块选择基于开销的优化方法,并获得最佳响应时间,使资源消耗最小化.例如:SELECT/*+FIRST_ROWS*/EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO=S

47、COTT;3./*+CHOOSE*/表明如果数据字典中有访问表的统计信息,将基于开销的优化方法,并获得最佳的吞吐量;表明如果数据字典中没有访问表的统计信息,将基于规则开销的优化方法;例如:SELECT/*+CHOOSE*/EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO=SCOTT;4./*+RULE*/表明对语句块选择基于规则的优化方法.例如:SELECT/*+RULE*/EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO=SCOTT;5./*+FULL(TABLE)*/表明对表选择全局扫描的方法.例如

48、:SELECT/*+FULL(A)*/EMP_NO,EMP_NAM FROM BSEMPMS A WHERE EMP_NO=SCOTT;6./*+ROWID(TABLE)*/提示明确表明对指定表根据ROWID进行访问.例如:SELECT/*+ROWID(BSEMPMS)*/*FROM BSEMPMS WHERE ROWID=AAAAAAAAAAAAAAAND EMP_NO=SCOTT;7./*+CLUSTER(TABLE)*/提示明确表明对指定表选择簇扫描的访问方法,它只对簇对象有效.例如:SELECT/*+CLUSTER*/BSEMPMS.EMP_NO,DPT_NO FROM BSEMPMS

49、,BSDPTMSWHERE DPT_NO=TEC304 AND BSEMPMS.DPT_NO=BSDPTMS.DPT_NO;8./*+INDEX(TABLE INDEX_NAME)*/表明对表选择索引的扫描方法.例如:SELECT/*+INDEX(BSEMPMS SEX_INDEX)USE SEX_INDEX BECAUSE THERE ARE FEWMALE BSEMPMS*/FROM BSEMPMS WHERE SEX=M;9./*+INDEX_ASC(TABLE INDEX_NAME)*/表明对表选择索引升序的扫描方法.例如:SELECT/*+INDEX_ASC(BSEMPMS PK_B

50、SEMPMS)*/FROM BSEMPMS WHERE DPT_NO=SCOTT;10./*+INDEX_COMBINE*/为指定表选择位图访问路经,如果INDEX_COMBINE中没有提供作为参数的索引,将选择出位图索引的布尔组合方式.例如:SELECT/*+INDEX_COMBINE(BSEMPMS SAL_BMI HIREDATE_BMI)*/*FROM BSEMPMSWHERE SALV.AVG_SAL;20./*+NO_MERGE(TABLE)*/对于有可合并的视图不再合并.例如:SELECT/*+NO_MERGE(V)*/A.EMP_NO,A.EMP_NAM,B.DPT_NO FR

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号