数据库复杂查询_第1页
数据库复杂查询_第2页
数据库复杂查询_第3页
数据库复杂查询_第4页
数据库复杂查询_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、复杂查询复杂查询通常指从两张或两张以上的表进行的连接查询和相关联的子查询一Oracle中表的连接1笛卡尔积:如果From 子句指定了两张表,则这两张表就合并在一起进行查询。两张表的合并的算法叫做笛卡尔积(与矩阵相乘类似)。笛卡尔积的算法是,将表A的第一行与表B的所有行分别合并,得到与表B 的行数相等的一系列新行;然后将表A的第二行与表B的所有行分别合并,得到与表B 的行数相等的一系列新行,。依次类推,直至将表A的最后一行与表B的所有行分别合并,得到与表B 的行数相等的一系列新行。故最终结果集的列数为两个表的列数之和,其行数为两张表的行数的乘积。2实际应用中表的连接实际应用中表的连接需要加上限制

2、条件,对结果集进行某种限制。其中等值连接使用最多。连接通常用于不同表之间的连接,但是也可以用于同一表之间的连接。2.1.Oracle用于不同表之间的等值连接语法:Select dept.*,mens.* From dept , mens Where dept. 部门号=mens.所在部门And 部门号=012.2. Oracle用于同一张表之间的等值连接语法除了连接两个或多个不同的表,连接操作也可用于连接单个的表(即连接自身),此时必须使用别名来区分同一个表出现的情况。例如:select t.姓名,t1.性别,t2.所在部门 from men t1,men t2 where t1.所在部门=t

3、2.所在部门又例如:学校开运动会,要求各系派出男女同学组成混合选手,写一查询语句,找出所有可能的组合2.3.Oracle中的外连接一个外连接返回两种记录:A.满足连接条件的那些记录B.来自其中一个表的纪录,这些记录因不满足条件而不能与另一个表的记录连接Oracle中的外连接包含两种类型:左外连接和右外连接.查询所有女生所在的系,同时返回那些没有女生的系的信息.Select 姓名,性别, dept.系名 From student,deptWhere性别=女 and student.系号(+)=dept. 系号注意: 连接符号 (+) 放在连接条件等号的哪一边,其含义是不同的.例如,上述语句改为S

4、elect 姓名,性别, dept.系名 From student,deptWhere性别=女 and student.系号=(+)dept. 系号则输出结果是女生所在系的信息,以及目前暂时没有系的女生信息.例1:获取与至少一个其它部门拥有相同所在地的所有部门的全部细节。select t1.* from department t1,department t2where t1.location=t2.location and t1.dept_no!=t2.dept_no例2:显示居住在同一城市的所有员工-select t1.* from employee t1,employee t2 where

5、 t1.domicil=t2.domicil and t1.emp_no!=t2.emp_no -select domicil,count(*) from employee t1 group by domicil having count(*)>1select t1.* from employee t1 where t1.domicil in (select t2.domicil from employee t2 where t1.emp_no!=t2.emp_no )select t1.* from employee t1 where exists (select t2.domicil

6、 from employee t2 where t1.domicil=t2.domicil and t1.emp_no!=t2.emp_no )查询物理课不及格的学生名单,输出其学号,姓名及成绩(三表连结查询)select student.xh,student.xm, t2.成绩From student,课程,成绩 t2Where课程.km= 物理 and t2. 成绩<60 and 课程.kh=成绩.khAnd 成绩.xh=student.xh2.内连接是指满足连接条件的连接操作,即在内连接的结果集中都是满足条件的记录。语法:Select column_ListFrom table_N

7、ame1 inner join table_Name2On join_Condition例如:Select vince,pi.shortName,ci.city,ci.tele,ci.postFrom provinceInfo piInner join cityInfo ciOn vinceID=vinceID该语句与下列语句等价,但上面的语法更正式。Select vince,pi.shortName,ci.city,ci.tele,ci.postFrom provinceInfo pi, cityInfo ciWhere vince

