數據庫復雜查詢_第1頁
數據庫復雜查詢_第2頁
數據庫復雜查詢_第3頁
數據庫復雜查詢_第4頁
數據庫復雜查詢_第5頁
免費預覽已結束,剩余25頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、則輸出結果是女生所在系的信息,以及目前暫時沒有系的女生信息.復雜查詢復雜查詢通常指從兩張或兩張以上的表進行的連接查詢和相關聯的子查詢Oracle中表的連接1. 笛卡爾積:如果From子句指定了兩張表,則這兩張表就合并在一起進行查詢。兩張表的合并的算法叫做笛卡爾積(與矩陣相乘類似)。笛卡爾積的算法是,將表A的第一行與表B的所有行分別合并,得到與表B的行數相等的一系列新行;然后將表A的第二行與表B的所有行分別合并,得到與表 B的行數相等的一系列新行,OOOOOO依次類推,直至將表A的最后一行與表B的所有行分別合并,得到與表B的行數相等的一系列新行。故最終結果集的列數為兩個表的列數之和,其行數為兩張

2、表的行數的乘積。2. 實際應用中表的連接等值連接使用實際應用中表的連接需要加上限制條件,對結果集進行某種限制。其中 最多。連接通常用于不同表之間的連接,但是也可以用于同一表之間的連接。2.1.Oracle用于不同表之間的等值連接 語法:Select dep t.*,me ns.* From dept , mensWhere dept.部門號=me ns.所在部門And 部門號='01'2.2. Oracle用于同一張表之間的等值連接 語法(即連接自身),除了連接兩個或多個不同的表,連接操作也可用于連接單個的表此時必須使用別名來區分同一個表出現的情況。例如:select t.姓名

3、,t1.性別,t2.所在部門from men t1,men t2where t1.所在部門=t2.所在部門又例如:學校開運動會,要求各系派出男女同學組成混合選手,寫一查詢語句,找出 所有可能的組合2.3.Oracle中的外連接一個外連接返回兩種記錄:A. 滿足連接條件的那些記錄B. 來自其中一個表的紀錄,這些記錄因不滿足條件而不能與另一個表的記錄連接 Oracle中的外連接包含兩種類型:左外連接和右外連接.查詢所有女生所在的系,同時返回那些 沒有女生的系 的信息.Select 姓名,性別,dept.系名 From student,dept系號,其含義是不同的.例如,Where 性別='

4、女and student系號什)=dept.注意:連接符號(+)放在連接條件等號的哪一邊 上述語句改為Select 姓名,性別,dept.系名 From student,dept系號Where 性別='女and student系號=(+)dept.例1:獲取與至少一個其它部門擁有相同所在地的所有部門的全部細節。select t1.* from dep artme nt t1,de partme nt t2where tl.lo cati on=t2.lo cati on and t1.de pt_no!=t2.de pt_no例2:顯示居住在同一城市的所有員工-select t1.*

5、from empio yee t1,e mpio yee t2where t1.domicil=t2.domiciland t1.emp_ no!=t2.emp_ no-select domicil,co un t(*) from empio yee t1 group by domicil havi ng coun t(*)>1 select t1.* from empio yee t1 where tl.domicil in(select t2.domicil from empio yee t2 where t1.emp_ no!=t2.emp_ no )select t1.* fro

6、m empio yee t1 where exists(select t2.domicil from empio yee t2 where t1.domicil=t2.domiciland t1.emp_ no!=t2.e mp_no )查詢物理課不及格的學生名單,輸出其學號,姓名及成績(三表連結查詢)select stude nt.xh,stude nt.xm, t2.成績From student,課程咸績 t2Where課程.km='物理 and t2.成績60 and課程.kh=成績.khAnd 成績.xh=student.xh2.內連接是指滿足連接條件的連接操作,即在內連接的結

7、果集中都是滿足條件的記錄。語法:Select column_ListFrom table_Name1 inner join table_Name2On join_Con diti on例如:Select pi. province® i.shortName,ci.city,ci.tele,ci. post From provinceinfo piInner join city Info ciOn p i. provin ceID=ci. provin celD該語句與下列語句等價,但上面的語法更正式。Select pi. province® i.shortName,ci.ci

