1. 程式人生 > >資料庫面試題目經典大全

資料庫面試題目經典大全

1、事務
    事務是指一個工作單元,它包含了一組資料操作命令,並且所有的命令作為一個整體一起向系統提交或撤消請求操作,即這組命令要麼都執行,要麼都不執行。例如,網上購物的交易過程至少包括以下幾個步驟的操作:
(1)更新客戶所購商品的庫存資訊。
(2)儲存客戶付款資訊。
(3)生成訂單井且儲存到資料庫中。
(4)更新使用者相關資訊,如購物數量等 。
    在正常的情況下,這些操作都將順利進行,最終交易成功,與交易相關的所有資料庫資訊也成功地更新。但是,如果遇到突然掉電或是其他意外情況,導致這一系列過程中任何一個環節出了差錯,如在更新商品庫存資訊時發生異常、顧客銀行賬戶餘額不足等,都將導致整個交易過程失敗。而一旦交易失敗,資料庫中所有資訊都必須保持交易前的狀態不變,比如最後一步更新使用者資訊時失敗而導致交易失敗,那麼必須保證這筆失敗的交易不影響資料庫的狀態,即原有的庫存資訊沒有被更新、使用者也沒有付款、訂單也沒有生成。否則,資料庫的資訊將會不一致,或者出現更為嚴重的不可預測的後果,資料庫事務正是用來保證這種情況下交易的平穩性和可預測性的技術。
    事務必須滿足4個屬性即原子性(atomicity)、一致性(consistency )、隔離性(isolation)、永續性( durability),即ACID 4種屬性。
2、什麼是儲存過程,與函式有什麼區別?

    SQL語句執行的葉候要先編譯然後再被執行。在大型資料庫系統中,為了提高效率,將為了完成特定功能的SQL語句集進行編譯優化後,儲存在資料庫伺服器中,使用者通過指定的儲存過程的名字來呼叫執行。儲存程是一組予編譯的SQL語句。
    使用儲存過程可以增強SQL語言的功能和靈活性,由於可以用流程控制語句編寫儲存過程,有很強的靈活性,所以可以完成複雜的判斷和運算,且可以保證資料的安全性和完整性,同時,儲存過程可以使沒有許可權的使用者在控制之下間接地存取資料庫,也保證了資料的安全。但儲存過程不等於函式,兩者雖然本質上沒有區別,但具體而言有以下幾個方面的區別:
   (1)儲存過程一般是作為個獨立的部分來執行的,而函式可以作為查詢語句的一個部分來呼叫。由於函式可以返回一個物件,因此它一般在查詢語句中位於From關鍵字的後面。
   (2)一般而言,儲存過程實現的功能較複雜,而函式實現的功能針對性比較強。
   (3)函式需要用括號包住輸入的引數,且只能返回一個值或表物件,儲存過程可以返回多個引數。
   (4)函式可以嵌入在SQL中使用,可以在select中呼叫,儲存過程不行。
   (5)函式不能直接操作實體表,只能操作內建表
   (6)儲存過程在建立時即在伺服器上進行了編譯,執行速度更快。
3、什麼是死鎖?

    在作業系統中有若干程式併發執行,它們不斷地申請、釋放資源,在此過程中,由於爭奪資源而處於無限期的等待狀態,造成程式無法繼續執行,若無外力作用,它們都將無法推進下去,這時稱系統處於死鎖狀態或系統產生了死鎖。此時便只能通過外來打破這種狀態。
    產生死鎖的原因有以下3點。
    (1)首先,系統資源不足,在系統中常常有多個程序共享資源的情況,如印表機,這些資源在同一時刻只能被一個程序使用。當資源數目不能滿足程序時,便可能因為搶奪資源產生死鎖。    (2)其次,程序執行推進順序不對,程序在執行中具有非同步性,當程序推進順序不當時,便產生死鎖。例如,程序P1和P2,兩程序同時具有R1和R2兩個資源時,才能執行,當兩程序併發執行時,若P1保持資源R1,P2保持資源R2,雙方都在等待對方釋放資源,此時便發生了死鎖。
    (3)最後,資源分配不當,如果系統資源充足,程序的資源請求都能得到滿足,死鎖的可能性會被大大降低,而程序推進順序與速度不同,也可能會產生死鎖。總的來說,產生死鎖有4個必要條件:1) 互斥,每個資源每次只能被一個程序使用;2)請求與保持等待,一個程序因請求資源而被阻塞時,對已獲得的資源保持不放;3)不可剝奪,程序已獲得的資源,在未使用完之前,不能強制剝奪;4)環路等待,若干程序之間形成首尾相接的等待資源關係。
    所以,為了預防死鎖,就要打破產生死鎖的4個條件中的一個或多個,網此需要最大限度地增加系統資源,合理地安排程序的順序井確定合理的分配資源的演算法。避免死鎖是在資源的動態分配過程中,採取有效的方法防止系統進入不安全狀態,達到預防死鎖的目的,其中最具代表性的方法就是銀行家演算法。
