Java面試常考題目之數據庫

  1. 什麼是事務?ACID
    事務是指一個工作單元,它包含了一組數據操作命令,並且所有的命令作爲一個整體一起向系統提交或撤消請求操作,即這組命令要麼都執行,要麼都不執行。
    原子性(Atomicity):事務必須是原子工作單元;對於其數據修改,要麼全都執行,要麼全都不執行。不可能停滯在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。
    一致性(Consistency):事務在完成時,必須使所有的數據都保持一致狀態。在相關數據庫中,所有規則都必須應用於事務的修改,以保持所有數據的完整性。事務結束時,所有的內部數據結構(如 B 樹索引或雙向鏈表)都必須是正確的。
    如果事務是併發多個,系統也必須如同串行事務一樣操作。其主要特徵是保護性和不變性(Preserving an Invariant),以轉賬案例爲例,假設有五個賬戶,每個賬戶餘額是100元,那麼五個賬戶總額是500元,如果在這個5個賬戶之間同時發生多個轉賬,無論併發多少個,比如在A與B賬戶之間轉賬5元,在C與D賬戶之間轉賬10元,在B與E之間轉賬15元,五個賬戶總額也應該還是500元,這就是保護性和不變性
    隔離性(Isolation):由併發事務所作的修改必須與任何其它併發事務所作的修改隔離。事務查看數據時數據所處的狀態,要麼是另一併發事務修改它之前的狀態,要麼是另一事務修改它之後的狀態,事務不會查看中間狀態的數據。這稱爲可串行性,因爲它能夠重新裝載起始數據,並且重播一系列事務,以使數據結束時的狀態與原始事務執行的狀態相同。
    隔離狀態執行事務,使它們好像是系統在給定時間內執行的唯一操作。如果有兩個事務,運行在相同的時間內,執行相同的功能,事務的隔離性將確保每一事務在系統中認爲只有該事務在使用系統。這種屬性有時稱爲串行化,爲了防止事務操作間的混淆,必須串行化或序列化請求,使得在同一時間僅有一個請求用於同一數據。
    持久性(Durability):事務完成之後,它對於系統的影響是永久性的。該修改即使出現系統故障也將一直保持。在事務完成以後,該事務對數據庫所作的更改便持久的保存在數據庫之中,並不會被回滾。
  2. 存儲過程和函數有什麼區別?
    Oracle中的函數與存儲過程的區別:
    A:函數必須有返回值,而過程沒有.
    B:函數可以單獨執行.而過程必須通過execute執行.
    C:函數可以嵌入到SQL語句中執行.而過程不行.
    其實我們可以將比較複雜的查詢寫成函數.然後到存儲過程中去調用這些函數.
    Oracle中的函數與存儲過程的特點:
    A. 一般來說,存儲過程實現的功能要複雜一點,而函數的實現的功能針對性比較強。
    B. 對於存儲過程來說可以返回參數,而函數只能返回值或者表對象。
    C.存儲過程一般是作爲一個獨立的部分來執行,而函數可以作爲查詢語句的一個部分來調用,由於函數可以返回一個表對象,因此它可以在查詢語句中位於FROM關鍵字的後面。
  3. 什麼是存儲過程?它有什麼優點?
    存儲過程是一組予編譯的SQL語句,
    它的優點有:
    允許模塊化程序設計,就是說只需要創建一次過程,以後在程序中就可以調用該過程任意次。
    允許更快執行,如果某操作需要執行大量SQL語句或重複執行,存儲過程比SQL語句執行的要快。
    減少網絡流量,例如一個需要數百行的SQL代碼的操作有一條執行語句完成,不需要在網絡中發送數百行代碼。
    更好的安全機制,對於沒有權限執行存儲過程的用戶,也可授權他們執行存儲過程。
  4. 什麼是觸發器,它有哪些優點?
    觸發器是一種特殊類型的存儲過程,觸發器主要通過事件觸發而被執行的,
    觸發器的優點:
    1.強化約束,觸發器能夠提供比CHECK約束。
    2.跟蹤變化,觸發器可以跟蹤數據庫內的操作,從而不允許未經允許許可的更新和變化。
    3.聯級運算,比如某個表上的觸發器中包含對另一個表的數據操作,而該操作又導致該表上的觸發器被觸發。
  5. 觸發器分爲事前觸發和事後觸發的區別。語句級觸發和行級觸發有何區別?
    事前觸發器運行於觸發事件發生之前,通常可以獲取事件之前和新的字段值
    事後觸發器運行於觸發事件發生之後。
    語句級觸發器可以在語句執行前或後執行,
    行級觸發在觸發器所影響的每一行觸發一次
  6. 什麼是索引?它有什麼優點?
    索引象書的目錄類似,索引使數據庫程序無需掃描整個表,就可以在其中找到所需要的數據,索引包含了一個表中包含值的列表,其中包含了各個值的行所存儲的位置,索引可以是單個或一組列,索引提供的表中數據的邏輯位置,合理劃分索引能夠大大提高數據庫性能。
  7. 視圖是什麼?遊標是什麼?
    視圖是一種虛擬表,虛擬表具有和物理表相同的功能,可以對虛擬表進行增該查操作,視圖通常是一個或多個表的行或列的子集,視圖的結果更容易理解(修改視圖對基表不影響),獲取數據更容易(相比多表查詢更方便),限制數據檢索(比如需要隱藏某些行或列),維護更方便。
    遊標對查詢出來的結果集作爲一個單元來有效的處理,遊標可以定位在結果集的特定行、從結果集的當前位置檢索一行或多行、可以對結果集中當前位置進行修改。
  8. 使用索引查詢一定能提高查詢的性能嗎?爲什麼?
    不能。如果返回的行數目較大,使用全表掃描的性能較好。
  9. 如何優化SQL語句
    1)對操作符的優化 儘量不採用不利用索引的操作符
    如:in ,not in , is nul, is not null,<>等
    2)對條件字段的一些優化
    採用函數處理的字段不能利用索引,
    進行了顯式或隱式的運算的字段不能進行索引
    條件內包括了多個本表的字段運算時不能進行索引
    3 )在業務密集的SQL當中WHERE後面的條件順序影響
    4)應用ORACLE的HINT(提示)處理
    5)查詢表順序的影響
  10. 怎麼優化數據庫(在數據百萬條記錄的數據庫中 Oracle)?
    使用索引、建立分區,分區索引、使用存儲過程
  11. SQL海量數據查詢優化性能
    數據庫系統是管理信息系統的核心,基於數據庫的聯機事務處理(OLTP)以及聯機分析處理(OLAP)是銀行、企業、政府等部門最爲重要的計算機應用之一。從大多數系統的應用實例來看,查詢操作在各種數據庫操作中所佔據的比重最大,而查詢操作所基於的SELECT語句在SQL語句中又是代價最大的語句。舉例來說,如果數據的量積累到一定的程度,比如一個銀行的賬戶數據庫表信息積累到上百萬甚至上千萬條記錄,全表掃描一次往往需要數十分鐘,甚至數小時。如果採用比全表掃描更好的查詢策略,往往可以使查詢時間降爲幾分鐘,由此可見查詢優化技術的重要性。
  12. 數據庫內聯與外聯的區別?
    內部聯接(inner join)一個聯接,返回兩表的公共列都匹配的行
    外部聯接(outer join) 一個聯接,該聯接還包括那些和聯接表中記錄不相關的記錄。您可以創建一個外部聯接的三種變形來指定所包括的不匹配行:
    左外部聯接、右外部聯接和完全外部聯接。
    左外部聯接(left outer join) 左邊的表是主表,列所有;右表無取null
    右外部聯接(right outer join) 右邊的表是主表,列所有;左邊表只列匹配的行,沒有值置null
    完全外部聯接 列所有,沒有值置null
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章