8、ID=vinceID3.左外连接是指在结果集中,包含了左表不满足条件的记录,即结果集中包含左表的全部记录和右表与左表匹配的记录。语法:Select column_ListFrom table_Name1 left outer join table_Name2On join_Condition例如:Select vince,pi.shortName,ci.city,ci.tele,ci.postFrom provinceInfo piLeft outer join cityInfo ciOn vinceID=vinceID4.右外连接是指在结果集中

9、,包含了右表不满足条件的记录,即结果集中包含右表的全部记录和左表与右表匹配的记录。语法:Select column_ListFrom table_Name1 right outer join table_Name2On join_Condition例如:Select vince,pi.shortName,ci.city,ci.tele,ci.postFrom provinceInfo piright outer join cityInfo ciOn vinceID=vinceID5.全外连接是指在结果集中,包含了左表和右表中都不满足条件的记录,即结果集中包含

10、左表的全部记录和右表的全部记录。语法:Select column_ListFrom table_Name1 full outer join table_Name2On join_Condition例如:Select vince,pi.shortName,ci.city,ci.tele,ci.postFrom provinceInfo pifull outer join cityInfo ciOn vinceID=vinceID6.自连接是指一个表与自身相连接。为了能够进行自连接,必须为表取一个别名。在实际应用中,自连接常常使用内连接的方式。而且连接条件往往为

