索引,視圖和存儲過程的利弊

作者:王奎    我的博客:www.marksaas.com

在網上看到有關視圖和存儲過程的一道面試題,就整理一下。本文參考到維基百科還有其他網站的的一些解釋。

索引:索引是一本書籍的重要組成部分,它把書中的重要名詞列羅列出來,並給出它們相應的頁碼,方便讀者快速查找該名詞的定義和含義,感覺維基百科上的解釋很形象,在數據庫中索引是數據庫的對象之一,索引是爲了加速對錶中數據行的檢索而創建的一種分散的一種存儲結構。索引是針對一個表而建立的,它是由數據頁面以外的索引頁面組成的 。

索引的分類:

(1)聚集索引

聚集索引指示表中數據行按索引鍵的排序次序存儲,聚集索引對查找行很有效。只有當表包含聚集索引時,表內的數據行才按索引列的值在磁盤上進行物理上排序和存儲。每一個表只能有一個聚集索引,因爲數據行本身只能按一個順序存儲。當查詢指定了關鍵值的範圍或者按照關鍵值的順序訪問數據行時,應考慮在對應的列上創建聚集索引。

聚集索引對於那些經常要搜索範圍值的列特別有效。使用聚集索引找到包含第一個值的行後,便可以確保包含後續索引值的行物理相鄰。例如,應用程序查詢某一日期範圍內的記錄,如果在日期列上創建了聚集索引,則能夠快速找到包含開始日期的行,然後檢索表中所有相鄰的行,直到到達結束日期。同樣,如果對從表中檢索的數據進行排序時經常要用到某一列,則創建聚集索引指示表中的行按照該行的鍵值順序進行排序,避免每次查詢該列時都執行排序,從而節省成本。例如,對於ORDER BY或GROUP BY子句中指定的列進行索引,可以使DB2不必對數據進行排序,因爲這些行已經排序。這樣可以提高查詢性能。

當索引值唯一時,使用聚集索引查找特定的行也很有效率。

注意:聚集索引不適用於頻繁更改的行,因爲DB2 必須按聚集索引的鍵值改變行的物理順序存儲,如果聚集索引列中的數據頻繁修改,將導致聚集索引頻繁修改,數據整行移動,消耗大量的系統資源。

(2)非聚集索引

非聚集索引具有完全獨立於數據行的結構,數據行不按索引值的次序存儲。在非聚集索引中,每個索引鍵都有指針指向包含該鍵值的數據行。

當用戶需要使用多種方法查詢數據時,非聚集索引非常有用。每張表只能有一個聚集索引,但是用戶的查詢條件是多樣的。例如,員工表的EmployeeID列上已經創建了聚集索引,但是用戶經常會使用員工的姓名、所在部門、出生日期等作爲查詢條件,所以應當考慮在這些列上創建非聚集索引,以提高查詢效率。

如果創建索引時沒有指定索引類型,默認情況下爲非聚集索引。每個表最多可以創建249個非聚集索引。最好在唯一值較多的列上創建非聚集索引。

參看http://book.51cto.com/art/201008/216220.htm

查看錶 (View) 是在關係數據庫中,將一組查詢指令構成的結果集,組合成可查詢的數據表的一種數據庫對象。與數據表不同的是,數據表是一種實體結構(Physical Structure),但查看錶是一種虛擬結構(Virtual Structure),在實體數據表中的改變都可以立刻反應在查看錶中,不過部份數據庫管理系統也支持具更新能力的查看錶(Updatable View)。

查看錶具有下列的好處:

  • 可以將實體數據表隱藏起來,讓外部程序的設計師無法得知實際的數據結構,降低數據庫被攻擊的風險。
  • 在多數的情況下,查看錶是隻讀的,外部程序無法直接通過查看錶修改數據(具更新能力的查看錶除外)。
  • 簡化查詢,數據庫管理員可以將高度複雜的查詢,包裝在查看錶中,外部程序只需要直接訪問該查看錶即可取出需要的數據。
  • 在查看錶中先行運行運算。
  • 查看錶可視爲數據表,具有 JOIN 的能力。
  • 數據庫中只需要存儲定義,無須存儲數據。
  • 語法如下
    create view myview
        as select * from  mytable;
    查看錶語句:
    select * from myview where myId=3;
    儲存程序 (Stored Procedure),又可稱預儲程序或者存儲過程,是一種在數據庫中存儲複雜程序,以便外部程序調用的一種數據庫對象,它可以視爲數據庫中的一種函數或子程序。
  • 預存程序具有下列的好處:

    • 預存程序可封裝,並隱藏複雜的商業邏輯。
    • 預存程序可以回傳值,並可以接受參數。
    • 預存程序無法使用 SELECT 指令來運行,因爲它是子程序,與查看錶數據表用戶定義函數不同。
    • 預存程序可以用在數據檢驗,強制實行商業邏輯等。
    • 缺點:
    • 預存程序,往往定製化於特定的數據庫上,因爲支持的編程語言不同。當切換到其他廠商的數據庫系統時,需要重寫原有的預存程序。
    • 預存程序的性能調校與撰寫,受限於各種數據庫系統。
    • 預存程序是數據庫對象之一,必須使用數據定義語言來創建,例如:

      以下示例,以Microsoft的SQL Server所以採用的T-SQL語法表示。
      CREATE PROCEDURE usp_AddProduct
      (
         @Barcode VARCHAR(13),
         @Caption nvarchar(50)
      )
      AS
      BEGIN
       
         IF LEN(@Barcode) < 13 
            RAISERROR('Barcode length is too short.')
       
         INSERT INTO MyProducts (Barcode, Caption) VALUES (@Barcode, @Caption)
       
      END
      外部程序需要使用 EXECUTE 或 CALL 來調用預存程序。
      EXEC usp_AddProduct '2293891100011', 'MyProductCaption'




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章