4、什麼是共享鎖?互斥鎖?

    在資料庫中,鎖主要是對資料進行讀/寫的一種保護機制,從資料庫系統的角度來看,一般可以將鎖分為共享鎖和互斥鎖。共享鎖簡稱S鎖,也叫讀鎖。用於不更改或不更新資料的操作(只讀操作),如select語句。如果事務T對資料A加上共享鎖後,則其他事務只能對A再加共享鎖,不能加排他鎖。共享鎖可阻止其他併發執行的程式獲取重疊的獨佔鎖定,但是允許該程式獲取重疊的共享鎖定。其他使用者可以獲取共享鎖鎖定的資源,但是不能進行修改該共事鎖。在執行select命令時,SQL Server 通常會對物件進行共享鎖鎖定。若事務T對資料D加S鎖,則其他事務只能對D加S 鎖,而不能加X鎖,直至T釋放D上的S鎖;一般要求在讀取資料前要向該資料加共享鎖,所以共享鎖又稱為讀鎖。通常加共享鎖的資料頁被讀取完畢後 ,共享鎖就會立即被釋放。互斥鎖簡稱X鎖,也叫排他鎖,用於資料修改操作,如insert、update或delete。確保不會同時對同一資源進行多重更新。為了保證資料操作的完整性,引入了互斥鎖。用互斥鎖來保證在任意時刻,只能有一個執行緒訪問物件。若事務T對資料D加X鎖,則其他任何事務都不能再對D加任何型別的鎖,直至T釋放D上的X鎖;一般要求在修改資料前要向該資料加排他鎖,所以排他鎖又稱為寫鎖。
    而對於鎖的使用,也有一定的限制,需要遵守兩個事項:1)先鎖後操作;2)事務結束之後必須解鎖。
5、什麼是CHECK約束?
    CHECK約束是指限制表中某一列或某些列中可接受的資料值或資料格式,它用於限制列的取值範圍,使用形式為:CHECK(約束表示式),如果是對單列定義CHECK 約束,那麼該列只允許特定的值;如果是對一個表定義CHECK約束,那麼此約束會在特定的列中對值進行限制。例如,對於一個員工資訊表,給員工的年齡屬性添加了一個約束,即年齡必須大於0且小於等於120,那麼使用者在輸入年齡的時候,就必須遵守該約束,輸入負數或者121就無法輸入。
6、什麼是試圖
    檢視是由從資料庫的基本表中選取出來的資料組成的邏輯視窗,不同於基本表。它是一個虛表,在資料庫中,存放的只是檢視的定義而己,不存放檢視包含的資料項,這些專案仍然存放在原來的基本表結構中。
    檢視的作用非常多,主要有以下幾點:首先可以簡化資料查詢語句;其次可以使使用者能從多角度看待同一資料;然後,通過引入檢視,可以提高資料的安全性;最後,檢視提供了一定程度的邏輯獨立性等 。
    通過引入檢視機制,使用者可以將注意力集中在其關心的資料上而非全部資料,這樣就大大提高了使用者效率與使用者滿意度,而且如果這些資料來源於多個基本表結構,或者資料不僅來自於基本表結構,還有一部分資料來源於其他檢視,井且搜尋條件又比較複雜時,需要編寫的查詢語句就會比較繁瑣,此時定義檢視就可以便資料的查詢語句變得簡單可行。定義檢視可以將表與表之間複雜的操作連線和搜尋條件對使用者不可見,使用者只需要簡單地對一個檢視進行查詢即可,所以增加了資料的安全性,但是不能提高查詢的效率。