11、不等连接。语法:Select column_ListFrom table_Name inner join table_NameOn join_Condition例如:Select vince,pi.shortName,ci.city,ci.tele,ci.postFrom provinceInfo piinner join provinceInfo ciOn vinceID>vinceID例:有如下学生表和数据:Create table Students(Student_ID number(5), -学生IDmonitor_ID number(5),

12、-班长IDname varchar2(20), -姓名sex varchar2(2), -性别birthday date, -生日specialty varchar2(40) -专业)insert into Students values(5,1,'白皙','女',to_date('1989-07-09','yyyy-mm-dd'),'计算机');insert into Students values(1,null,'毛泽东','男',to_date('1979-05-19&

13、#39;,'yyyy-mm-dd'),'项目管理');insert into Students values(6,1,'刘洋','男',to_date('1989-07-09','yyyy-mm-dd'),'计算机');insert into Students values(7,1,'无疑','女',to_date('1989-07-09','yyyy-mm-dd'),'数学');insert into

14、Students values(8,1,'克林顿','男',to_date('1989-07-09','yyyy-mm-dd'),'物理');insert into Students values(2,null,'温家宝','男',to_date('1980-3-21','yyyy-mm-dd'),'地质探测');insert into Students values(9,2,'大地之子','男',to_

15、date('1989-2-2','yyyy-mm-dd'),'地质探测');要求显示学生与班长的对应信息分析:由于班长也是学生,所以学生与班长的信息在同一表中,但不在同一行记录中,所以需要进行自连接查询实现方案如下:方案1:班长信息也显示select s1.student_id, 学生名,s1.monitor_iD, 班长名 from students s1 left join students s2 on s1.monitor_id=s2.student_id方案2:不显示班长信息select s1.student_

16、id, 学生名,s1.monitor_iD, 班长名 from students s1 inner join students s2 on s1.monitor_id=s2.student_id例1:在表students中查询姓名为'刘洋'的班长信息方案1:-同一关系的两个元组select s2.* from students s1, students s2 where ='刘洋' and s1.monitor_id=s2.student_Id方案2:-班长也是学生(子查询)select * from students

17、s2where s2.student_ID=( select monitor_ID from students s1 where ='刘洋' )方案3-自连接 select ,s2.* from students s1 inner join students s2 on s1.monitor_id=s2.student_Id where ='刘洋'例2:查询班长姓名是'毛泽东'的所有学生信息的树查询select level,student_ID,name,sex,birthday,ltrim(sys_co

18、nnect_by_Path(name,'->'),'->') pathfrom students start with name='毛泽东' -student_ID=1connect by prior student_ID=monitor_ID 7.交叉连接是指没有连接条件的连接,其结果为笛卡尔乘积。语法:Select column_ListFrom table_Name1 cross join table_Name2二、Oracle中的子查询当一个select语句嵌入到另外一个select,update或delete等sql语句中时

19、,被全套的select语句就是子查询。使用子查询应当遵守的原则:子查询必须使用括号括起来,否则,无法判断子查询的开始和结束。子查询中不能包含order by子句.子查询允许嵌套多层,但最多不超过255曾在自查询中可以使用两种比较运算符:单行运算符和多行运算符。子查询分为五种类型,即单行子查询,多行子查询,多列子查询,关联子查询和嵌套子查询。单行子查询:子查询语句值返回单行单列的结果,即返回一个常量值。多行子查询:子查询语句值返回多行单列的结果,即返回一系列值。多列子查询:子查询语句返回多列的结果。关联子查询:子查询语句引用外查询中的一个列或多个列。也就是说,外部查询和内部查询是相互关联的。嵌套

20、子查询:可以在子查询中继续嵌套子查询,但其嵌套层数不能超过255个。1. 单行子查询在单行子查询中可以使用的比较运算符如下:=(等于) >(大于) >=(大于等于) <(小于) <=(小于等于) <>或!= (不等于)例1:查询全年级成绩最差和做好的学生信息select * from studentScorewhere score=(select min(t1.score) from studentScore t1) or score=(select max(t2.score) from studentScore t2)2. 多行子查询在多行单列子查询中可以

21、使用的比较运算符如下:运算符描述In等于列表中的任何一个值any与子查询返回的每一个值进行比较all与子查询返回的所有值进行比较<any表示小于最大值=any与in 运算符等价>any表示大于最小值<all表示小于最小值>all表示大于最大值例1:查询简称为辽的省的所有城市信息select * from cityInfo where provinceID in(select xh from provinceInfo where shortName='辽')例2:查询每一个班中成绩最好的学生信息select * from studentScorewhere

22、 score in( select max(t2.score) from studentScore t2 group by class )例2:查询成绩小于各班中所有最好成绩的学生信息select * from studentScorewhere score <all( select max(t2.score) from studentScore t2 group by class )3. 多列子查询在一般的查询中,如果需要比较两个或以上列的数据,那么必须在where子句中使用逻辑运算符组合一个复合条件。但是,通过使用多列自查询技术,可以把一个复合where条件写成单个where子句。多

23、列子查询可以分为两种类型:成对比较的多列子查询和非成对比较的多列子查询成对比较的多列子查询表示多个列同时相等,才可以称为满足匹配的条件。如果在某些情况下,即使多列条件不成对相等,也可以称为满足匹配的条件,这时称为非成对比较。例1:查询成绩等于该班最好成绩的学生信息(成对比较多列子查询)select * from studentScorewhere (class,score) in ( select class,max(t2.score) from studentScore t2 group by class )例2:查询班级为任意一个班,或者成绩等于该班最差成绩的学生信息(非成对比较多列子查询

24、)select * from studentScorewhere class in (select t2.class from studentScore t2 group by class) or score in ( select min(t1.score) from studentScore t1 group by class)例3:多列子查询作为from子句查询各班成绩最好的学生信息select * from ( select class,score,dense_rank()over(partition by class order by score desc) mc from stud

25、entScore t2)twhere t.mc=14Oracle中的相关联子查询对于任何一个值的子查询中的内部查询取决于外部查询,称为关联子查询。例1:获取为项目p3工作的所有职员的姓:Select emp_lName From employeeWhere P3 IN(Select project_no From works_on where works_on.emp_no=employee.emp_no )例2:获取位于同一城市的所有部门的详细信息Select t1.* From department t1Where t1.Location IN(Select t2.Location Fro

26、m department t2Where t1.dept_no<> t2.dept_no)例3:查找分数小于班级平均分数的学生select * from Studentscore m where score<( select avg(score) from Studentscore c where c.class=m.class )例4:用表provinceInfo的字段provinceID替换表cityInfo的provinceID字段,条件是:表provinceInfo的字段province的值与表cityInfo的province字段的值相等。update cityIn

27、fo t1 set vinceID=(select provinceID from provinceInfo t2 where vince=vince )5. 嵌套子查询例:检索与成绩为100 的学生所在班级的所有学生信息select * from studentscore where class=( select class from studentScore where score=100 )思考:1 设有表Province(省名,ID). NewPost(Province,city,tele,post,ID) 其中ID字段为空,用Province表的I

28、d更新NewPost表的ID(两表的省名相同)2 查询年龄在50岁以上,月收入低于本部门平均工资的人员,输出他们的姓名和工资例3:获取为项目P3工作的所有职员的信息select * from employee where emp_No in(select emp_no from works_on where project_no='P2')select * from employee where 'P3' in(select project_no from works_on where works_on.emp_no=employee.emp_no)(内部查询的

29、值依赖于外部查询的值)例4:获取位于同一城市的所有部门的信息。select t1.* from department t1 where t1.location in(select t2.location from department t2 where t2.dept_no<>t1.dept_no)三Exists函数与子查询Exists 函数语法:Exists(<子查询>) 当子查询块中包含至少一行,则返回true可以用Exists()函数来表示”交”,用Not Exists()函数来表示”差”思考:查询从未被学生选修的课程,输出课程号和课程名例1:获取为项目P1工作的

30、所有职员的信息select distinct t1.* from employee t1 where exists(select * from works_on t2 where t1.emp_no=t2.emp_no and ject_no='P1')例2:获得工作地点不在成都的部门select distinct t1.* from department t1 where not exists(select * from department t2 where t1.dept_no=t2.dept_no and t2.location='成都')例

31、3:获得没有参加项目的所有职员select t1.* from employee t1 where not exists(select * from works_on t2 where t1.emp_no=t2.emp_no )例4:获得编号最小的那位职员从事的工作select t2.* from works_on t2 where t2.emp_no in (select min(t1.emp_no) from employee t1 )select t2.* from works_on t2 where not exists (select * from employee t1 where

32、 t2.emp_no>t1.emp_no)子查询只能显示外部表中的信息,而连接查询即可以显示外部表中的信息也可以显示内部表中的信息。用连接查询便于阅读理解,也可以帮助Sqlserver找到一种更有效的策略来获取适当的数据,然而,使用子查询可以是某些问题的解决变得简单练习:1 查找出生于1970-12-31日之前,工资低于本部门平均工资的职员信息。2 查找各部门年龄最小的职员信息select emp_no,emp_name,emp_birthday,emp_salary,dept_no from employee twhere emp_birthday<'1970-12-31

33、' and emp_salary<(select avg(emp_salary) from employee where dept_no=t.dept_no)select emp_no,emp_name,emp_birthday,emp_salary,dept_no from employee where dept_no+str(datediff(yy,emp_birthday,getdate() in(select dept_no+str(min(datediff(yy,emp_birthday,getdate() from employee t group by dept_n

34、o)select * from employee where dept_no in(select dept_no from employee t group by dept_no having min(datediff(yy,t.emp_birthday,getdate()<30 )为年龄在50以上,工资低于本部门平均工资的职工增加工资100元update men t1 set 月收入=月收入+100 where age>50 and 月收入<(Select avg(月收入) from men where 所在部门=t1.所在部门)从课程表中删除至今没有人选修的课程delet

35、e From 课程 where 课号 not in(select 课号 from 成绩 )集合操作符Oracle提供了用于连接多个查询的集合操作符:Union 或union all 并运算Intersection 交运算minus差运算1Union 集合并运算:对两个集合进行并运算操作得到一个新的集合,这个新的集合中的所有元素或者出现在其中任意一个集合中,或者在两个集合中都出现。格式:Select_1 Union All Select_2 Union AllSelect_3Union All说明:1. Select_1, Select_2,是用于创建并运算的Select语句2. 如果使用了Al

36、l 关键字,则包含的重复(行) 也显示。否则不显示重复行(默认)。3. 两个被连接的查询之间必须是相容的,即 被连接的查询具有相同数目的列,且相应列的数据类型是兼容的,例如,int 和 SmallInty4只有当最后一句Select 语句与Order by子句一起使用时,才能对”并”操作的结果进行排序。4. 结果集的列名与第一个select语句相同。例:1.准备数据:Create table部门1 ASSelect * from部门 复制表”部门”到 “部门1”Create table部门2 ASSelect * from部门 复制表”部门”到 “部门1”2.将表和表进行union 和uino

37、n all运算Select * from部门1 Union Select * from部门2 /没有重复行Select * from部门1 Union ALL Select * from部门2 /包含重复行2Intersect 交运算获得同时属于两个查询的结果集的集合。Select 语句1Intersect Select 语句2IntersectSelect 语句3例:查询同时选修了高等数学和普通物理这两门课的学生,并输出他们的学号。(Select xh From 成绩 where 课号= 高等数学 )/高等数学替换为课号Intersect(Select xh From 成绩 where 课号

38、= 普通物理 )/高等数学替换为课号3minus 差运算获得属于第一个查询,但不属于第二个查询的结果集的集合。(Select 语句1)minus (Select 语句2)minus(Select 语句3)例1:查询选修了C01课程,但没哟选修C02课程的学生,输出他们的学号.(Select xh From 成绩 where 课号=C01 ) minus(Select xh From 成绩 where 课号= C02 )例2:复杂子查询:-查找没有学生的系方法1 (用集合minus运算):select xh from deptminusselect xh from student方法2 (用集合

39、in运算):-select xh from dept where xh not in(select xh from student)方法3 (用集合exists 函数)select xh from dept where not exists(select xh from student where student.xh=dept.xh)此例说明,同一问题可以使用多种方法实现层次查询-树查询客观世界中的很多信息都是按树型结构组织的。例如,一个企业中各部门之间的关系,人员上下级之间的关系等。一、树查询的专门子句:1、Start with 子句语法:Start with <condition&

40、gt;子句指定树查询的根节点,满足该子句条件的行将被作为根节点输出,该子句可以包含一个子查询。例如:ename=小平2、Connect by 子句语法:Connect by <condition>子句用于指定父子关系。在条件中使用关键字PRIOR引用父记录的值,有两种形式:l PRIOR expr <关系运算符> exprl expr <关系运算符> PRIOR expr例如:PRIOR eno=mgr表示,用父节点的eno值去查找其他记录中mgr等于该值的行,找到的这些行就是当前父节点的子节点。另外,where 子句可以限定查询返回的行。二、Oracle按

41、照下列步骤执行树查询:1、 根据Start with 子句中的条件确定根节点,根节点可以不止一个。2、 查询每一个根节点的子节点,每一个子节点必须满足Connect by子句规定的父子条件3、 继续查询下一层节点,即查找第2步返回的那些节点的子节点。以此类推。一层一层地往下找。在每层查找的过程中,Oracle总是按照Connect by子句的条件,查找相对于当前父节点的子节点。4、 如果查找包含一个where子句,Oracle将筛选掉树结构中所有不满足where子句条件的那些记录。如果一个节点不满足where子句的条件,那么它的子节点不受影响。5、 树查询的结果遵循先父后子的顺序依次输出。简单

42、子查询一概念:1查询块-在SQL语言中,一个Select From Where 语句称为一个查询块2子查询-将一个查询块嵌套在另一个查询块的Where 子句或Having子句 的条件中的查询称为子查询,亦称嵌套查询。当然,子查询也可以嵌套在insert,update,delete语句中。子查询分分为两类:简单的,相关联的。在简单子查询中,内部查询都只被计算一次;而相关联的查询依赖于外部查询的一个变量,所以,每当系统从外部查询取回一个新行时,相关联查询中的内部查询都要被计算一次3子查询求解方法-由里向外处理,即每个子查询在其上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件用途:1。

43、跨数据表查询;2。挑选出子段重复的数据二带有In谓词的子查询Where In(查询块)Select * from 人员 where 所在部门 in(Select 部门号 from 部门 where部门号=财务部)/获得部门号<人事部的所有人员的姓名,月收入等信息三带有比较运算符的子查询带有Any, All 谓词的子查询>ANY 大于子查询结果中的任意值<ANY 小于子查询结果中的任意值>=ANY 大于等于子查询结果中的任意值<=ANY 小于等于子查询结果中的任意值=ANY 等于子查询结果中的任意值!=ANY 或 <> ANY 不等于子查询结果中的任意值

44、>ALL 大于子查询结果中的所有值<ALL 小于子查询结果中的所有值>=ALL 大于等于子查询结果中的所有值<=ANY 小于等于子查询结果中的所有值=ALL 等于子查询结果中的所有值(无意一,不用)!=ALL 或 <> ALL 不等于子查询结果中的任何一个值四说明:子查询可以使用在Create Table 语句中,Insert Into 语句中,Update语句中。Delete 语句中思考:1将表NewPost中长途区号不为空或空串的记录备份到新表Newpost_back中例1.查找重复记录Select 代码,部门,领导,活动经费 from 部门 Where

45、 代码 in(Select 代码 From 部门 Group By 代码 Having count(代码) >1) Order By 代码例2Select * From 人员表 Where 部门号 In(Select部门号 From人员表Where 姓名=王因)例3Select 姓名,性别,基本工资 From人员表 Where Rkbh In(Select Rkbh From 照片表 Where 照片 Is Null)例4 查找其他部门比信息部 任意人员基本工资低的人员姓名,性别,出生年月,基本工资Select姓名,性别,出生年月,基本工资 From 人员表 Where 基本工资<

46、ANY (Select基本工资 From人员表 Where 部门号In (Select 部门号 From 部门表 Where 部门名称=信息部)insert into 部门 (部门,领导,代码) Values("公关部","王大海","17")update 人员情况表 Set 基本工资=1200 where 所在部门='01'Delete from 部门 Where 代码='17'Insert Into 人员情况表 (姓名,所在部门,基本工资) Select 领导,代码,活动经费 From 部门 Whe

47、re 代码='00'Select 身份证号,姓名,性别,出生日期,文化程度,籍贯,所在部门,基本工资,生活补贴,房租费 Into 人员表 From 人员情况表 Where 所在部门 In('00','01')/显示所有部门的名称,编号,领导及其本部门人员的月收入select d.*, (select avg(ysr) from mens where mens.所在部门=d.部门号) as 平均月收入 from dept d /蓝色部分为子查询/以下范例涉及到四张表:department,employee,project,works_on/获取在”

48、研发部”工作的所有人员的姓名1用子查询select * from employee where dept_no in(select dept_no from department where dept_name='研发部')2用等值连接查询select t1.* from employee t1,department t2 where t1.dept_no=t2.dept_no and t2.dept_name='研发部'/获取比肖遥 要小的项目编号select distinct project_no from works_on where emp_No<

49、(select emp_no from employee where emp_name='肖遥')练习:1.获得1997年参加工作的所有职员。2.获得为项目P2工作,且编号<1000的所有职员3.获取部门分布的城市4.找出最大的职员编号及最小的职员编号5.找出从事人数在3个以上的项目6.找出担任系统分析员或项目经理的所有人的信息7.找出mens表中所有人来自的部门8.找出具有最小月收人的员工9.找出没有任何员工的部门10.显示所有员工的信息(包括所在的部门名称)11.找出月收入低于全体员工平均月收的所有职员12.找出月收入高于全体员工平均月收的所有职员13.找出具有最高和

50、最低月收入的所有职员/Oracle的SQL语句执行效率问题查找与解决方法文章分类:数据库 一、识别占用资源较多的语句的方法(4种方法)1.测试组和最终用户反馈的与反应缓慢有关的问题。2.利用V_$SQLAREA视图提供了执行的细节。(执行、读取磁盘和读取缓冲区的次数)·  数据列EXECUTIONS:执行次数DISK_READS:读盘次数COMMAND_TYPE:命令类型(3:select,2:insert;6:update;7delete;47:pl/sql程序单元)OPTIMIZER_MODE:优化方式SQL_TEXT:Sql语句SHARABLE_MEM:占用share

51、d pool的内存多少BUFFER_GETS:读取缓冲区的次数·  用途1、帮忙找出性能较差的SQL语句2、帮忙找出最高频率的SQL3、帮忙分析是否需要索引或改善联接3.监控当前Oracle的session,如出现时钟的标志,表示此进程中的sql运行时间较长。4.Trace工具:a)查看数据库服务的初始参数:timed_statistics、user_dump_dest和max_dump_file_sizeb)Step 1: alter session set sql_trace=truec)Step 2: run sql;d)Step 3: alter session s