8、ty,ci.tele,ci. post From provinceinfo pi, city Info ciWhere p i. provin ceID=ci. provincelD3. 左外連接是指在結果集中,包含了左表不滿足條件的記錄,即結果集中包含左表的全部記錄和右 表與左表匹配的記錄。語法:Select column_ListFrom table_Name1 left outer join table_Name2On join_Con diti on例如:Select pi. province® i.shortName,ci.city,ci.tele,ci. post Fro

9、m provinceinfo piLeft outer join cityl nfo ciOn p i. provin ceID=ci. provin celD4. 右外連接是指在結果集中,包含了右表不滿足條件的記錄,即結果集中包含右表的全部記錄和左 表與右表匹配的記錄。語法:Select column_ListFrom table_Name1 right outer join table_Name2On join_Con diti on例如:Select pi. province® i.shortName,ci.city,ci.tele,ci. post From province

10、info piright outer join city Info ciOn p i. provin ceID=ci. provin celD5. 全外連接是指在結果集中,包含了左表和右表中都不滿足條件的記錄,即結果集中包含左表的全部記錄和右表的全部記錄。語法:Select column_ListFrom table_Name1 full outer join table_Name2On join_Con diti on例如:Select pi. province® i.shortName,ci.city,ci.tele,ci. post From provinceinfo pifu

11、ll outer join cityl nfo ciOn p i. provin ceID=ci. provin celD6.自連接是指一個表與自身相連接。 為了能夠進行自連接,必須為表取一個別名。在實際應用中, 自連接常常使用內連接的方式。而且連接條件往往為不等連接。語法:Select column_ListFrom table_Name inner join table_NameOn join_Con diti on例如:Select pi. province® i.shortName,ci.city,ci.tele,ci. post From provinceinfo piin