7、什麼是觸發器?
    觸發器是一種特殊型別的儲存過程,它由事件觸發,而不是程式呼叫或手工啟動。當資料庫有特殊自操作時,對這些操作由資料庫中的事件來觸來自動完成這些SQL語句。使用觸發器可以月來保證資料的有效性和完整性,完成比約束更復雜的資料約束。根據SQL語句的不同,觸發器可分為兩類:DML觸發器和DLL觸發器。
    DML觸發器是當資料庫伺服器發生資料操作語言事件時執行的儲存過程,有After和Instead Of兩種觸發器。After觸發器被啟用觸發是在記錄改變之後進行的一種觸發器。Instead Of觸發器是在記錄變更之前,去執行觸發器本身所定義的操作,而不是執行原來SQL語句裡的操作。DLL觸發器是在響應資料定義語言事件時執行的儲存過程。
    觸發器的主要作用表現在以下幾個方面:
   (1)增加安全性。
   (2)利用觸發器記錄所進行的修改以及相關資訊,跟蹤使用者對資料庫的操作,實現審計。
   (3)維護那些通過建立表時的宣告約束不可能實現的複雜的完整性約束以及對資料庫中特定事件進行監控與響應。
   (4)實現複雜的非標準的資料庫相關完整性規則、同步實時地複製表中的資料。
   (5)觸發器是自動的,它們在對錶的資料做了任何修改之後就會被啟用。例如,可以自動計算資料值,如果資料的值達到了一定的要求,則進行特定的處理。以某企業財務管理為例,如果企業的資金鍊出現短缺,並且達到某種程度時,則傳送警告資訊。
    引申:觸發器分為事前觸發和事後觸發,兩者有什麼區別?語旬組觸發和行組觸發有什麼區別?
    事前觸發發生在事件發生之前驗證一些條件或進行有一些準備工作;事後觸發器發生在事件發生之後,做收尾工作,保證事務的完整性。而事前觸發可以獲得之前和新的欄位值。語句級觸發器可以在語句執行之前或之後執行,而行級觸發在觸發器所影響的每一行觸發一次。
8、什麼是索引?
    索引是一種提高資料庫查詢速度的機制,它是一個在資料庫的表或檢視上按照某個關鍵欄位的值,升序或降序排序建立的物件。當用戶查詢索引欄位時,它可以快速地執行檢索操作,藉助索引,在執行查詢的時候不需要掃描整個表就可以快速地找到所需要的資料。索引是與表或檢視關聯的磁碟上結構,即對錶中列值排序的一種結構 ,可以加快從表或檢視中檢索行的速度,執行查詢時不必掃描整個表就能更快速的訪問資料庫中的資訊。
    一條索引記錄包含鍵值和邏輔指標。建立索引時,系統分配一個索引頁。在表中插入一行 資料,同時也向該索引頁中插入一行索引記錄。索引記錄包含的索引欄位值比真 實資料量小,節省了空間。
    索引的型別有聚焦索引和非聚焦索引。聚集索引是表中的行的物理順序與鍵值的邏輯順序一樣 ,一個表只能有一個聚焦索引。與非聚焦索引相比,聚焦索引一般情況下可以獲得更快的資料訪問速度。非聚焦索引是資料儲存與索引儲存不在同一個地方。索引中有指標,該指標指向資料的儲存位置,索引中的專案按索引之前的順序儲存,而表中的資訊技另一種順序儲存。
    建立索引可以大大提高系統的效能,主要表現在以下幾個方面:1)通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性;2)通過索引,可以大大加快資料的檢索速度;3)通過索引可以加速表和表之間的連線,從而有效實現資料的參考完整性;4)在使用分組和排序子句進行資料檢索時,可以顯著減少查詢中分組和排序的時間;5)通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的效能。
    索引可以有效地提高查詢效率,那為什麼不將所有的列都建立索引呢?其實索引儘管可以帶來方便,但並非越多越好,過多的索引也會帶來許多不利的問題。首先,建立索引和維護索 引要耗費時間、空間。當資料量比較小時,這種問題還不夠突出:而當資料量比較大時,這種 缺陷會比較明顯,效率會非常低下。其次,除了資料表 佔資料空間之外,每一個索引還需要佔用一定的物理空間。如果要建立聚簇索引,那麼需要的空間就會更大,從而造成不必要的空間浪費。最後,當對錶中的資料進行增加、刪除和修改的時候,索引也要動態地維護,從而降低了資料的維護速度。
