![Oracle程序員面試分類模擬37_第1頁](http://file4.renrendoc.com/view5/M00/2F/22/wKhkGGZb9CeAZIR2AARaX3DAjMY392.jpg)
![Oracle程序員面試分類模擬37_第2頁](http://file4.renrendoc.com/view5/M00/2F/22/wKhkGGZb9CeAZIR2AARaX3DAjMY3922.jpg)
![Oracle程序員面試分類模擬37_第3頁](http://file4.renrendoc.com/view5/M00/2F/22/wKhkGGZb9CeAZIR2AARaX3DAjMY3923.jpg)
![Oracle程序員面試分類模擬37_第4頁](http://file4.renrendoc.com/view5/M00/2F/22/wKhkGGZb9CeAZIR2AARaX3DAjMY3924.jpg)
![Oracle程序員面試分類模擬37_第5頁](http://file4.renrendoc.com/view5/M00/2F/22/wKhkGGZb9CeAZIR2AARaX3DAjMY3925.jpg)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
Oracle程序員面試分類模擬37簡答題1.
什么是索引分裂?索引分裂有哪幾種類型?正確答案:索引分裂(IndexBlockSplit)就是索引塊的分裂。當一次DML操作修改了索引塊上的數(shù)據(jù),(江南博哥)但是舊有的索引塊沒有足夠的空間去容納新修改的數(shù)據(jù)時,將分裂出一個新的索引塊,舊有塊的部分數(shù)據(jù)放到新開辟的索引塊上,這個過程就稱為索引塊的分裂,簡稱索引分裂。
在分裂的過程中前臺進程需要等待分裂完成之后才能繼續(xù)操作。如果此時其他會話也要修改這個索引塊的數(shù)據(jù),那么將會出現(xiàn)索引塊的競爭,等待以“enq:TX-indexcontention”的形式體現(xiàn),該事件是一個與索引分裂直接相關的等待事件。一般索引塊的分裂持有資源和釋放非常迅速,并不會對數(shù)據(jù)庫造成嚴重的性能影響,但是對表操作并發(fā)量很大的情況下可能導致嚴重的競爭。當索引分裂發(fā)生時,負責實施分裂的進程會持有相關的隊列鎖,直到該進程完成分裂操作才會釋放該隊列鎖。在這個過程中負責分裂的進程需要找到合適的新塊并將對應的數(shù)據(jù)移動到該新塊中。若在此分裂的過程中,有其他進程INSERT數(shù)據(jù)到該索引塊中,則將進入enq:TX-indexcontention等待,直到分裂結束鎖被釋放。
索引分裂有如下幾種情況:
(1)按照分裂對象分
1)葉子節(jié)點分裂:葉子節(jié)點上沒有足夠的空間容納新插入的數(shù)據(jù)。葉子節(jié)點分裂的情況最頻繁發(fā)生,對性能影響最直接。
2)枝節(jié)點分裂:其下層的節(jié)點分裂,會導致在該節(jié)點上增加一條記錄指向新加的節(jié)點,當該節(jié)點空間不足時,會發(fā)生分裂。
3)根節(jié)點分裂:特殊的枝節(jié)點分裂,分裂需要兩個新的數(shù)據(jù)塊,將原有數(shù)據(jù)轉移至兩個新節(jié)點,原有節(jié)點上生成兩條記錄分別指向新增的數(shù)據(jù)塊。
(2)按照分裂數(shù)據(jù)塊比例分
1)9-1分裂:當事務向索引的最右側的葉節(jié)點上插入一條大于或等于現(xiàn)有索引塊上最大值的數(shù)據(jù),且該索引塊上不存在其他未提交的事務,如果沒有足夠的空間,那么就會發(fā)生9-1分裂。絕大部分數(shù)據(jù)還保留在舊有節(jié)點上,僅有非常少的一部分數(shù)據(jù)遷移到新節(jié)點上。
2)5-5分裂:當發(fā)生5-5分裂時,有一半索引記錄仍存在當前塊,而另一半數(shù)據(jù)移動到新的節(jié)點中,舊節(jié)點和新節(jié)點上的數(shù)據(jù)比例幾乎是持平的。5-5分裂發(fā)生的條件:
①當左側節(jié)點發(fā)生新值插入時(插入到葉子節(jié)點中的索引鍵值小于該塊中的最大值)。
②當發(fā)生DML操作時,索引塊上沒有足夠空間分配新的ITL槽。
③當新插入數(shù)據(jù)大于或等于索引中最大值時,但是數(shù)據(jù)塊上還存在其他未提交的事務。
對性能來說,無論是9-1分裂,還是5-5分裂,都會影響系統(tǒng)的性能。通過10224事件可以生成索引塊分裂及刪除的trace:
索引分裂常常發(fā)生在主鍵列上,在這種情況下,可以考慮將該主鍵修改為反轉(REVERSE)類型的主鍵。若主鍵是通過序列、時間戳或按某種規(guī)則單調生成的主鍵,則可以使用反轉索引來有效地降低索引“單向右增長”(Right-GrowingIndex)的可能性。語句如下:
在發(fā)生索引分裂等待的時候,也可以根據(jù)需要將索引改造為分區(qū)索引。通過HASH將索引分成一個一個小塊,這樣競爭就不會聚集在最右邊的節(jié)點上。通過HASH分區(qū)索引在一定程度上就可以緩解插入數(shù)據(jù)的競爭問題。
2.
有如下兩張表:
1)用戶資料表:SERV(SERV_IDNUMBER(10),PROD_IDNUMBER(L0),USER_TYPEVARCttAR2(30),TERMINAL_NAMEVARCHAR2(30)),其中:SERV_ID為用戶標識,是SERV表的主鍵;PROD_ID為產(chǎn)品標識;USER_TYPE為用戶類型;TERMINAL_NAME為終端類型。
2)終端類型臨時表:TERMINAL(SERV_IDNUMBER(10),TERMINAL_NAMEVARCHAR2(30))。
在初始化情況下,SERV表的SERV_ID、PROD_ID、USER_TYPE字段值是已知的,TERMINAL_NAME字段是空的,現(xiàn)在要根據(jù)PROD_ID,USER_TYPE字段的值來更新NAME字段。
更新條件為:
1)當條件滿足“PROD_ID=1ANDUSER_TYPE='A'”時,TERMINAL_NAME更新為“固話”。
2)當條件滿足“PROD_ID=1ANDUSER_TYPE='B'”時,TERMINAL_NAME更新為“小靈通”。
3)當條件滿足“PROD_ID=2”時,TERMINAL_NAME更新為“寬帶”。
4)當條件滿足“USER_TYPE='C'”時,TERMINAL_NAME更新為“CDMA”。
5)以上條件均不滿足時,TERMINAL_NAME更新為-1。
根據(jù)以上條件,完成存儲過程,存儲過程的名稱為:SPTERMINAL。正確答案:存儲過程如下:
3.
通過DBMS_SCHEDULER如何調用SHELL腳本?正確答案:可以直接創(chuàng)建JOB來調用SHELL腳本,如下:
若是以普通用戶執(zhí)行上述代碼的話,在執(zhí)行過程中會遇到ORA-27486:insufficientprivileges和ORA-27399:jobtypeEXECUTABLErequirestheCREATEEXTERNALJOBprivilege的錯誤,這是由于權限不足的緣故導致的。
解決方法:以SYSDBA連接,然后執(zhí)行上述代碼,或者用SYS用戶進行賦權操作,這里假設普通用戶的用戶名為LHR:
賦權之后接著執(zhí)行就好了:
4.
分區(qū)表有什么優(yōu)點?分區(qū)表有哪幾類?如何選擇用哪種類型的分區(qū)表?正確答案:當表中的數(shù)據(jù)量不斷增大時,查詢數(shù)據(jù)的速度就會變慢,應用程序的性能就會下降,這時就應該考慮對表進行分區(qū)。當對表進行分區(qū)后,在邏輯上,表仍然是一張完整的表,只是將表中的數(shù)據(jù)在物理上可能存放到多個表空間或物理文件上。當查詢數(shù)據(jù)時,不至于每次都掃描整張表。Oracle可以將大表或索引分成若干個更小、更方便管理的部分,每一部分稱為一個分區(qū),這樣的表稱為分區(qū)表。SQL語句使用分區(qū)表比全表能提供更好的數(shù)據(jù)處理與訪問的性能。即使某些分區(qū)不可用,其他分區(qū)仍然可用,這稱為分區(qū)獨立性。
分區(qū)表的一些限制條件:①簇表不能進行分區(qū)。②不能分割含有LONG或LONGRAW列的表。③索引組織表不能進行范圍分區(qū)。
(1)何時考慮分區(qū)?對大表進行分區(qū),將有益于大表操作的性能和大表的數(shù)據(jù)的維護。官方文檔說通常當表的大小超過2GB,或對于OLTP系統(tǒng),當表的記錄超過1000萬條時,都應考慮對表進行分區(qū)。
(2)分區(qū)表有什么優(yōu)點?分區(qū)表有如下的優(yōu)點:
1)增強可用性:如果表的一個分區(qū)由于系統(tǒng)故障而不能使用,那么表的其余好的分區(qū)仍可以使用。
2)減少關閉時間:如果系統(tǒng)故障只影響表的一部分分區(qū),那么只有這部分分區(qū)需要修復,可能比整個大表修復花的時間更少。
3)維護輕松:單獨管理每個分區(qū)比管理單個大表要輕松得多。
4)均衡I/O:可以把表的不同分區(qū)分配到不同的磁盤來平衡I/O,改善性能。
5)改善性能:對大表的查詢、增加、修改等操作可以分解到表的不同分區(qū)來并行執(zhí)行,可使運行速度更快。
6)分區(qū)對用戶透明,最終用戶感覺不到分區(qū)的存在。
(3)有哪些類型的分區(qū)?如何選擇用哪種類型的分區(qū)表?Oracle的分區(qū)可以分為:
1)范圍分區(qū)(RANGEPARTITION)。
2)哈希分區(qū)(HASHPARTITION)。
3)列表分區(qū)(LISTPARTITION)。
4)復合分區(qū)(組合分區(qū))。
5)INTERVAL分區(qū)(間隔分區(qū))。
6)系統(tǒng)分區(qū)。
INTERVAL分區(qū)和系統(tǒng)分區(qū)是Oracle11g的新特性,由于篇幅原因,本書中不講解這2個分區(qū),讀者可自行查閱官方文檔進行學習。尤其對于INTERVAL分區(qū)在生產(chǎn)環(huán)境中還是比較實用的。下面作者將對范圍、哈希、列表和復合分區(qū)分別進行講解。
(1)RAN(詎(范圍)分區(qū)在如下幾種情況下會使用到范圍分區(qū):
1)頻繁地被一個時間范圍謂詞掃描。
2)維護一個時間滾動的數(shù)據(jù)窗口(RollingWindowOfData)。
3)保存歷史數(shù)據(jù)的表。
(2)HASH(哈希)分區(qū)HASH分區(qū)有如下的優(yōu)點:
1)提高了大表的高可用性和可管理性。
2)可以避免數(shù)據(jù)傾斜,將數(shù)據(jù)均勻地分布在多個物理設備上,最大化I/O吞吐量。
3)分區(qū)修剪和分區(qū)智能連接。
4)要求分區(qū)鍵是高基數(shù)列。
5)分區(qū)修剪不支持基于分區(qū)字段的范圍查詢,只支持等值查詢或IN-LIST查詢。
HASH分區(qū)能夠很容易對數(shù)據(jù)進行分區(qū),因為語法很簡單,很容易實現(xiàn)。在下面這幾種情況下,使用HASH分區(qū)比RANGE分區(qū)更好:
1)事先不知道需要將多少數(shù)據(jù)映射到給定范圍的時候。
2)分區(qū)的范圍大小很難確定,或者很難平衡的時候。
3)RANGE分區(qū)使數(shù)據(jù)得到不期望的聚集時。
4)性能特性,如并行DML、分區(qū)修剪和分區(qū)連接很重要的時候。
(3)LIST(列表)分區(qū)列表分區(qū)(LISTPARTITION)提供了一種按照字段的值來進行分區(qū)的方法,這種方法非常適合于有高重復率字段值的表。通過這種方法,可以非常方便地控制將某些特定的數(shù)值存放到一個分區(qū)。
列表分區(qū)有如下特點:
1)列表值是離散的。
2)列表值是無序的,例如:PARTITIONPART_01VALUES('A','E','F')等。
3)分區(qū)鍵僅能包含一個列。
4)列表值是低基數(shù)的。
(4)復合分區(qū)如果某表按照某列分區(qū)之后,仍然較大,或者是有一些其他的需求,那么還可以通過在分區(qū)內再建子分區(qū)的方式將分區(qū)冉分區(qū),即復合分區(qū)的方式。
復合分區(qū)在Oracle11g之前有兩種:RANGE-HASH與RANGE-LIST。需要注意的是其順序,根分區(qū)只能是RANGE分區(qū),子分區(qū)可以是HASH分區(qū)或LIST分區(qū),而Oracle11g在復合分區(qū)功能這塊有所增強,又推出了RANGE-RANGE、LIST-RANGE、LIST-LIST和LIST-HASH,這就相當于除HASH外3種分區(qū)方式的笛卡爾形式都有了,即目前一共有6種分區(qū),但根分區(qū)只能是RANGE分區(qū)或LIST分區(qū)。
在某些時候按照業(yè)務要求,上面的幾種分區(qū)也可以按照一定的目的創(chuàng)建復合分區(qū),或者稱為子分區(qū)。
對于海量數(shù)據(jù)的數(shù)據(jù)庫設計,分區(qū)的設計非常重要。例如,對于一個大表,應該采用哪種類型的分區(qū),對于以后數(shù)據(jù)庫的性能和管理至關重要。
其實,范圍分區(qū)、HASH分區(qū)和列表分區(qū)這3種分區(qū)的特點都非常明顯,如下:
1)如果需要進行數(shù)據(jù)的過期化處理,那么范圍分區(qū)基本上是唯一的選擇。
2)如果需要數(shù)據(jù)的均勻分布,那么可以考慮使用HASH分區(qū)。
3)如果數(shù)據(jù)的值可以很好地對應于某個分區(qū),那么就可以考慮使用列表分區(qū)。
在上面的原則基礎上,再結合性能的影響因素,來最終確定使用哪種類型的分區(qū)。
如果選擇的分區(qū)不能確保各分區(qū)內數(shù)據(jù)量的基本平均,那么這種分區(qū)方式有可能是不恰當?shù)?。比如對于RANGE分區(qū),假設分了10個分區(qū),而其中一個分區(qū)中的記錄數(shù)占總記錄數(shù)的90%,其他9個分區(qū)只占總記錄數(shù)的10%,則這個分區(qū)方式就起不到數(shù)據(jù)平衡的作用。
5.
SQL如何優(yōu)化?SQL優(yōu)化關注點有哪些?正確答案:隨著數(shù)據(jù)庫中數(shù)據(jù)量的增長,系統(tǒng)的響應速度就成為目前系統(tǒng)需要解決的最主要的問題之一。系統(tǒng)優(yōu)化中一個很重要的方面就是SQL語句的優(yōu)化。對于大量數(shù)據(jù),劣質SQL語句和優(yōu)質SQL語句之間的速度差別可以達到上千倍。對于一個系統(tǒng)不是簡單地能實現(xiàn)其功能就可以了,而是要寫出高質量的SQL語句,提高系統(tǒng)的可用性。
在多數(shù)情況下,Oracle使用索引來更快地遍歷表,優(yōu)化器主要根據(jù)定義的索引來提高性能。如果在SQL語句的WHERE子句中寫的SQL條件不合理,那么就會造成優(yōu)化器舍去索引而使用全表掃描,一般這種SQL語句的性能都是非常差的。在編寫SQL語句時,應清楚優(yōu)化器根據(jù)何種原則來使用索引,這有助于寫出高性能的SQL語句。
SQL的優(yōu)化主要涉及如下幾個方面的內容:
1)索引問題。是否可以使用組合索引;限制條件、連接條件的列是否有索引;能否使用到索引避免全表掃描。一般情況下,盡量使用索引,因為索引在很多情況下可以提高查詢效率。排序字段有正確的索引,驅動表的限制條件有索引,被驅動表的連接條件有索引。
2)相關的統(tǒng)計信息缺失或者不準確。在確保統(tǒng)計信息正確后,再結合統(tǒng)計信息查看執(zhí)行計劃是否正確以及是否最優(yōu)化。
3)直方圖使用錯誤。
4)SQL本身的效率問題,例如使用綁定變量,批量DML采用BULK等,這個就考驗寫SQL的基本功了。
5)數(shù)據(jù)量大小。如果就是幾百條數(shù)據(jù),那么就沒有所謂效率之分,一般情況下怎么寫效率都不低。如果數(shù)據(jù)量很大,那么就得考慮是否要分頁或排序。
6)綁定變量:大多數(shù)情況綁定變量能提高查詢效率,但也有降低效率的情況。
7)批量和并行的考慮。
8)業(yè)務需求需要正確理解,實現(xiàn)業(yè)務的邏輯需要正確,減少一些重復計算。有可能是設計的不合理、業(yè)務需求的不合理,而問題SQL并非根本原因。
9)查詢特別頻繁的結果是否可以緩存,比如Oracle的/*+result_cache*/。
10)分析表的連接方式。若是NL連接,則根據(jù)業(yè)務或表的數(shù)據(jù)質量情況,分析能否減少驅動表的結果集。
11)是否可以固定執(zhí)行計劃。
12)大表是否存在高水位。
13)在創(chuàng)建表的時候,應盡量建立主鍵,盡量根據(jù)實際需要調整數(shù)據(jù)表的PCTFREE和PCTUSED參數(shù)。
6.
如果$GRID_HOME下的權限被人為修改過,那么如何來修復該權限問題?正確答案:使用chown-R誤操作將整個$GRID_BASE的權限修改了,或者刪除了$GRID_HOME/log文件夾下的所有內容,導致集群不能啟動。在這種情況下可以根據(jù)MOS文檔:TipsforcheckingfilepermissionsonGRIDenvironment(ID1931142.1)來修復該問題。
該文檔中描述到,在$GRlD_HOME/crs/utl(Oracle11.2及12.1.0.1)或<GRID_HOME>crs/utl<hostname>(Oracle12.1.0.2)下面的crsconfig_dirs和crsconfig_fileperms文件中記錄了整個$GRID_HOME下面的文件和目錄的相關權限。
可以通過命令“cluvfycompsoftware-nall-verbose”來校驗集群的權限是否正確。
所以要解決這個問題其實并不難,大致可以通過如下幾種方法來解決:
1)根據(jù)MOS文檔提供的建議通過$GRID_HOME/crs/install/rootcrs.pl-init或roothas.pl-init進行解決。rootcrs.pl-init是在PSU>11.2.0.3.6下執(zhí)行的,如果PSU<11.2.0.3.6可以執(zhí)行如下兩條命令來實現(xiàn)同樣的效果。
2)采用MOS文檔1515018.1上提供的腳本在正常庫上生成腳本,然后將生成的腳本在異常庫上執(zhí)行從而來修復權限問題。
3)Oracle11gR2可以deconfigcrs的配置,然后重新運行root.sh即可。如果OCR和數(shù)據(jù)庫不在同一個磁盤組里,那么重新運行root.sh腳本并不影響數(shù)據(jù)庫,所以無需擔心。
4)MOS文檔1515018.1上提供了一個修復腳本:permission.pl??梢愿鶕?jù)該腳本來修復。
在安裝有GI的環(huán)境下,權限、屬主是嚴格被設定的,任何對于它們的錯誤修改容易引發(fā)一系列的問題,而且這些問題往往都很詭異很難按照常規(guī)的思路去診斷。一旦出現(xiàn)權限的問題,個人建議通過第1和第3種方式來修改。
如果可執(zhí)行文件$ORACLE_HOME/bin/oracle的屬主或權限設定出了問題,那么可能會造成很多問題。例如:無法登錄到數(shù)據(jù)庫、ora-600錯誤、“TNS-12518:TNS:listenercouldnothandoffclientconnection”、“LinuxError:32:Brokenpipe”、“ORA-12537:TNS:connectionclosed”、訪問ASM磁盤出錯等。解決辦法很簡單,可以在grid用戶下運行setasmgidwrap命令重新配置$ORACLE_HOME/bin/oracle可執(zhí)行文件的權限和屬主或者直接將oracle文件的權限修改為6751。$ORACLE_HOME/bin/oracle可執(zhí)行文件正確屬主應該是oracle:asmadmin,并且權限必須有s共享才可以,如下:
7.
數(shù)據(jù)庫中有一張如下所示的表,表名為SALES。年季度銷售量19911111991212199131319914141992121199222219923231992424要求:寫一個SQL語句查詢出如下所示的結果。年一季度二季度三季度四季度199111121314199221222324正確答案:這是一道行轉列的題目,首先建立表SALES:
此題若使用聚合函數(shù)+DECODE或CASE來回答,如下:
此題若使用PIVOT函數(shù),如下:
此題若使用臨時表的方式,如下:
8.
怎么設置存儲過程的調用者權限?正確答案:普通存儲過程都是定義者權限,如果想設置調用者權限,那么需要聲明“AUTHIDCURRENT_USER”,參考如下語句:
9.
如何查找邏輯讀、物理讀、執(zhí)行次數(shù)和解析次數(shù)最多以及執(zhí)行時間最長的SQL語句呢?如何查找或監(jiān)控效率低下的SQL語句?正確答案:效率低下的SQL一般是執(zhí)行時間較長的SQL語句,可以通過如下幾種方式來監(jiān)控分析:
1)當前系統(tǒng)的SQL可以通過監(jiān)控V$SQL_MONITOR、V$SESSION視圖來實現(xiàn),記錄執(zhí)行時間較長的SQL語句。對于歷史SQL可以通過分析DBA_HIST_SQLSTAT視圖。
2)分析現(xiàn)有的系統(tǒng)中的執(zhí)行計劃,重點檢查驅動表與被驅動表順序、表連接算法、排序是否有索引、索引使用。
3)分析AWR、ASH和ADDM。
4)通過OEM中性能監(jiān)控的捕獲執(zhí)行時間5s以上的SQL程序。
5)通過GV$SQLAREA視圖來分析。
10.
RMAN、NBU備份分別是什么?正確答案:(1)RMAN為了更好地實現(xiàn)數(shù)據(jù)庫的備份和恢復工作,Oracle提供了恢復管理器(RecoveryManager,簡寫為RMAN)。RMAN是一個可以用來備份、恢復和還原數(shù)據(jù)庫的應用程序,是隨Oracle服務器軟件一同安裝的Oracle工具軟件,通過執(zhí)行相應的RMAN命令可以實現(xiàn)備份和恢復操作。RMAN可以用來備份和恢復數(shù)據(jù)庫文件、歸檔日志、控制文件和系統(tǒng)參數(shù)文件,也可以用來執(zhí)行完全或不完全的數(shù)據(jù)庫恢復。
在Oracle數(shù)據(jù)庫中,通過RMAN工具,可以將數(shù)據(jù)備份到磁盤或磁帶上。在需要時,可以通過RMAN工具將備份的文件進行恢復。使用RMAN可以減少DBA在對數(shù)據(jù)庫進行備份與恢復時產(chǎn)生的錯誤,提高備份與恢復的效率。在默認情況下,標準版和企業(yè)版的Oracle都會安裝RMAN程序。
RMAN有三種不同的用戶接口:COMMANDLINE方式、GUI方式(集成在OEM中的備份管理器)和API方式(用于集成到第三方的備份軟件中)。
RMAN具有如下特點:
1)功能類似物理備份,但比物理備份強大很多。
2)可以把備份打包成備份集,也可以按固定大小分割備份集。
3)備份與恢復的過程可以自動管理。
4)可以使用腳本(存在RecoveryCatalog中)。
5)RMAN會檢測和報告損壞的數(shù)據(jù)塊。
6)可以跳過未使用的數(shù)據(jù)塊。
在執(zhí)行RMAN備份時,RMAN不會備份從未被寫入的數(shù)據(jù)塊。而傳統(tǒng)的備份方法無法知道已經(jīng)使用了哪些數(shù)據(jù)塊。
7)備份壓縮,也可以壓縮空塊。RMAN使用一種Oracle特有的二進制壓縮模式來節(jié)省備份設備上的空間。盡管傳統(tǒng)的備份方法也可以使用操作系統(tǒng)的壓縮技術,但RMAN使用的壓縮算法是定制的,能夠最大程度地壓縮數(shù)據(jù)塊中一些典型的數(shù)據(jù)。
8)執(zhí)行增量備份,可以在塊級別上實現(xiàn)增量。如果不使用增量備份,那么每次RMAN都備份已使用塊;如果使用增量備份,那么每次RMAN都備份上次備份以來變化的數(shù)據(jù)塊,這樣可以節(jié)省大量的磁盤空間、I/O時間、CPU時間和備份時間。
9)塊級別的恢復。可以只還原或修復標識為損壞的少量數(shù)據(jù)塊。在RMAN修復損壞的數(shù)據(jù)塊時,表空間的其他部分以及表空間中的對象仍可以聯(lián)機。
10)在備份時不需要將表空間置于熱備份模式。
11)可以使用RMAN來測試備份而不需要實際還原它們。
RMAN可以用來備份:①數(shù)據(jù)庫:包括數(shù)據(jù)文件、控制文件、SPFILE(ServerParameterFile)文件;②表空間;③歸檔文件;④備份集。
RMAN不能用來備份:①聯(lián)機日志文件(OnlineRedoLogs);②非READ/WRITE狀態(tài)的可傳輸表空間;③PFILE(ParameterFile)文件。
(2)NBUNBU(NetBackup)是VERITAS公司提供的企業(yè)級備份管理軟件,它支持多種操作系統(tǒng),包括UNIX、Windows、OS/2(OperatingSystem/2)以及Mac等。目前,NBU是國際上使用最廣的備份管理軟件。
NBU采用全圖形的管理方式,同時提供命令行接口,適應不同的用戶需求。它提供了眾多的性能調整功能,從管理角度看,其高性能特征十分明顯。如提供多作業(yè)共享磁帶機、大作業(yè)并行數(shù)據(jù)流備份、完善的監(jiān)控報警、動態(tài)備份速度調整等能力,為用戶的集中式存儲管理提供了靈活和卓有成效的手段。
NBU還能與BMR(BootMasterRecord,主引導記錄)集成在一起為用戶提供關鍵業(yè)務系統(tǒng)的智能災難恢復,即無需安裝系統(tǒng),只需執(zhí)行一條命令就能達到全自動系統(tǒng)恢復,整個過程也無需人工干預,是個簡單易行的“傻瓜”過程。NBU簡化了用戶的恢復操作,盡快將應用投入使用,大大減少了用戶因停機帶來的巨大損失。
通過管理界面,管理員可以設置網(wǎng)絡自動備份策略,這些備份可以是完全備份,也可以是增量備份。管理員也可以手動備份客戶端數(shù)據(jù)??蛻舳擞脩艨梢詮目蛻舳藗浞?、恢復和歸檔自己的數(shù)據(jù)。同時,NBU還可以管理存儲設備。
11.
怎樣收集表的統(tǒng)計信息?怎樣收集分區(qū)表的統(tǒng)計信息?正確答案:主要采用DBMS_STATS.GATHER_TABLE_STATS包進行統(tǒng)計信息的收集,如下:
除此之外,還有一些其他的用法,如下:
1)EXECDBMS_STATS.GATHER_DATABASE_STATS(USER);--收集當前數(shù)據(jù)庫下所有用戶的統(tǒng)計信息。
2)EXECDBMS_STATS.GATHER_SCHEMA_STATS(USER);--收集當前數(shù)據(jù)庫用戶下所有對象的統(tǒng)計信息。
當系統(tǒng)的分區(qū)表數(shù)據(jù)量很大時,如果每次都收集全部的分區(qū)必然會導致統(tǒng)計信息的收集非常慢,在Oracle11g之后可以通過設置INCREMENTAL來只針對數(shù)據(jù)有變動的分區(qū)做收集:
12.
觸發(fā)器的作用、優(yōu)缺點有哪些?正確答案:觸發(fā)器(TRIGGER)是數(shù)據(jù)庫提供給程序員和DBA用來保證數(shù)據(jù)完整性的一種方法,它是與表事件相關的特殊的存儲過程,是用戶定義在表上的一類由事件驅動的特殊過程。觸發(fā)器的執(zhí)行不是由程序調用,也不是由手工啟動,而是由事件來觸發(fā)的,其中,事件是指用戶對表的增(INSERT)、刪(DELETE)、改(即更新UPDATE)等操作。觸發(fā)器經(jīng)常被用于加強數(shù)據(jù)的完整性約束和業(yè)務規(guī)則等。
觸發(fā)器與存儲過程的區(qū)別在于:存儲過程是由用戶或應用程序顯式調用的,而觸發(fā)器是不能被直接調用的,而是由一個事件來觸發(fā)運行,即觸發(fā)器是當某個事件發(fā)生時自動地隱式運行。
具體而言,觸發(fā)器有如下作用:
1)可維護數(shù)據(jù)庫的安全性、一致性和完整性。
2)可在寫入數(shù)據(jù)表前,強制檢驗或轉換數(shù)據(jù)。
3)當觸發(fā)器發(fā)生錯誤時,異常的結果會被撤銷。
4)部分數(shù)據(jù)庫管理系統(tǒng)可以針對數(shù)據(jù)定義語言(DDL)使用觸發(fā)器,稱為DDL觸發(fā)器,還可以針對視圖定義替代觸發(fā)器(INSTEADOF)。
觸發(fā)器的優(yōu)點:觸發(fā)器可通過數(shù)據(jù)庫中的相關表實現(xiàn)級聯(lián)更改。從約束的角度而言,觸發(fā)器可以定義比CHECK更為復雜的約束。與CHECK約束不同的是,觸發(fā)器可以引用其他表中的列。例如,觸發(fā)器可以使用另一個表中的數(shù)據(jù)來比較更新的數(shù)據(jù)以及執(zhí)行其他操作,如修改數(shù)據(jù)或顯示用戶定義錯誤信息。觸發(fā)器也可以評估數(shù)據(jù)修改前后的表的狀態(tài),并根據(jù)其差異采取對策。一個表中的多個同類觸發(fā)器(INSERT、UPDATE或DELETE)允許采取多個不同的對策以響應同一個修改語句。
當然,雖然觸發(fā)器功能強大,可以輕松可靠地實現(xiàn)許多復雜的功能,但是它也具有一些缺點,濫用會造成數(shù)據(jù)庫及應用程序的維護困難。在數(shù)據(jù)庫操作中,可以通過關系、觸發(fā)器、存儲過程、應用程序等來實現(xiàn)數(shù)據(jù)操作。同時,規(guī)則、約束、默認值也是保證數(shù)據(jù)完整性的重要保障。如果對觸發(fā)器過分地依賴,那么勢必會影響數(shù)據(jù)庫的結構,同時增加了維護的復雜性。
對于觸發(fā)器,需要特別注意以下幾點:
1)觸發(fā)器在數(shù)據(jù)庫里以獨立的對象存儲。
2)存儲過程通過其他程序來啟動運行或直接啟動運行,而觸發(fā)器是由一個事件來啟動運行。即觸發(fā)器是當某個事件發(fā)生時自動地隱式運行。
3)觸發(fā)器被事件觸發(fā)。運行觸發(fā)器稱為觸發(fā)或點火(FIRING),用戶不能直接調用觸發(fā)器。
4)觸發(fā)器不能接收參數(shù)。
13.
COUNT(1)比COUNT(*)在執(zhí)行效率上要快嗎?正確答案:錯。COUNT(1)和COUNT(*)在執(zhí)行效率上是一樣的。COUNT()函數(shù)是Oracle中的聚合函數(shù),用于統(tǒng)計結果集的行數(shù)。其語法形式如下:
可以把COUNT的使用情況分為以下3類:
1)COUNT(1)、COUNT(*)、COUNT(常量)、COUNT(主鍵)、COUNT(ROWID)、COUNT(非空列)。
2)COUNT(允許為空列)。
3)COUNT(DISTINCT列名)。
下面分別從查詢結果和效率方面做個比較:
(1)結果區(qū)別
1)COUNT(1)、COUNT(*)、COUNT(ROWID)、COUNT(常量)、COUNT(主鍵)、COUNT(非空列)這幾種方式統(tǒng)計的行數(shù)是表中所有存在的行的總數(shù),包括值為NULL的行和非空行。所以,這幾種方式的執(zhí)行結果相同。這里的常量可以為數(shù)字或字符串,例如,COUNT(2)、COUNT(333)、COUNT('x')、COUNT('xiaomaimiao')。需要注意的是:這里的COUNT(1)中的“1”并不表示表中的第一列,它其實是一個表達式,可以換成任意數(shù)字或字符或表達式。
2)COUNT(允許為空列)這種方式統(tǒng)計的行數(shù)不會包括字段值為NULL的行。
3)COUNT(DISTINCT列名)得到的結果是除去值為NULL和重復數(shù)據(jù)后的結果。
4)“SELECTCOUNT("),COUNT(NULL)FROMT_COUNT_LHR;”返回0行。
(2)效率、索引
1)如果存在主鍵或非空列上的索引,那么COUNT(1)、COUNT(*)、COUNT(ROWID)、COUNT(常量)、COUNT(主鍵)、COUNT(非空列)會首先選擇主鍵上的索引快速全掃描(INDEXFASTFULLSCAN)。若主鍵不存在則會選擇非空列上的索引。若非空列上沒有索引則肯定走全表掃描(TABLEACCESSFULL)。其中,COUNT(ROWID)在走索引的時候比其他幾種方式要慢。通過10053事件可以看到這幾種方式除了COUNT(ROWID)之外,其他最終都會轉換成COUNT(*)的方式來執(zhí)行。
2)對于COUNT(COL1)來說,只要列字段上有索引則會選擇索引快速全掃描(INDEXFASTFULLSCAN)。而對于“SELECTCOL1”來說,除非列上有NOTNULL約束,否則執(zhí)行計劃會選擇全表掃描。
3)對于COUNT(列)來說,隨著列的偏移位置越大,COUNT(列)的速度越來越慢。在設計表時,把經(jīng)常訪問的列盡量設計在表的前幾列。
4)COUNT(DISTINCT列名)若列上有索引,且有非空約束或在WHERE子句中使用ISNOTNULL,則會選擇索引快速全掃描。其余情況選擇全表掃描。
14.
等待事件的分類?常見等待事件?正確答案:Oracle的等待事件主要可以分為兩類:空閑(Idle)等待事件和非空閑(Non-Idle)等待事件。
1)空閑等待事件是指Oracle正等待某種工作,在診斷和優(yōu)化數(shù)據(jù)庫的時候,不用過多注意這部分事件。
2)非空閑等待事件專門針對Oracle的活動,是指數(shù)據(jù)庫任務或應用運行過程中發(fā)生的等待,這些等待事件是在調整數(shù)據(jù)庫的時候需要關注與研究的。
通過如下的SQL語句可以查詢等待事件的類型:
一些常見的、重要的等待事件如下:
(1)數(shù)據(jù)文件I/O相關的等待事件
dbfilesequentialread、dbfilescatteredread、dbfileparallelread、directpathread、directpathwrite。
(2)控制文件I/O相關的等待事件
controlfileparallelwrite、controlfileseauentialread、controlfilesinglewrite。
(3)Redo日志文件I/O相關的等待事件
logfileparallelwrite、logfilesync、logfilesequentialread、logfilesinglewrite、switchlogfilecommand、logfileswitchcompletion、logfileswitch(clearinglogfile)、logfileswitch(checkpointincomplete)、logswitch/archive、logfileswitch(archivingneeded)。
(4)高速緩存區(qū)I/O相關的等待事件
dbfileparallelwrite、dbfilesinglewrite、writecompletewaits、freebufferwaits。
下表列出一些常見等待事件用以拋磚引玉,實際的數(shù)據(jù)庫管理中需要掌握和了解的等待事件非常多,也比較復雜,只需要記住一些常見的面試知識點,其他的等待事件需要在工作中慢慢積累。
除了上表中列舉出來的等待事件還有很多其他常見的等待事件,這里就不再列舉了,讀者可以關注作者的微信公眾號或博客,里面會有所有等待事件的詳細介紹。
15.
什么是ASMM和AMM?正確答案:ASMM(AutomaticSharedMemowManagement,自動共享內存管理)是Oracle10g引入的概念。通過使用ASMM,就不需要手工設置相關內存組件的大小,而只為SGA設置一個總的大小,Oracle的MMAN進程(MemoryManagerProcess,內存管理進程)會隨著時間推移,根據(jù)系統(tǒng)負載的變化和內存需要,自動調整SGA中各個組件的內存大小。ASMM的SGA包含的組件及對應參數(shù)見表。
在Oracle10g中,必須將STATISTICS_LEVEL參數(shù)設置為TYPICAL(默認值)或者ALL才能啟用ASMM功能,如果將其值設置為BASIC,那么會禁用很多新特性,比如像AWR、ASMM等。如果使用SQL*Plus來設置ASMM,那么必須先把SGA中包含的組件的值設置為0。通過設置SGA_TARGET參數(shù)為非零值來啟用ASMM功能。
可以通過以下SQL來計算SGA_TARGET的值:
設置SGA_TARGET的值,可以直接修改初始化參數(shù)文件后重啟數(shù)據(jù)庫,或者通過下面SQL命令進行修改:
示例如下:
在啟用ASMM后,Oracle會自動調整SGA內部組件大小。若再手動指定某一組件值,則該值為該組件的最小值。例如,手動設置SGA_TARGET=8G,SHARED_POOL_SIZE=1G,則ASMM在自動調整SGA內部組件大小時,保證SharedPool不會低于1G。當設置了SGA_TARGET參數(shù)后,Oracle將會收集SGA相關的統(tǒng)計數(shù)據(jù),并通過V$SGA_TARGET_ADVICE呈現(xiàn)出來,因此,可以根據(jù)這些指導SGA_TARGET做相關的調整,以達到最佳情況。
Oracle10g的ASMM實現(xiàn)了自動共享內存管理,但是具有一定的局限性。所以,在Oracle11g中,Oracle引入了AMM(AutomaticMemoryManagement,自動內存管理)的概念,實現(xiàn)了全部內存的自動管理。DBA可以僅僅通過設置一個目標內存大小的初始化參數(shù)(MEMORY_TARGET)和可選最大內存大小初始化參數(shù)(MEMORY_MAX_TARGET)就可以在大多數(shù)平臺上實現(xiàn)AMM。AMM可以使實例總內存保持相對穩(wěn)定的狀態(tài),Oracle基于MEMORY_TARGET的值來自動調整SGA和PGA的大小。如果內存發(fā)生變化,實例會自動在SGA和PGA之間做調整。若啟用了AMM功能,而SGA_TARGET和PGA_AGGREGATE_TARGET沒有顯式的被設置,則默認SGA_TARGET為MEMORY_TARGET的60%,PGA_AGGREGATE_TARGET為MEMORY_TARGET的40%。
MEMORY_TARGET是動態(tài)初始化參數(shù),可以隨時修改該參數(shù)的值而不用重啟數(shù)據(jù)庫。MEMORY_MAX_TARGET作為一個內存上限值,是一個靜態(tài)參數(shù),它是MEMORY_TARGET可以被配置的最大值。
當LOCK_SGA初始化參數(shù)的值設置為TRUE時,不能啟用AMM,該參數(shù)的值默認為FALSE。
如果在創(chuàng)建數(shù)據(jù)庫的時候未啟用AMM,那么可以在建庫后啟用它,啟用AMM需要重啟數(shù)據(jù)庫,具體步驟如下:
1)查詢SGA_TARGET和PGA_AGGREGATE_TARGET的值,從而確定MEMORY_TARGET的最小值。
2)確定白系統(tǒng)啟動以來PGA的最大值,單位為bytes。
3)通過以下方法來計算出SGA_TARGET的最大值。
例如:在這里,SGA_TARGET的值為1648M,PGA_AGGREGATE_TARGET的值為409M,PGA的最大值為248586240/1024/1024=237M,所以,MEMORY_TARGET的值至少為1648+409=2057M。
4)設置系統(tǒng)參數(shù)啟用AMM。
另外需要說明的一點是,使用AMM經(jīng)常出現(xiàn)的一個錯誤是“ORA-00845:MEMORY_TARGETnotsupportedonthissystem”。
這個錯誤原因是操作系統(tǒng)不支持MEMORY_TARGET參數(shù)或/dev/shm的大小設置不正確。解決方法就是將/dev/shm的值增大,至少需要大于數(shù)據(jù)庫參數(shù)MEMORY_MAX_TARGET的值。修改步驟如下:
再次啟動數(shù)據(jù)庫就可以正常啟動了。
由于AMM不支持HugePage,而ASMM支持HugePage,所以,在生產(chǎn)庫上強烈推薦使用ASMM。有關ASMM和AMM的區(qū)別見表。
16.
本地管理表空間(LMT)和字典管理表空間(DMT)的特點有哪些?正確答案:在表空間中以區(qū)為單位分配空間。在創(chuàng)建表空間后可使用本地管理表空間(LMT)或字典管理表空間(DMT)來跟蹤空閑空間和已用空間。
字典管理表空間(DictionaryManagedTablespace,DMT),它是Oracle8i及以前版本使用的一種表空間管理模式,不過在Oracle8i及以后的版本中仍然保存有該特性。DMT是通過數(shù)據(jù)字典管理表空間的空間使用(其實是管理區(qū))。每當分配或取消分配區(qū)后,Oracle服務器會更新數(shù)據(jù)字典中的相應表。用于管理的兩個數(shù)據(jù)字典表分別是:UET$(UsedExtents)和FET$(FreeExtents)。DMT是為了實現(xiàn)向后兼容而提供的,建議使用本地管理的表空間。
本地管理表空間(LocallyManagedTablespace,LMT)是從Oracle8i出現(xiàn)的一種新的表空間的管理模式,通過位圖來管理表空間的空間使用(其實是管理區(qū))。位圖中的每個位都對應于一個塊或一組塊。Oracle在分配區(qū)或釋放區(qū)后可以重新使用,Oracle服務器通過更改位圖值來顯示塊的新狀態(tài)。LMT在Oracle9i及以后版本中成了默認選項。
表空間管理模式的查詢如下,其中EXTENT_MANAGEMENT列表示表空間的管理模式:
將字典管理的表空間轉換為本地管理:
將本地管理的表空間轉換為字典管理:
17.
什么是專用服務器和共享服務器?正確答案:在連接到Oracle數(shù)據(jù)庫的時候,可以有兩種連接模式,一種稱為專用服務器連接(DedicatedServer),另外一種稱為共享服務器連接(SharedServer)。下面將分別講解這兩種連接方式的不同點。
專用服務器:每次在對Oracle進行訪問的時候,Oracle服務器的Listener會得到這個訪問請求,然后會為這個訪問創(chuàng)建一個新的進程來進行服務。所以說,對于每一個客戶端的訪問,都會生成一個新的進程進行服務,是一種類似一對一的映射關系。這種連接模式的一個很重要的特點就是UGA(UserGlobalArea,用戶全局區(qū))是存儲在PGA(ProgramGlobalArea,程序全局區(qū))中的,這個特性也很好說明了當前用戶的內存空間是按照進程來進行分配的。專用服務器連接模式是Oracle默認的連接模式。
共享服務器:也稱為多線程服務器(Multi-ThreadedServer,MTS)。若采用共享服務器模式的話,則在數(shù)據(jù)庫初始化的時候就會創(chuàng)建一批服務器連接的進程,然后把這些連接進程放入一個連接池來進行管理。初始化的池中的進程數(shù)量在數(shù)據(jù)庫初始化建立的時候是可以手動設置的。在連接建立的時候,Listener首先接收到客戶端的建立連接的請求,然后Listener去生成一個稱為調度器(Dipatcher)的進程與客戶端進行連接。調度器把客戶端的請求放在SGA(SystemGlobalArea,系統(tǒng)全局區(qū))的一個請求隊列中,然后在共享服務器連接池中查找有無空閑的連接,然后讓這個空閑的服務器進行處理。處理完畢以后再把處理結果放在SGA的相應隊列中。調度器通過查詢相應隊列,得到返回結果,再返回給客戶端。這種連接模式的優(yōu)點在于服務器進程的數(shù)量可以得到控制,不大可能出現(xiàn)因為連接數(shù)過多而造成服務器內存崩潰。但是由于增加了復雜度以及請求相應隊列,可能在性能上有所下降。
如果在前端使用了Weblogic的連接池,那么在數(shù)據(jù)庫級別就沒有必要再使用共享服務器了,因為這時的用戶連接已經(jīng)在Weblogic層面上得到了控制。其實專用服務器和共享服務器是可以并存的,即使使用了共享服務器,某些管理操作也是必須在專用服務器模式下來做的,比如STARTUP或SHUTDOWN。
(1)啟用共享服務器
要切換到共享模式,可以使用以下步驟:
1)設置初始化參數(shù)SHAREDSERVERS大于0,然后重啟數(shù)據(jù)庫即可啟動共享模式,SQL如下:
其中,SHARED_SERVERS指定了當實例啟動的時候共享服務器進程啟動的數(shù)量。如果這個參數(shù)的值為0,那么表示數(shù)據(jù)庫沒有啟動共享服務模式。這個參數(shù)是配置共享服務器必需的,而且只有這個參數(shù)是必需的。MAX_SHARED_SERVERS是Oracle在同一個時刻最大能夠使用的共享服務器進程數(shù)量。如果SHARED_SERVERS大于MAX_SHARED_SERVERS,那么Oracle會以SHARED_SERVERS參數(shù)的值覆蓋MAX_SHARED_SERVERS。
2)設置DISPATCHERS參數(shù),可以采用下面的方法設置:
其中,“PROTOCOL=TCP”表示的是協(xié)議,“SERVICE=lhrdbXDB”指定要采用共享服務器模式的服務名稱。使用上面的模式指定只啟動某個服務的共享模式,如果要設置所有服務都使用共享模式,則設置為:
3)客戶端的tnsnames.ora的文件中,在CONNECT_DATA設置一項中增加“(server=shared)”一項,即可使用共享服務器連接,如下:
其中,SERVICE_NAME的值可以通過命令“l(fā)snrctlservices<listenername>”來查看,如下:
如果服務器端沒有啟動共享服務器模式,而客戶端使用shared方式連接的話,那么會出現(xiàn)錯誤提示:“ORA-12520:TNS:監(jiān)聽程序無法找到需要的服務器類型的可用句柄”。
如果同時把SHARED_SERVERS和MAX_SHARED_SERVERS都設置成0,那么共享服務器將關閉。
(2)判斷會話的連接模式
可以從V$SESSION視圖的SERVER列里查看:
若顯示的結果中有NONE或SHARED,則說明當前啟動了共享服務器模式。其中,狀態(tài)為NONE的會話表示當前共享服務器進程沒有任務處理,若進程正在執(zhí)行某些任務則會表現(xiàn)為SHARED狀態(tài)。如果只顯示有DEDICATED,則不能說明服務器就一定工作在專用服務器下面,此時只能說明有可能啟動了共享模式,但是無連接。
此外,還可以通過視圖V$SHARED_SERVER、V$DISPATCHER及V$CIRCUIT視圖查詢是否啟用了共享服務器連接。若V$SHARED_SERVER有記錄,且STATUS字段為“WMT(COMMON)”,則說明啟動共享;若STATUS為TERMINATED或者無記錄,則說明沒有啟動共享服務器。V$DISPATCHER有無記錄都不能說明啟動共享服務器,只能說明是配置了DISPATCHERS參數(shù)。V$CIRCUIT有記錄說明當前有使用共享模式的連接,無記錄則不能判定服務器模式。其實通過命令“l(fā)snrctlservices<listenername>”也可以判斷是否啟用了共享服務器連接。
當服務器采用專用服務器模式時,客戶端只能使用專用模式連接,也就是在CONNECT_DATA數(shù)據(jù)中只能使用“SERVER=DEDICATED”。當服務器采用共享服務器模式時,客戶端可以選擇建立共享連接或是專用連接,只要在CONNECT_DATA中指定“SERVER=DEDICATED”或“SERVER=SHARED”。
18.
在Oracle中,有哪些常用的分析函數(shù)?正確答案:在分析函數(shù)出現(xiàn)以前,實現(xiàn)相同的功能必須使用自聯(lián)查詢、子查詢或者內聯(lián)視圖,甚至需要復雜的存儲過程來實現(xiàn)。有了分析函數(shù)后,只要一條簡單的SQL語句就可以實現(xiàn)數(shù)據(jù)分析了,而且在執(zhí)行效率方面也有相當大的提高。Oracle的分析函數(shù)主要用于報表開發(fā)和數(shù)據(jù)倉庫。分析函數(shù)的功能強大,可以用于SQL語句的優(yōu)化,在某些情況下,能達到事半功倍的效果。
分析函數(shù)的一般格式是:函數(shù)名(參數(shù)列表)OVER([PARTITIONBY字段名或表達式][ORDERBY字段名或表達式]),其中OVER()部分稱為開窗函數(shù),它是可以選填的。開窗函數(shù)指定了分析函數(shù)工作的數(shù)據(jù)窗口大小,這個數(shù)據(jù)窗口大小可能會隨著行的變化而變化。分析函數(shù)的寫法比較復雜,下面將講解幾個常用的分析函數(shù)。
(1)RANK()分析函數(shù)該函數(shù)的作用是根據(jù)ORDERBY子句中表達式的值,從查詢返回的每一行中,計算它們與其他行的相對位置。該函數(shù)的結果是不連續(xù)的,如果有4個人,其中有3個是并列第1名,那么最后的排序結果為:1114。RANK()分析函數(shù)可以用于Top-N查詢中。
需要注意的是,除了ORDERBY子句的運算外,分析函數(shù)在SQL語句中將會最后執(zhí)行。因此,分析函數(shù)只能應用于SELECT的列或ORDERBY子句中。
還有一個類似的函數(shù)為:DENSE_RANK()OVER(ORDERBY列名排序),它的排序結果是連續(xù)的,如果有4個人,其中有3個是并列第1名,那么最后的排序結果為:1112。
如果不想并列排序,那么可以使用ROW_NUMBER分析函數(shù)。
(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣西西林縣苗族民歌之分析研究
- 公司紙巾采購合同范本
- 會議合同范本1
- 公司買賣車合同范本
- 農(nóng)村個人購房合同范本
- 2025年度智慧城市照明系統(tǒng)建設項目分包合同模板
- 作品授權合同范本
- 修車廠招工合同范例
- 圓模三角帶行業(yè)深度研究報告
- 勞務合同范本超齡
- 農(nóng)用拖拉機考試題庫
- GJB438C模板-軟件開發(fā)計劃(已按標準公文格式校準)
- 2023年政府采購評審專家考試真題及答案
- 云端數(shù)據(jù)加密與密鑰管理解決方案
- 毒麻藥品試題答案
- 《公路橋涵養(yǎng)護規(guī)范》(5120-2021)【可編輯】
- 醫(yī)療器械專業(yè)知識培訓課件
- 傳統(tǒng)體育養(yǎng)生學
- DB4401∕T 33-2019 電梯托管標準化管理規(guī)范
- 醫(yī)院物業(yè)(保潔)技術服務投標方案
- 松原市人民政府關于印發(fā)松原市招商引資服務公司組建工作實施方案的通知
評論
0/150
提交評論