数据库面试题目经典大全
生活随笔
收集整理的這篇文章主要介紹了
数据库面试题目经典大全
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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語句等,另外還可分析得到一些必要的回滾語句。所以,該工具特別適用于調試、審計或者回滾某個特定的事務。
? ? 事務是指一個工作單元,它包含了一組數據操作命令,并且所有的命令作為一個整體一起向系統提交或撤消請求操作,即這組命令要么都執行,要么都不執行。例如,網上購物的交易過程至少包括以下幾個步驟的操作:
(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語句等,另外還可分析得到一些必要的回滾語句。所以,該工具特別適用于調試、審計或者回滾某個特定的事務。
總結
以上是生活随笔為你收集整理的数据库面试题目经典大全的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【ArcGIS遇上Python】Pyth
- 下一篇: 将一个正方形分成4个大小一样的小正方形,