欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOCX文档下载  

    ORACLE数据库操作手册2[1]0.docx

    • 资源ID:1663349       资源大小:164.70KB        全文页数:20页
    • 资源格式: DOCX        下载积分:16金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要16金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    ORACLE数据库操作手册2[1]0.docx

    ORACLE 数据库操作手册2.0中国通信集团公司安徽有限公司计费业务部7年11月修改记录版本日期编辑者编辑内容1.02006/2/10见春蕾形成初稿1.12007/8/31见春蕾根据实际情况修订部分章节2.02007/11/05见春蕾一、在第一章(数据库使用注意事项)中增加了关于批量更新数据的大事务分次提交的要求、客户端的配置方法、修改密码方法;二、在第二章(SQL编写注意事项)中增加了关于提示(Hints)的使用。三、增加了第四章(跟踪SQL执行计划),阐述了相关的理论知识和SQL执行计划的跟踪方法。目录ORACLE 数据库操作手册2.01第一章数据库使用注意事项5二、不使用数据库时请及时关闭数据库连接,但是也不能频繁的连接和断开5三、执行了DML操作,请按业务规则,不要忘记执行COMMIT或ROLLBACK。5四、如果是查询和统计不涉及到当天的业务时,不要在生产环境里操作,在BCV库中操作。BCV每天晚上12点同步一次,数据和用户口令、密码和生产环境相同。5五、关联表都很大的查询和统计也尽量用BCV库。6六、生产环境营业时间(特别是营业高峰时间,目前是上午8:00-10:00,下午3:00-4:00)禁止做大数据量的查询和统计,每个查询的执行时间要控制在分钟内。6七、不要执行索引和表的信息的收集。6八、编写程序的时候,注意语句规范,尽量使用变量绑定,减少共享池的使用。6九、按照标准要求编写pl/sql等程序,注意事务的提交、回滚和对各种异常情况的处理。6十、要查看表字段名或随机的少量数据时候,使用desc、也可以使用where1=2或者rowcount<n来查看,而尽量不要直接执行select * from tablename,然后kill会话。6十一、尽量使用索引,避免出现全表扫描,性能影响比单机更大。6十二、对分区表建立索引时,使用local选项。6十三、不要在事务中引入Trigger,建议在事务中实现。6十四、批量更新数据的大的事务分次提交。6十五、客户端的配置。7十六、修改密码。7第二章SQL编写注意事项9一、SELECT 子句中避免使用*9二、查找总记录数时,尽量不要用count(*),而要指定一个有索引的字段。9三、将大的历史表创建为分区表,便于数据转储和删除。9四、使用分区表进行查询时,尽量把分区键作为查询条件的第一个条件。9五、Sequence采用cache/noorder,如果在使用sequence上的列建索引,建议加大cache值。9六、在FROM子句中包含多个表的情况下,选择记录条数最少的表作为基础表,放在FROM子句的最后面。9七、WHERE子句中的连接顺序10八、在需要无条件删除表中数据时,用truncate代替delete。11九、语句中尽量使用表的索引字段,避免做大表的全表扫描。11十、 带通配符(%)的like语句11十一、用EXISTS替代IN11十二、用NOT EXISTS替代NOT IN12十三、尽可能的用UNION-ALL 替换UNION12十四、Order by语句建议13十五、避免使用NOT13十六、使用DECODE函数来减少处理时间14十七、删除重复记录14十八、如果可以使用where条件,尽量不要在having中限制数据14十九、尽量不要使数据排序14二十、使用提示(Hints)15第三章oracle和sybase的SQL区别15一、大小写15二、限制记录数量15三、列的选择16四、连接16五、字符串函数16六、日期函数16七、数据类型转换函数:17八、空值替代函数:17九、sybase的where语句执行 正则符号,但是oracle9i不支持。17十、数字取舍17第四章 跟踪SQL执行计划18一、理论18(一)ORACLE优化器18(二)访问TABLE的方式18(三) 索引访问方式19二、SET TRACE跟踪sql执行计划19第一章数据库使用注意事项一、对BOSS1.5营帐库,营业网址严格按照要求进行配置,不可随意更换。营业网址要求按照下面方式进行分配配置,如果随意更换,会增加营业主机间的数据交互,影响数据库性能,降低营业工作效率。合肥、六安、阜阳、宿州、亳州、淮北、黄山、铜陵配置: http:/10.147.132.5:7001/WebRoot/login.jsp或者http:/main.webA1.amcc/WebRoot/login.jsp芜湖、蚌埠、淮南、马鞍山、安庆、滁州、宣城、巢湖、池州,配置如下:http:/10.147.132.6:8001/WebRoot/login.jsp或者http:/main.webB1.amcc/WebRoot/login.jsp二、不使用数据库时请及时关闭数据库连接,但是也不能频繁的连接和断开数据库连接也是数据库的宝贵资源,数据库支持的数据库连接有限,当不需要使用数据库时,请“优雅”的退出数据库吧,如果能正常退出,请别“结束任务”或KILL -9。如果正在执行SQL的时候突然异常终端,请联系数据库管理员检查处理,以防止数据库一直占用该SQL相关资源。三、执行了DML操作,请按业务规则,不要忘记执行COMMIT或ROLLBACK。不要只执行语句,而不控制事务。当你执行一条DML语句时,数据库会为你分配锁、回滚段、REDO LOG BUFFER等资源。事务结束后,这些资源才能得以释放。四、如果是查询和统计不涉及到当天的业务时,不要在生产环境里操作,在BCV库中操作。BCV每天晚上12点同步一次,数据和用户口令、密码和生产环境相同。bcv是一个节点的数据库,所有的地市的查询的连接配置是同一个,如下: YZDBBCV = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.153.192.45)(PORT = 1521) ) (CONNECT_DATA = (SERVICE_NAME = yzdb) ) )五、关联表都很大的查询和统计也尽量用BCV库。六、生产环境营业时间(特别是营业高峰时间,目前是上午8:00-10:00,下午3:00-4:00)禁止做大数据量的查询和统计,每个查询的执行时间要控制在分钟内。七、不要执行索引和表的信息的收集。八、编写程序的时候,注意语句规范,尽量使用变量绑定,减少共享池的使用。九、按照标准要求编写pl/sql等程序,注意事务的提交、回滚和对各种异常情况的处理。十、要查看表字段名或随机的少量数据时候,使用desc、也可以使用where1=2或者rowcount<n来查看,而尽量不要直接执行select * from tablename,然后kill会话。十一、尽量使用索引,避免出现全表扫描,性能影响比单机更大。十二、对分区表建立索引时,使用local选项。十三、不要在事务中引入Trigger,建议在事务中实现。十四、批量更新数据的大的事务分次提交。在营帐数据库系统繁忙时候,大于300万的数据刷新,建议分次提交,减少异常发生。系统空闲时,大于800万的数据刷新,建议分次提交。十五、客户端的配置。方法一、直接修改tnsnames.oraYZDBBCV = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.147.192.45)(PORT = 1521) ) (CONNECT_DATA = (SERVICE_NAME = yzdb) ) )方法二、使用客户端工具十六、修改密码。用sql*plus使用账号连接数据库 可以从菜单进入 也可以从命令行窗口进入方法一、使用password命令方法二、使用alter命令Alter user 账号 identified by 密码 密码规则问题:有字符、数字、特殊字符要六位以上和以前密码不能有三个以上相同的字符第二章SQL编写注意事项一、SELECT 子句中避免使用*在SELECT子句中列出所有的列时,使用*很方便,但是效率低。因为ORACLE在解析的过程中,会查询数据字典,将*依次转换成所有的列名。所以,直接在SELECT子句中写出想要显示的列。二、查找总记录数时,尽量不要用count(*),而要指定一个有索引的字段。例如索引列为index,使用count(index),这样能利用索引。三、将大的历史表创建为分区表,便于数据转储和删除。四、使用分区表进行查询时,尽量把分区键作为查询条件的第一个条件。五、Sequence采用cache/noorder,如果在使用sequence上的列建索引,建议加大cache值。六、在FROM子句中包含多个表的情况下,选择记录条数最少的表作为基础表,放在FROM子句的最后面。因为在基于规则的优化器中,ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名。FROM子句中写在最后的表将被最先处理。例如:表 TAB1 16,384 条记录表 TAB2 5 条记录选择TAB2作为基础表 (最好的方法)select count(*) from tab1,tab2. 执行时间0.96秒选择TAB1作为基础表 (不佳的方法)select count(*) from tab2,tab1. 执行时间26.09秒如果有3个以上的表连接查询,那就需要选择交叉表作为基础表,交叉表是指那个被其他表所引用的表例如:EMP表描述了LOCATION表和CATEGORY表的交集SELECT *FROM LOCATION L,CATEGORY C,EMP EWHERE E.EMP_NO BETWEEN 1000 AND 2000AND 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 BETWEEN 1000 AND 2000七、WHERE子句中的连接顺序ORACLE采用自下而上的顺序解析WHERE子句。根据这个原理,表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。例如:(低效,执行时间156.3秒)SELECT *FROM EMP EWHERE SAL > 50000AND JOB = 'MANAGER'AND 25 < (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO);(高效,执行时间10.6秒)SELECT *FROM EMP EWHERE 25 < (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO)AND SAL > 50000AND JOB = 'MANAGER'八、在需要无条件删除表中数据时,用truncate代替delete。九、语句中尽量使用表的索引字段,避免做大表的全表扫描。例如Where子句中有联接的列,即使最后的联接值为一个静态值,也不会使用索引。 select * from employeewhere first_name|''|last_name ='Beill Cliton' 这条语句没有使用基于last_name创建的索引。 当采用下面这种SQL语句的编写,Oracle系统就可以采用基于last_name创建的索引。 Select * from employee where first_name ='Beill' and last_name ='Cliton' 十、 带通配符(%)的like语句例如SQL语句: select * from employee where last_name like '%cliton%' 由于通配符(%)在搜寻词首出现,所以Oracle系统不使用last_name的索引。通配符如此使用会降低查询速度。当通配符出现在字符串其他位置时,优化器就能利用索引。在下面的查询中索引得到了使用: select * from employee where last_name like 'c%'十一、用EXISTS替代IN 在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率.低效: SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND DEPTNO IN (SELECT DEPTNO FROM DEPT WHERE LOC ='MELB') 高效: SELECT * FROM EMP (基础表) WHERE EMPNO > 0 AND EXISTS (SELECT 'X' FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = 'MELB')十二、用NOT EXISTS替代NOT IN在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历). 为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS. 例如: SELECT FROM EMP WHERE DEPT_NO NOT IN (SELECT DEPT_NO FROM DEPT WHERE DEPT_CAT='A'); 为了提高效率.改写为: (方法一: 高效) SELECT . FROM EMP A,DEPT B WHERE A.DEPT_NO = B.DEPT(+) AND B.DEPT_NO IS NULL AND B.DEPT_CAT(+) = 'A' (方法二: 最高效) SELECT . FROM EMP E WHERE NOT EXISTS (SELECT 'X' FROM DEPT D WHERE D.DEPT_NO = E.DEPT_NO AND DEPT_CAT = 'A');十三、尽可能的用UNION-ALL 替换UNION 当SQL语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并, 然后在输出最终结果前进行排序. 如果用UNION ALL替代UNION, 这样排序就不是必要了. 效率就会因此得到提高. 举例: 低效: SELECT ACCT_NUM, BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE = '31-DEC-95' UNION SELECT ACCT_NUM, BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE = '31-DEC-95' 高效: SELECT ACCT_NUM, BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE = '31-DEC-95' UNION ALL SELECT ACCT_NUM, BALANCE_AMT FROM DEBIT_TRANSACTIONS WHERE TRAN_DATE = '31-DEC-95'十四、Order by语句建议ORDER BY语句决定了Oracle如何将返回的查询结果排序。Order by语句对要排序的列没有什么特别的限制,也可以将函数加入列中(象联接或者附加等)。任何在Order by语句的非索引项或者有计算表达式都将降低查询速度。 仔细检查order by语句以找出非索引项或者表达式,它们会降低性能。解决这个问题的办法就是重写order by语句以使用索引,也可以为所使用的列建立另外一个索引,同时应绝对避免在order by子句中使用表达式。十五、避免使用NOT 在查询时经常在where子句使用一些逻辑表达式,如大于、小于、等于以及不等于等等,也可以使用and(与)、or(或)以及not(非)。NOT可用来对任何逻辑运算符号取反。下面是一个NOT子句的例子: . where not (status ='VALID') 如果要使用NOT,则应在取反的短语前面加上括号,并在短语前面加上NOT运算符。NOT运算符包含在另外一个逻辑运算符中,这就是不等于(<>)运算符。换句话说,即使不在查询where子句中显式地加入NOT词,NOT仍在运算符中,见下例: . where status <>'INVALID' 再看下面这个例子: select * from employee where salary<>3000; 对这个查询,可以改写为不使用NOT: select * from employee where salary<3000 or salary>3000; 虽然这两种查询的结果一样,但是第二种查询方案会比第一种查询方案更快些。第二种查询允许Oracle对salary列使用索引,而第一种查询则不能使用索引。十六、使用DECODE函数来减少处理时间 使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表. 例如: SELECT COUNT(*),SUM(SAL) FROMEMP WHERE DEPT_NO = 0020 AND ENAME LIKE'SMITH%' SELECT COUNT(*),SUM(SAL) FROMEMP WHERE DEPT_NO = 0030 AND ENAME LIKE'SMITH%' 可以用DECODE函数高效地得到相同结果 SELECT COUNT(DECODE(DEPT_NO,0020,'X',NULL) D0020_COUNT, COUNT(DECODE(DEPT_NO,0030,'X',NULL) D0030_COUNT, SUM(DECODE(DEPT_NO,0020,SAL,NULL) D0020_SAL, SUM(DECODE(DEPT_NO,0030,SAL,NULL) D0030_SAL FROM EMP WHERE ENAME LIKE 'SMITH%' 类似的,DECODE函数也可以运用于GROUP BY 和ORDER BY子句中.十七、删除重复记录DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID) FROM EMP X WHERE X.EMP_NO = E.EMP_NO); 十八、如果可以使用where条件,尽量不要在having中限制数据十九、尽量不要使数据排序引起排序的条件- Order by- Group by- Union,intersect,minus- Distinct二十、使用提示(Hints)对于表的访问,可以使用两种Hints:FULL 和 ROWID l FULL hint 告诉ORACLE使用全表扫描的方式访问指定表. 例如: SELECT /*+ FULL(EMP) */ * FROM EMP WHERE EMPNO = 7893; l ROWID hint 告诉ORACLE使用TABLE ACCESS BY ROWID的操作访问表. 通常, 你需要采用TABLE ACCESS BY ROWID的方式特别是当访问大表的时候, 使用这种方式, 你需要知道ROIWD的值或者使用索引。 如果一个大表没有被设定为缓存(CACHED)表而你希望它的数据在查询结束是仍然停留在SGA中,你就可以使用CACHE hint 来告诉优化器把数据保留在SGA中。 通常CACHE hint 和 FULL hint 一起使用。 例如: SELECT /*+ FULL(WORKER) CACHE(WORKER)*/ * FROM WORK; 索引hint 告诉ORACLE使用基于索引的扫描方式. 你不必说明具体的索引名称 例如: SELECT /*+ INDEX(a index_name) */ LODGING FROM LODGING aWHERE MANAGER = BILL GATES' ORACLE hints 还包括ALL_ROWS, FIRST_ROWS, RULE,USE_NL, USE_MERGE, USE_HASH 等等。可以根据具体情况具体使用。第三章oracle和sybase的SQL区别一、大小写SYBASE的SQL中数据库名、表名和列名分大小写,应遵循定义时的写法;ORACLE 并不区分。二、限制记录数量在SYBASE SQL中限制纪录的数量,需要用 EXEC SQL SET ROWCOUNT n, 用完需要执行EXEC SQL SET ROWCOUNT 0 恢复; 而 ORACLE 中只需要在 SQL中用 SELECT * FROM tbl_name where rowcount<n来限制即可。三、列的选择ORACLE执行数据查询的时候,SELECT语句必须选择针对的数据表。在Oracle数据库内有一种特殊的表DUAL。从DUAL表选择数据常被用来通过SELECT语句计算常数表达式,由于DUAL只有一行数据,所以常数只返回一次。Oracle下的DUAL查询如下所示:SELECT 'x' FROM dual在sybase中,查询则是下面这个样子:SELECT 'x'四、连接Oracle用| 符号作为连接符,而sybase的连接符是加号:+ 。Oracle查询如下所示:Select 'Name' | 'Last Name' From tableName对应的sybase查询如下所示:Select 'Name' + 'Last Name'五、字符串函数返回字符串长度函数sybase: char_length(string) 或datalength(string)oracle: length(string)LENGTH和LENsybase: SELECT LEN('SQLMAG') "Length in characters"oracle: SELECT LENGTH('SQLMAG') "Length in characters" FROM DUAL;六、日期函数取当前系统日期时间sybase: getdate() 返回datetime eg:select getdate() oracle: sysdate 返回date eg:select sysdate from dual;日期的加法sybase:select dateadd(mm,12,getdate()oracle:select add_months(sysdate,12) from dual日期的减法sybase:SELECT datediff(dd, GetDate(),dateadd(mm,12,getdate()oracle:SELECT sysdate -add_months(sysdate,12) FROM dual七、数据类型转换函数:sybase中转换函数为convert(datatype,expression,style)在oracle中不可用,应用以下转换函数:日期转换字符to_char(date)例如:select to_char(sysdate,yyyy/mm/dd hh24:mi:ss) from dual;结果: 1999/09/08 16:25:30 select to_char(sysdate,yyyymmdd) from dual;结果: 19990908数字转换字符to_char(numbers)字符转换日期to_date(string)例如:select to_date(1999/09/08 16:25:30,yyyy/mm/dd hh24:mi:ss) from dual;字符转换数字to_ number(string)八、空值替代函数:sybase中用isnull(expr1,expr2) oracle中不能用isnull(),只能用nvl(expr1,expr2)例如:sybase:select isnull(pro_table_status, '0') from pos.product;oracle:select nvl(pro_table_status, '0') from pos.product;九、sybase的where语句执行 正则符号,但是oracle9i不支持。十、数字取舍Oracle数据库内有一个TRUNC函数,该函数返回m位十进制数的n位;如果省略m则n就是0位。m的值可以为负,表示截去小数点左边m位数字。在Sybase下可以用Round或者Floor。以下是Oracle查询:SELECT TRUNC(15.79,1) "Truncate" FROM DUAL;下面是同类查询的sybase版本:SELECT ROUND(15.79, 0) rounded , ROUND(15.79, 0,1) truncatedSELECT FLOOR(ROUND(15.79, 0), FLOOR(ROUND(15.79, 0,1) )第四章 跟踪SQL执行计划一、理论(一)ORACLE优化器l Oracle的优化器有3种 基于规则 RULE 基于成本 COST 基于选择 CHOOSEl 设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数设置,也可以在会话(session)级对其进行覆盖.l 如果OPTIMZER_MODE=RULE,则激活基于规则的优化器(RBO)。基于规则的优化器按照一系列的语法规则来推测可能执行路径和比较可替换的执行路径。l 如果OPTIMZER_MODE=COST,则激活基于成本的优化器(CBO)。它使用ANALYZE语句来生成数据库对象的统计数据。这些统计数据包括表的行数、平均长度及索引中不同的关键字数等。基于这些统计数据,成本优化器可以计算出可获得的执行路径的成本。并选择具有最小的成本执行路径。在CBO模式下,需要经常运行ANALYZE 命令来确保数据的准确性。l 如果OPTIMZER_MODE=CHOOSE,实际的优化器模式将和是否运行过analyze命令有关. 如果table已经被analyze过, 优化器模式将自动成为CBO , 反之,数据库将采用RULE形式的优化器。(二)访问TABLE的方式ORACLE 采用两种访问表中记录的方式:l 全表扫描 全表扫描就是顺序地访问表中每条记录. ORACLE采用一次读入多个数据块的方式优化全表扫描。l ROWID定为访问 ORACLE采用索引实现了数据和存放数据的物理位置(ROWID)之间的联系。 通常索引提供了快速访问ROWID的方法,因此那些基于索引列的查询就可以得到性能上的提高。(三) 索引访问方式 Oracle有两种索引访问方式l 索引唯一扫描 ( INDEX UNIQUE SCAN) 如:表LOADING有两个索引 : 建立在LOADING列上的唯一性索引LOADING_PK和建立在MANAGER列上的非唯一性索引IDX_MANAGER。 SELECT * FROM LOADING WHERE LOADING = ROSE HILL;   在内部,上述SQL将被分成两步执行,首先,LOADING_PK 索引将通过索引唯一扫描的方式被访问,获得相对应的ROWID,通过ROWID访问表的方式执行下一步检索。   如果被检索返回的列包括INDEX列中,ORACLE将不执行第二步的处理(通过ROWID访问表)。 因为检索数据保存在索引中,单单访问索引就可以完全满足查询结果。        SELECT LOADING  FROM  LOADING WHERE LOADING = ROSE HILL;l 2、索引范围查询(INDEX RANGE SCAN)适用于两种情况:1、 基于一个范围的检索2、 基于非唯一性索引的检索 例1:      SELECT LOADING  FROM  LOADING WHERE LOADING LIKE M%;WHERE子句条件包括一系列值, ORACLE将通过索引范围查询的方式查询LODGING_PK 。 由于索引范围查询将返回一组值, 它的效率就要比索引唯一扫描低一些。   例2:      SELECT LOADING FROM  LOADING WHERE MANAGER = BILL GATES;这个SQL的执行分两步,IDX_MANAGER的索引范围查询(得到所有符合条件记录的ROWID) 和下一步同过ROWID访问表得到LOADING列的值。 由于IDX_MANAGER是一个非唯一性的索引,数据库不能对它执行索引唯一扫描。由于SQL返回LOADING列,而它并不存在于IDX_MANAGER索引中, 所以在索引范围查询后会执行一个通过ROWID访问表的操作。WHERE子句中, 如果索引列所对应的值的第一个字符由通配符(WILDCARD)开始, 索引将不被采用。SELECT LOADING  FROM  LOADING WHERE MANAGER LIKE HANMAN;在这种情况下,ORACLE将使用全表扫描。二、SET TRACE跟踪sql执行计划举例: SQL> list 1 SELECT * 2 FROM dept, emp 3* WHERE emp.deptno = dept.deptno SQL> set autotrace traceonly /*traceonly 可以不显示执行结果*/ SQL> / 14 rows selected. Execution Plan - 0 SELECT STATEMENT Optimizer=CHOOSE 1 0 NESTED LOOPS 2 1 TABLE ACCESS (FULL) OF 'EMP' 3 1 TABLE ACCESS (BY INDEX ROWID) OF 'DEPT' 4 3 INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE) Statistics - 0 recursive calls 2 db block gets 30 consistent gets 0 physical reads 0 redo size 2598 bytes sent via SQL*Net to client 503 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 14 rows processed 通过以上分析,可以得出实际的执行步骤是: 1. TABLE ACCESS (FULL) OF 'EMP' 2. INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE) 3. TABLE ACCESS (BY INDEX ROWID) OF 'DEPT' 4. NESTED LOOPS (JOINING 1 AND 3) 注: 目前许多第三方的工具如TOAD和ORACLE本身提供的工具如OMS的SQL Analyze都提供了极其方便的EXPLAIN PLAN工具。

    注意事项

    本文(ORACLE数据库操作手册2[1]0.docx)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开