9、什麼是回滾?
    為了保證在應用程式、資料庫或系統出現錯誤後,資料庫能夠被還原,以保證資料庫的完整性 ,所以需要進行回滾。回滾(rollback)就是在事務提交之前將資料庫資料恢復到事務修改之前資料庫資料狀態。
    需要注意回樓與撤銷的區別。回滾是指將資料庫的狀態恢復到執行事務之前的狀態,其中可能會使用UNDO日誌進行回漆。撤銷是一種記錄日誌的方式,並不是主要服務於事務回滾,而是主要用於系統從故障中恢復。例如,系統突然斷電,系統要根據UNDO日誌對未完成的事務進行處理,保證資料庫的狀態為執行這些事務前的狀態。
10、資料備份有哪些種類?
    在網路執行與維護過程中,經常有一些難以預料的因素會導致資料的丟失,如硬體損壞、 操作失誤等,而且丟失的資料通常又會對企業的業務產生非常不利的影響,所以必須不定期地對在據進行及時備份,以便在災難發生後能夠迅速地恢復資料 。資料備份就是儲存資料的備份,目的是為了預防災難造成的資料損失。它一般分為完全備份、差異備份、事務日誌備份 、增量備份幾大類。
    (1)完全備份是將資料庫中的全部資訊進行備份,它是恢復的基線,在進行完全備份時,不但備份資料庫的資料檔案、日誌檔案,還需要備份檔案的儲存位置資訊以及資料庫中的全部物件和相關資訊。在對資料庫進行完全備份時,所有未完成 的事務或發生在備份過程 中的事務部將 被忽略,如果使用完全資料庫備份型別,那麼從開始備份到開始恢復這段時間內發生的任何針對資料庫的修改都將無法恢復。所以,只有在一定的要求或條件下才使用這種備份型別。
    (2)差異備份是備份從最近的完全備份之後對資料所作的修改,它以完全備份為基準點,備份完全各份之後變化了的資料檔案、日誌檔案以及資料庫中其他被修改的內容。差異備份耗費的時間比完全備份少,但也會佔用一些時間,同完全備份一樣,差異備份過程中也允許使用者訪問資料庫井對資料進行操作,並且在差異備份過程中會把這些操作也一起備份起來。
    (3)事務日誌備份是備份從上次備份之後的日誌記錄,而且在預設情況下,事務日誌備份完成後要截斷日誌,事務日誌備份記錄了使用者對資料進行的修改操作。隨著時間的推移,日誌中的記錄數會越來越多,容量有時比資料庫備份大,這樣勢必會佔滿整個磁碟空間。因此,為了避免這種情況的發生,必須定期地將日誌記錄中不必要的記錄清除掉,以節省空間。清除掉無用日誌記錄的過程叫做截斷日誌。
    (4)增量備份是針對於上一次備份的,備份上一次備份後所有發生變化的檔案。在增量備份過程中,只備份有標記的選中的檔案和資料夾,它清除標記,即備份後標記檔案。
    例如,對於資料庫而言 ,按照生活規律,一般應該在星期一進行完全備份,在星期二至星期五進行差異備份。如果在星期五資料被破壞了,則只需要還原星期一完全的備份和星期四的差異備份。這種策略備份資料需要較多的時間,但還原資料使用較少的時間。
    再例如,在星期一進行完全備份,在星期二至星期五進行增量備份。如果在星期五資料被破壞了,則需要還原星期一正常的備份和從星期二至星期五的所有增量備份。這種策略備份數 據需要較多的時間,但還原資料使用較少的時間。
    與資料備份相對應的就是資料恢復,資料恢復是指將資料恢復到事故之前的狀態,可以將其看成資料備份操作的逆過程。資料備份是資料恢復的前提,資料恢復是資料備份的目的,無法恢復的資料備份是沒有任何意義的。
