Oracle資料庫相關經典面試題

  • 2019 年 10 月 5 日
  • 筆記

金九銀十的面試季節,最近我會多發一些面試題相關的文章,因為墨白也要開始找工作了

大家一起加油哈 ! ! !

  • oracle下有自動增長類型的欄位嗎?若無,如何實現自增長的功能 ?

答∶ 沒有,實現自增長需要序列與DML觸發器的配合。

  • 有哪幾種事務隔離級別,他們都什麼區別?

答∶ ORACLE中有兩種事務 只讀事務與讀寫事務。隔離級別 未提交讀,提交讀,可重複讀,串列讀,ORACLE支援提交讀與串列讀,默認隔離級別為提交讀。

  • 實例與資料庫的關係 ?

答∶ 實例管理一個資料庫的記憶體空間與一組進程,一個實例必須對應一個資料庫,一個資料庫起碼包含一個實例。

  • 事務的理解,如事務的特點,oracle中何時開始,何時結束?

答∶ ORACLE事務在執行第一條可執行的SQL語句時開始,到一條COMMIT、ROLLBACK語句或退出資料庫時事務結束。

利用ROLLBACK語句可以在COMMIT命令前隨時撤消或回退一個事務。可以回退整個事務,也可以會退部分事務,但是不能回退一個已經被提交的事務。

回退部分事務的ROLLBACK命令為:ROLLBACK to savepoint

存儲點名:存儲點是用戶放入事務中的標記,用來表示一個可被回退的位置。存儲點通過在事務中放入一個SAVEPOINT命令而被插入。

該命令的語法是:SAVEPOINT 存儲點名如果在ROLLBACK語句中沒有給出存儲點名,則整個事務被回。

  • 實例的理解,與資料庫的對應關係

答∶ Oracle是用實例來進行資料庫管理的,實例在用戶和orale資料庫之間充當中間層的角色。每當在伺服器上啟動資料庫時,就在記憶體中創建一個Oracle實例,即Oracle為資料庫分配記憶體和創建並啟動一個或多個Oracle進程,然後由實例載入並打開資料庫,最後由這個實例來訪問和控制硬碟中的數據文件。

  • 觸發器中能用COMMIT,為什麼?

答∶ 在觸發器中不能使用COMMIT;等事務控制語句。因為觸發器是事務觸發的如果有事務控制語句就會影響到觸發它的事務。即連帶觸發它的語句之前的已經完成的沒有提交的語句都要受到影響。這是會影響到數據的一致性的

  • 解釋函數,存儲過程,包

答∶ 都是命名塊,函數與過程是pl/sql程式碼的集合,通常是為了完成一個業務,過程可以不返回任何值,但函數必須有返回值。包是為了完成某個完整功能的一組函數與過程的集合。

  • 比較truncate和delete命令?

答∶ 兩者都可以用來刪除表中所有的記錄。區別在於:truncate是DDL(data defining language數據定義語言),不需要rollback segment(處理事務回滾操作) 而Delete是DML(data manufacturing language數據操作語言)操作,需要rollback segment(處理事務回滾操作)且花費較長時間。

  • Oracle 悲觀鎖和樂觀鎖

答∶ 悲觀鎖是對數據的衝突採取一種悲觀的態度,假設數據肯定會衝突,在數據開始讀取的時候就把數據鎖定住。樂觀鎖就是認為數據一般情況下不會造成衝突,只有在數據進行提交更新的時候,才會正式對數據的衝突與否進行檢測,如果發現衝突了,則讓用戶返回錯誤的資訊,讓用戶決定如何去做。悲觀鎖是通過在sql語句上加入 for update,樂觀鎖可以通過增加一列version或者timestamp在應用程式中實現,Hibernate採用樂觀鎖的版本戳。

  • 索引的作用?和它的優點缺點是什麼?

答∶ 索引就一種特殊的查詢表資料庫的搜索引擎可以利用它加速對數據的檢索。它很類似與現實生活中書的目錄不需要查詢整本書內容就可以找到想要的數據。索引可以是唯一的創建索引允許指定單個列或者是多個列。缺點是它減慢了數據錄入的速度同時也增加了資料庫的尺寸大小。

  • 觸發器分為事前觸發和事後觸發,這兩種觸發有和區別。語句級觸發和行級觸發有何區別?

答∶ 事前觸發器運行於觸發事件發生之前,而事後觸發器運行於觸發事件發生之後。通常事前觸發器可以獲取事件之前和新的欄位值。語句級觸發器可以在語句執行前或後執行,而行級觸發在觸發器所影響的每一行觸發一次。

通過索引查詢數據比全表掃描要快.但是我們也必須注意到它的代價索引需要空間來存儲,也需要定期維護, 每當有記錄在表中增減或索引列被修改時,索引本身也會被修改. 這意味著每條記錄的INSERT,DELETE,UPDATE將為此多付出4,5 次的磁碟I/O. 因為索引需要額外的存儲空間和處理,那些不必要的索引反而會使查詢反應時間變慢.使用索引查詢不一定能提高查詢性能。

  • PL/SQL語句塊包含哪些部分?

答∶ Pl/sql 的塊結構包括:定義部分,執行部分,異常處理部分。

  • Oracle中字元串用什麼符號鏈接?

答∶ Oracle中使用 || 這個符號連接字元串 如 『abc』 || 『d』

  • Oracle是怎樣分頁的?

答∶ Oracle中使用rownum來進行分頁, 這個是效率最好的分頁方法,hibernate也是使用rownum來進行oralce分頁的。

SELECT

*

FROM

( SELECT rownum r, a FROM tabName WHERE rownum <= 20 )

WHERE

r > 10

  • 資料庫事務的特性?

答∶ 原子性、一致性、隔離性、持久性。

  • 資料庫優化?

答∶ 建索引、使用游標、批處理、使用分頁、使用存儲過程、設置快取儘可能設大一點。

  • sql語句執行順序?

答∶ FROM:對FROM子句中的前兩個表執行笛卡爾積(Cartesian product)(交叉聯接),生成虛擬表VT1

ON:對VT1應用ON篩選器。只有那些使為真的行才被插入VT2。

OUTER(JOIN):如 果指定了OUTER JOIN(相對於CROSS JOIN 或(INNER JOIN),保留表(preserved table:左外部聯接把左表標記為保留表,右外部聯接把右表標記為保留表,完全外部聯接把兩個表都標記為保留表)中未找到匹配的行將作為外部行添加到 VT2,生成VT3.如果FROM子句包含兩個以上的表,則對上一個聯接生成的結果表和下一個表重複執行步驟1到步驟3,直到處理完所有的表為止。

WHERE:對VT3應用WHERE篩選器。只有使為true的行才被插入VT4.

GROUP BY:按GROUP BY子句中的列列表對VT4中的行分組,生成VT5.

CUBE|ROLLUP:把超組(Suppergroups)插入VT5,生成VT6.

HAVING:對VT6應用HAVING篩選器。只有使為true的組才會被插入VT7.

SELECT:處理SELECT列表,產生VT8.

DISTINCT:將重複的行從VT8中移除,產生VT9.

ORDER BY:將VT9中的行按ORDER BY 子句中的列列表排序,生成游標(VC10).

TOP:從VC10的開始處選擇指定數量或比例的行,生成表VT11,並返回調用者。