12、ner join provinceinfo ciOn p i. provin ceID>ci. provin celD例:有如下學生表和數據:Create table Stude nts(Student_ID number(5),-學生 ID monitor_ID number(5),-班長 IDn ame varchar2(20),-姓名sex varchar2(2),-性別 birthday date,-生日 specialty varchar2(40)-專業)insert into Students values(5,1,'白皙','女',to_da

13、te('1989-07-09','yyyy-mm-dd'),'計算機');insert into Students values(1,null,'毛澤東','男',to_date('1979-05-19','yyyy-mm-dd'),'項目管理');insert into Students values(6,1,'劉洋','男',to_date('1989-07-09','yyyy-mm-dd'),

14、9;計算機');insert into Students values(7,1,'無疑','女',to_date('1989-07-09','yyyy-mm-dd'),'數學');insert into Students values(8,1,'克林頓','男',to_date('1989-07-09','yyyy-mm-dd'),'物理');insert into Students values(2,null,'溫家寶

15、','男',to_date('1980-3-21','yyyy-mm-dd'),'地質探測'); insert into Students values(9,2,'大地之子','男',to_date('1989-2-2','yyyy-mm-dd'),'地質探測'); 要求顯示學生與班長的對應信息但不在同一行記錄中,所以分析:由于班長也是學生,所以學生與班長的信息在同一表中, 需要進行自連接查詢 實現方案如下:方案1:班長信息也顯示班長名sele

16、ct s1.student_id, 學生名,s1.monitor_iD,from stude nts s1 left join stude nts s2on s1.m on itor_id=s2.stude nt_id方案2:不顯示班長信息班長名select s1.student_id, 學生名,s1.monitor_iD, from stude nts s1 inner join stude nts s2on s1.m on itor_id=s2.stude nt_id例1在表students中查詢姓名為 劉洋'的班長信息方案1

17、:-同一關系的兩個元組select s2.* from stude nts s1, stude nts s2where ='劉洋'and s1.monitor_id=s2.student_ld 方案2:-班長也是學生(子查詢)select * from stude nts s2where s2.stude nt_ID=(select mon itor_ID from stude nts s1where ='劉洋')方案3-自連接select s1. name,s2.* from stude nts s1 inner join stud

18、e nts s2 on s1.m on itor_id=s2.stude nt_ldwhere s1. name='劉洋'例2:查詢班長姓名是'毛澤東的所有學生信息的樹查詢select level,stude nt_ID ,n ame,sex,birthday,ltrim(sys_c onn ect_by_ Path( name,'->'),'->') p ath from stude ntsstart with name='毛澤東-student_ID=1 connect by p rior stude nt_ID=

19、mo ni tor_ID7.交叉連接是指沒有連接條件的連接,其結果為笛卡爾乘積。語法:Select column_ListFrom table_Name1 cross join table_Name2Oracle中的子查詢當一個select語句嵌入到另外一個 select,update或delete等sql語句中時,被全套的select 語句就是子查詢。使用子查詢應當遵守的原則:子查詢必須使用括號括起來,否則,無法判斷子查詢的開始和結束。 子查詢中不能包含 order by子句.子查詢允許嵌套多層,但最多不超過255曾在自查詢中可以使用兩種比較運算符:單行運算符和多行運算符。子查詢分為五種類型

20、,即單行子查詢,多行子查詢,多列子查詢, 查詢。單行子查詢:子查詢語句值返回單行單列的結果,即返回一個常量值。多行子查詢:子查詢語句值返回多行單列的結果,即返回一系列值。多列子查詢:子查詢語句返回多列的結果。關聯子查詢:子查詢語句引用外查詢中的一個列或多個列。查詢是相互關聯的。嵌套子查詢:可以在子查詢中繼續嵌套子查詢,但其嵌套層數不能超過1. 單行子查詢在單行子查詢中可以使用的比較運算符如下:=(等于)(大于)=(大于等于)(小于)例1 :查詢全年級成績最差和做好的學生信息select * fromwhere score=(or score=(2. 多行子查詢在多行單列子查詢中可以使用的比較運

21、算符如下:stude ntScoreselect min (tl.score)select max (t2.score)關聯子查詢和嵌套子也就是說,外部查詢和內部255 個。=(小于等于)或!=(不等于)from studentScore t1) from stude ntScore t2)運算符描述In等于列表中的任何一個值any與子查詢返回的每一個值進行比較all與子查詢返回的所有值進行比較例1 :查詢簡稱為遼'勺省的所有城市信息select * from city Info where provincelD in (select xh from provinceinfowhere

22、 shortName= '遼')例2:查詢每一個班中成績最好的學生信息select * from studentScorewhere scorein (selectmax(t2.score)from stude ntScore t2groupby class<any表示小于最大值=any與in運算符等價>any表示大于最小值<all表示小于最小值>all表示大于最大值例2:查詢成績小于各班中所有最好成績的學生信息select * from studentScorewhere score < all (select max(t2.score)from

23、 stude ntScore t2groupby class3.多列子查詢where子句中使用邏那么必須在在一般的查詢中,如果需要比較兩個或以上列的數據, 輯運算符組合一個復合條件。但是,通過使用多列自查詢技術,可以把一個復合 where條件寫成單個where子句。多列子查詢可以分為兩種類型:成對比較的多列子查詢和非成對比較的多列子查詢 成對比較的多列子查詢表示多個列同時相等,才可以稱為滿足匹配的條件。如果在某些情況下,即使多列條件不成對相等,也可以稱為滿足匹配的條件,這時稱為非成對比較。例1 :查詢成績等于該班最好成績的學生信息selectwhere* from studentScore(c

24、lass ,score) in (select class , max (t2.score)(成對比較多列子查詢from stude ntScore t2group by class例2 :查詢)select查詢班級為任意一個班,* from studentScorewhereclass in ( select t2. or score in ( select 多列子查詢作為from或者成績等于該班最差成績的學生信息class from studentScore t2groupmin (tl.score) from studentScore t1子句(非成對比較多列子by class )gro

25、up by class )查詢各班成績最好的學生信息select * from (select class ,score,den se_ra nk()over(p artiti onfrom stude ntScore t2by class order by score desc) mc)twhere t.mc= 14. Oracle中的相關聯子查詢對于任何一個值的子查詢中的內部查詢取決于外部查詢,稱為關聯子查詢。 例1 :獲取為項目p3工作的所有職員的姓:Select emp_l Name From empio yeeWhere P3'IN(Select p roject_ no F

26、rom works_ on where works_ on .e mp_no=emp loyee.emp_ no )例2:獲取位于同一城市的所有部門的詳細信息Select t1.* From dep artme ntt1Where "Location IN(Select t2.Locati on From dep artme nt t2 Where t1.de pt_no<> t2.de pt_no)例3:查找分數小于班級平均分數的學生select * from Stude ntscore mwhere score<(select avg (score) from

27、Studentscore cwhere c. class =m. class例4:用表provincelnfo的字段provinceID 替換表cityInfo的provinceID字段,條件是: 表 provinceinfo 的字段 province 的值與表 cityInfo 的 province 字段的值相等。up date city Info t1set vinceID=(select provincelDwhere vince=vince )from provinceinfo t25.嵌套子查詢例:檢索與成績為select * from selec

28、t)100的學生所在班級的所有學生信息stude ntscoreclass fromwhere class =(studentScore where score=10 0思考:1. 設有表 Province(省名,ID).Province表的Id更新NewPost表的ID(兩表的省名相同)2. 查詢年齡在50歲以上,月收入低于本部門平均工資的人員,輸出他們的姓名和工資NewPost(Province,city,tele,post,ID)其中 ID 字段為空,用例3 :獲取為項目P3'工作的所有職員的信息select * from empio yee where emp_No in (s

29、electemp_no from works_ on where p roject_ no='P 2')select * from empio yee where 'P3' in (selectp roject_ no from works_ onwhere works_on.emp_no=employee.emp_no)(內部查詢的值依賴于外部查詢的值)例4 :獲取位于同一城市的所有部門的信息。select t1.* from dep artme nt t1 where tl.lo cati on in(select t2.lo cati on from de

30、p artme nt t2 where t2.de pt_no <>t1.de pt_no)三.Exists函數與子查詢Exists函數語法:Exists(<子查詢 >)當子查詢塊中包含至少一行,則返回true可以用Exists()函數來表示"交”用Not Exists()函數來表示"差"思考:查詢從未被學生選修的課程,輸出課程號和課程名例1獲取為項目PT工作的所有職員的信息select dist inct t1.* from empio yee t1 where exists(select * fromworks_ on t2 where

31、 t1.e mp_no=t2.e mp_no and t2. project. no='P 1')例2:獲得工作地點不在成都的部門select disti net t1.* from dep artme nt t1 where not exists(select * from department t2 where t1.dept_no=t2.dept_no and t2.location=' 成都') 例3 :獲得沒有參加項目的所有職員select t1.* from empio yee t1 where not exists(select * from wo

32、rks_ on t2 where t1.e mp_no=t2.e mp_no )例4:獲得編號最小的那位職員從事的工作select t2.* from works_on t2 where t2.emp_no in (select min (t1.e mp_no) from empio yee t1 ) select t2.* from works_on t2 where not exists (select * from empio yee t1 where t2.e mp_no >t1.e mp_no)子查詢只能顯示外部表中的信息,而連接查詢即可以顯示外部表中的信息也可以顯示內部表中的

33、信息。用連接查詢便于閱讀理解,也可以幫助Sqlserver找到一種更有效的策略來獲取適當的數據,然而,使用子查詢可以是某些問題的解決變得簡單 練習:1. 查找出生于1970-12-31日之前,工資低于本部門平均工資的職員信息。2. 查找各部門年齡最小的職員信息3.select emp_n o,emp_ name,emp_birthday,emp_salary,de pt_no from empio yee twhere emp_birthday<'1970-12-31' andemp _salary<(select avg(emp_salary) from empi

34、o yee where dept_no=t.de pt_no)select emp_no,emp_name,emp_birthday,emp_salary,dept_nofrom empio yeewhere dept_no+str(datediff(yy,e mp _birthday,getdate() in(select dept_no+str( min( datediff(yy,e mp _birthday,getdate()from empio yee t groupby dept_no)select * from empioyeewhere dept_no in(select dep

35、t_no from empio yee t group by dept_nohav ing min( datediff(yy,t.e mp _birthday,getdate()<30 )為年齡在50以上,工資低于本部門平均工資的職工增加工資100元up date men t1 set 月收入=月收入 +100 where age>50 and 月收入 < (Select avg(月收入)from men where 所在部門=t1.所在部門)從課程表中刪除至今沒有人選修的課程delete From 課程 where 課號 not in (select 課號 from 成績)

36、集合操作符Oracle提供了用于連接多個查詢的集合操作符:Union 或 union all 并運算 In tersecti on 交運算 minus差運算1. Union集合并運算:對兩個集合進行并運算操作得到一個新的集合,這個新的集合中的所有元素或者出現在其中任意一個集合中,或者在兩個集合中都出現。格式:Seiect_1UnionAllSelect_2UnionSelect_3Un io nAllAll說明:1.2.Seiect_1, Seiect_2,是用于創建并運算的Select語句如果使用了 All關鍵字,則包含的重復(行)也顯示。否則不顯示重復行(默認)。 兩個被連接的查詢之間必須

37、是相容的,即被連接的查詢具有相同數目的列,且相應列的數據類型是兼容的,例如,int和Smaiilnty4.只有當最后一句 Select語句與Order by子句一起使用時,才能對”并”操作的結果進行排序。4.結果集的列名與第一個select語句相同。例:1.準備數據:Create table 咅部門 1 ASSelect * from部門復制表”部門”到部門1 ”Create table 部門 2 ASSelect * from部門復制表”部門”到部門1 ”2.將表和表進行union和uinon all運算Select * from 部門 1UnionSelect * from 部門 2 /沒

38、有重復行Select * from 部門 1UnionALL Select * from 部門 2 包含重復行2.In tersect交運算獲得同時屬于兩個查詢的結果集的集合。Select 語句 1In tersectSelect 語句 2In tersectSelect 語句 3例:查詢同時選修了高等數學和普通物理這兩門課的學生,(Select xh From 成績 where課號='高等數學 In tersect(Select xh From 成績 where課號='普通物理并輸出他們的學號。'/高等數學替換為課號'/高等數學替換為課號3.minus差運算獲

39、得屬于第一個查詢,但不屬于第二個查詢的結果集的集合。(Select 語句min us(Select 語句min us(Select 語句1)2)3)例1 :查詢選修了(Select xh minus(Select xh001課程,但沒喲選修002課程的學生,輸出他們的學號.From 成績 where 課號= '001'From 成績 where 課號= '002'例2:復雜子查詢:方法1 (用集合minus運算):select xh from dept-查找沒有學生的系min usselect xh from stude nt方法2 (用集合in運算):-sel

40、ect xh from dept where xh not in (select xh from stude nt)方法3 (用集合exists函數)select xh from dept where not exists(select xh from stude nt where stude nt.xh= dep t.xh)此例說明,同一問題可以使用多種方法實現層次查詢樹查詢客觀世界中的很多信息都是按樹型結構組織的。例如,一個企業中各部門之間的關系, 人員上下級之間的關系等。一、樹查詢的專門子句:1、Start with 子句語法:Start with <condition> 子

41、句指定樹查詢的根節點,滿足該子句條件的行將被作為根節點輸出,子查詢。例如:ename='小平2、Connect by 子句語法: Connect by <condition> 子句用于指定父子關系。在條件中使用關鍵字PRIOR引用父記錄的值,PRIOR expr <關系運算符> expr expr <關系運算符> PRIOR expr例如:PRIOR eno=mgr表示,用父節點的 eno值去查找其他記錄中 的行,找到的這些行就是當前父節點的子節點。該子句可以包含一個有兩種形式:mgr等于該值另外,where子句可以限定查詢返回的行。二、Oracle

42、按照下列步驟執行樹查詢:根據Start with子句中的條件確定根節點,根節點可以不止一個。 查詢每一個根節點的子節點,每一個子節點必須滿足 繼續查詢下一層節點,即查找第 往下找。在每層查找的過程中, 前父節點的子節點。如果查找包含一個 where子句, 那些記錄。如果一個節點不滿足1、2、3、Connect by子句規定的父子條件2步返回的那些節點的子節點。以此類推。一層一層地Oracle總是按照Connect by子句的條件,查找相對于當Oracle將篩選掉樹結構中所有不滿足where子句條件的where子句的條件,那么它的子節點不受影響。5、樹查詢的結果遵循先父后子的順序依次輸出。4、簡

43、單子查詢一.概念:1. 查詢塊-在SQL語言中,一個 Select -From -Where語句稱為一個查詢塊2. 子查詢-將一個查詢塊嵌套在另一個查詢塊的 Where子句或Having子句的條件 中的查詢稱為子查詢,亦稱嵌套查詢。當然,子查詢也可以嵌套在insert,update,delete語句中。子查詢分分為兩類:簡單的,相關聯的。在簡單子查詢中,內部查詢都只被計算一次;而相關聯的查詢依賴于外部查詢的一個變量,所以,每當系統從外部查詢取回一個新行時,相關聯查詢中的內部查詢都要被計算一次3. 子查詢求解方法-由里向外處理,即每個子查詢在其上一級查詢處理之前求解,子查詢 的結果用于建立其父查

44、詢的查找條件用途:1。跨數據表查詢;2。挑選出子段重復的數據二.帶有In謂詞的子查詢Where In(查詢塊)Select * from 人員 where 所在部門 in(Select部門號from 部門 where部門號=財務部)獲得部門號 <人事部的所有人員的姓名,月收入等信息三.帶有比較運算符的子查詢 帶有Any, All謂詞的子查詢 >ANY大于子查詢結果中的任意值 <ANY小于子查詢結果中的任意值 >=ANY大于等于子查詢結果中的任意值 <=ANY小于等于子查詢結果中的任意值 =ANY等于子查詢結果中的任意值! =ANY或 <> ANY 不等

45、于子查詢結果中的任意值>ALL大于子查詢結果中的所有值<ALL小于子查詢結果中的所有值>=ALL大于等于子查詢結果中的所有值<=ANY小于等于子查詢結果中的所有值=ALL等于子查詢結果中的所有值 (無意一,不用)! =ALL或 <> ALL 不等于子查詢結果中的任何一個值 四.說明:子查詢可以使用在 Create Table語句中,In sert Into語句中,Up date語句中。Delete語句中思考:1.將表NewPost中長途區號不為空或空串的記錄備份到新表Newpost_back中例1.查找重復記錄Select代碼,部門,領導,活動經費from

46、部門 Where代碼in(Select代碼 From部門Group By 代碼 Having count(代碼)1) Order By 代碼 例2.例3.Select * From 人員表 Where 部門號 In(Select部門號From人員表Where姓名='王因)Select 姓名,性別,基本工資From人員表 Where Rkbh In(Select Rkbh From 照片表 Where照片 Is Null)查找其他部門比信息部任意人員基本工資低的人員姓名,性別,出生年月,例4.基本工資Select 姓名,Where性別,出生年月,基本工資From人員表基本工資any(Se

47、lect基本工資 From人員表Where部門號In (Select部門號 From部門表 Where部門名稱='信息部)insert into 部門(部門,領導,代碼)Values("公關部",”王大海","17")up date人員情況表 SetDelete from 部門 WhereInsert Into人員情況表門 Where 代碼='00'Select身份證號,姓名,性別,出生日期,文化程度,籍貫,所在部門,基本工資,生活補貼,房租費Into人員表 From人員情況表Where所在部門In('00

48、9;,'01')基本工資=1200 where 所在部門='01'代碼='17'(姓名,所在部門,基本工資)Select領導,代碼,活動經費From部顯示所有部門的名稱,編號,領導及其本部門人員的月收入select d.*, (select avg(ysr) from mens where mens.所在部門=d.咅部門號)as 平均月收入 from dept d /藍色部分為子查詢/ 以下范例涉及至 U四張表:dep artme nt,e mpio yee ,p roject,works_ on獲取在”研發部”工作的所有人員的姓名1.用子查詢s

49、elect * from empio yee where dept_no in( select dept_no from dep artme nt where dept_name='研發咅B ')2用等值連接查詢select t1.* from empio yee t1,de partme nt t2where t1.de pt_no=t2.de pt_noand t2.dept_name='研發部'獲取比肖遙要小的項目編號select disti net p roject_ no from works_ onwhere emp_No<(select em

50、p_no from empioyee where emp_name='肖遙')練習:1獲得1997年參加工作的所有職員。2獲得為項目P2工作,且編號1000的所有職員3獲取部門分布的城市4找出最大的職員編號及最小的職員編號5找出從事人數在 3個以上的項目6找出擔任系統分析員或項目經理的所有人的信息7找出mens表中所有人來自的部門8找出具有最小月收人的員工9找出沒有任何員工的部門10.顯示所有員工的信息(包括所在的部門名稱)11找出月收入低于全體員工平均月收的所有職員12. 找出月收入高于全體員工平均月收的所有職員13. 找出具有最高和最低月收入的所有職員/Oracle的SQL

51、語句執行效率問題查找與解決方法文章分類:數據庫、識別占用資源較多的語句的方法(4種方法)1. 測試組和最終用戶反饋的與反應緩慢有關的問題。2. 利用V_$SQLARE視圖提供了執行的細節。(執行、讀取磁盤和讀取緩沖 區的次數)數據列EXECUTIONS執行次數DISK READS讀盤次數程序單兀)COMMAND_TYP命 令類型(3:select,2:i nsert;6:u pdate;7delete;47: pl/sqlOP TIMIZER_MOD優 化方式SQL_TEXT Sql 語句SHARABLE_MEI占用 shared pool 的內存多少BUFFER GET戲取緩沖區的次數用途1

52、、幫忙找出性能較差的SQL語句2、幫忙找出最高頻率的SQL3、幫忙分析是否需要索引或改善聯接3.監控當前Oracle的session,如出現時鐘的標志,表示此進程中的sql運行時間較長。4.Trace 工具:a)查看數據庫服務的初始參數:timed_statistics 、user_dump_dest和 max_dump_file_sizeb) Ste P 1: alter sessi on set sql_trace=truec) Ste p 2: run sqld) Ste p 3: alter sessi on set sql_trace=falsee)Step 4:使用“TKPRO”轉

53、換跟蹤文件f)Parse,解析數量大通常表明需要增加數據庫服務器的共享池大小,query或current提取數量大表明如果沒有索引,語句可能會運行得更有效,disk提取數量表明索引有可能改進性能,library cache中多于一次的錯過表明需要一個更大的共享池大小二、如何管理語句處理和選項基于成本(Cost Based) 和基于規則(Rule Basec) 兩種優化器, 簡 稱為CBO和RBO-Optimizer Mode 參數值:Choose:如果存在訪問過的任何表的統計數據,則使用基于成本的Optimizer,目標是獲得最優的通過量。如果一些表沒有統計數據,則使用估計值。 如果沒有可用的

54、統計數據,則將使用基于規則的Op timizerAll_rows :總是使用基于成本的 Optimizer,目標是獲得最優的通過量First_rows_n :總是使用基于成本的Optimizer ,目標是對返回前N行(“n” 可以是1, 10, 100或者1000)獲得最優的響應時間First_rows :用于向后兼容。使用成本與試探性方法的結合,以便快速傳遞 前幾行RULE總是使用基于規則的Optimizer三、使用數據庫特性來獲得有助于查看性能的處理統計信息(解釋計劃和AUTOTRACENo1: Exp lai n PlanA)使用Exp lain工具需要創建Exp lain_plan 表

55、,這必須先進入相關應用表、 視圖和索引的所有者的帳戶內.(D:oracleora92 dbmsadmi nutlx pla n)B)表結構:如果在NULL,Index ,STATEMENTJID為一條指定的SQL語句確定特定的執行計劃名稱。EXPLAN PLA語句中沒有使用 SET STATEMENTJID那么此值會被設為OP ERATIQN在計劃的某一步驟執行的操作名稱,例如:FiltersTable,Marge Joins and Table 等。OPTION對OPERATIO操作的補充,例如:對一個表的操作, OPERATIO可 能是 TABLE ACCESS但 OPTION可能為 by ROWID或 FULLObject_Owner:擁有此 database Object 的 Schema名或 Oracle 帳戶名。Objectname: Database Object 名Object_type :類型,例如:表、視圖、索引等等ID :指明某一步驟在執行計劃中的位置。PARENTjID指明從某一操作中取得信息的前一個操作。通過對與ID和PARENT使用Connect By操作,我們可以查詢整個執行計劃樹。C) EXPLAIN搜索路徑解釋全表掃描(Full Table Scans)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論