11、什麼是遊標?
    在資料庫中,遊標提供了一種對從表中檢索出的資料進行操作的靈活手段。它實際上是一種能從包括多條資料記錄的結果集中每次提取一條記錄的機制。
    遊標總是與一條SQL選擇語句相關聯,因為遊標由結果集(可以是零條、一條或由相關的選擇語句檢索出的多條記錄)和結果集中指向特定記錄的遊標位置組成。當決定對結果集進行處理時,必須宣告一個指向該結果集的遊標。
    遊標允許應用程式對查詢語句select返回的行結果集中每一行進行相同或不同的操作,而不是一次對整個結果集進行同一種操作。它還提供對基於遊標位置而對錶中資料進行刪除或更新的能力。而且,正是遊標把作為面向集合的資料庫管理系統和麵向行的程式設計兩者聯絡起來,使兩個資料處理方式能夠進行溝通。
    遊標的優點有以下兩個方面的內容:
(1)在使用遊標的表中,對行提供刪除和更新的能力。
(2)遊標將面向集合的資料庫管理系統和麵向行的程式設計連線了起來。
12、併發環境下如何保證資料的一致性?
    併發一般是指多使用者間時訪問相同的資料。資料一致性是指系統中每個使用者都能夠取得具備一致性的資料,同時還能夠看到自己或其他使用者所提交的事務對資料的修改。
    在併發環境下,一般可以採用多種機制來保證資料的一致性。例舊,Oracle系統提供的事務級的一致性、行級鎖、表級鎖等。下面只介紹行級鎖。     
    提交讀和序列性事務都使用行級鎖,都會在試圖修改一個沒有提交的並行事務更新的行時的產生等待。第二個事務等待其他事務提交或者撤銷來釋放它的鎖,才能更新給定的行。不管等待的是什麼級別的隔離事務,若其他事務回滾了,都可以對以前鎖定的行進行修改。
13、如果資料庫日誌滿了會出現什麼情況?
    日誌檔案(Log File)記錄所裝對資料庫資料的修改,主要是保戶資料庫以防止故障,以及複數據時使恢復用。其特點如下:
   (1)每一個數據庫至少包含兩個日誌檔案組。每個日誌檔案組至少包含兩個日誌檔案成員;
   (2)日誌檔案組以迴圈方式進行寫操作;
   (3)每一個日誌檔案成員對應一個物理檔案。
    通過日誌檔案來記錄資料庫事務可以最大限度地保證資料的一致性與安全性,但一旦資料庫中日誌滿了,就只能執行查詢等讀操作,不能執行更改、備份等操作。其原因是任何寫操作都要記錄日誌,也就是說基本上處幹不能使用的狀態。
14、如何判斷誰往資料庫中插入了一行資料?
    可以通過以下3種方法來達到這個目的:事先開啟審計功能、表上建立觸發器或者檢視logmnr等。
   (1)審計功能。
    先設定audit_trail引數,決定審計結果的儲存地點,然後執行audit insert on schema.table_name whenever successful;當有執行insert 操作的動作後,根據 audit_trail引數到相應位置去看審計結果即可。
   (2)觸發器。
    create or replace trigger tgname
    after insert
    on tbname  →判斷此表是否被插入記錄
    for each row
    begin
      insert into ta(日期) values(sysdate);
      commrt;
    end; 
    只需要將程式碼中的bname換成實際的表的名稱即可。需要注意的是,建立觸發器實質上也是審計,只是它是基於值的審計比資料庫審計慢。
   (3)通過logmnr日誌檢視。
    logmnr是Oracle公司提供的分析工具,該工具輕巧實用,使用該工具可以輕鬆獲得Oracle重作日誌檔案 (歸檔日誌檔案)中的具體內容,而且該工具可以分析出所有對於資料庫操作的 DML(insert、update、delete等)語句、DDL語句等,另外還可分析得到一些必要的回滾語句。所以,該工具特別適用於除錯、審計或者回滾某個特定的事務。