52、et sql_trace=falsee)Step 4:使用 “TKPROF”转换跟踪文件f)Parse,解析数量大通常表明需要增加数据库服务器的共享池大小,query或current提取数量大表明如果没有索引,语句可能会运行得更有效,disk提取数量表明索引有可能改进性能,library cache中多于一次的错过表明需要一个更大的共享池大小 二、如何管理语句处理和选项 · 基于成本(Cost Based) 和基于规则(Rule Based) 两种优化器, 简称为CBO 和RBO· Optimizer Mode参数值:Choose:如果存在访问过的任何表的统计数据

53、 ,则使用基于成本的Optimizer,目标是获得最优的通过量。如果一些表没有统计数据,则使用估计值。如果没有可用的统计数据,则将使用基于规则的OptimizerAll_rows:总是使用基于成本的Optimizer,目标是获得最优的通过量First_rows_n:总是使用基于成本的Optimizer,目标是对返回前N行(“n”可以是1,10,100或者1000)获得最优的响应时间First_rows:用于向后兼容。使用成本与试探性方法的结合,以便快速传递前几行RULE:总是使用基于规则的Optimizer 三、使用数据库特性来获得有助于查看性能的处理统计信息(解释计划和AUTOTR

54、ACE)No1: Explain PlanA)使用Explain工具需要创建Explain_plan表,这必须先进入相关应用表、视图和索引的所有者的帐户内. (D:oracleora92 dbmsadminutlxplan)B)表结构:STATEMENT_ID:为一条指定的SQL语句确定特定的执行计划名称。如果在EXPLAN PLAN语句中没有使用SET STATEMENT_ID,那么此值会被设为NULL。OPERATION:在计划的某一步骤执行的操作名称,例如:Filters,Index,Table,Marge Joins and Table等。OPTION:对OPERATION操作的补充,

55、例如:对一个表的操作,OPERATION可能是TABLE ACCESS,但OPTION可能为by ROWID或FULL。Object_Owner:拥有此database Object的Schema名或Oracle帐户名。Object_name:Database Object名Object_type:类型,例如:表、视图、索引等等ID:指明某一步骤在执行计划中的位置。PARENT_ID:指明从某一操作中取得信息的前一个操作。通过对与ID和PARENT_ID使用Connect By操作,我们可以查询整个执行计划树。C)EXPLAIN搜索路径解释· 全表扫描(Full Table Scans)(无可用索引,大量数据,小表 ,全表扫描hints,HWM(High Water Mark), Rowid扫描)· 索引扫描索引唯一扫描(Index Unique Scans)索引范围扫描(Index Range Scans)索引降序范围扫描(Index Range Scans Descending)索引跳跃扫描(Index Sk

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论