1. 程式人生 > >檢視、索引、儲存過程優缺點

檢視、索引、儲存過程優缺點

1.檢視

(1).什麼是檢視?

檢視(View)作為一種資料庫物件,為使用者提供了一個可以檢索資料表中資料的方式。使用者通過檢視來瀏覽資料表中感興趣的部分或全部資料,而資料的物理儲存位置仍然在表中。

檢視是一個虛擬表,並不代表任何物理資料,只是用來檢視資料的視窗而已。檢視並不是以一組資料的形式儲存在資料庫中,資料庫中只儲存檢視的定義,而不儲存檢視對應的資料,這些資料仍儲存在匯出檢視的基本表中。當基本表中的資料發生變化時,從檢視中查詢出來的資料也隨之改變。

檢視中的資料行和列都是來自於基本表,是在檢視被引用時動態生成的。使用檢視可以集中、簡化和制定使用者的資料庫顯示,使用者可以通過檢視來訪問資料,而不必直接去訪問該檢視的基本表。

檢視由檢視名和檢視定義兩個部分組成。檢視是從一個或多個表匯出來的表,它實際上是一個查詢結果,檢視的名字和檢視對應的查詢儲存在資料字典中。

(2).檢視的優缺點?

<1>.檢視的優點

A.資料安全性
對不同的使用者定義不同的檢視,使使用者只能看到與自己有關的資料。資料庫授權命令可以使每個使用者對資料庫的檢索限制到特定的資料庫物件上,但不能授權到資料庫特定行和特定的列上。通過檢視,使用者可以被限制在資料的不同子集上。

B.查詢簡單化
為複雜的查詢建立一個檢視,使用者不必輸入複雜的查詢語句,只需針對此檢視做簡單的查詢即可。那些被經常使用的查詢可以被定義為檢視,從而使使用者不必為以後的操作每次都指定全部的條件。

C.邏輯資料獨立性
檢視可以使應用程式和資料庫表在一定程度上獨立。如果沒有檢視,應用一定是建立在表上的。有了檢視之後,程式可以建立在檢視之上,從而程式與資料庫表被檢視分割開來。

對於檢視的操作,例如,查詢只依賴於檢視的定義,當構成檢視的基本表需要修改時,只需要修改檢視定義中的子查詢部分,而基於檢視的查詢不用改變。

<2>.檢視的缺點

A.效能

SQL Server必須把檢視的查詢轉化成對基本表的查詢,如果這個檢視是由一個複雜的多表查詢所定義,那麼,即使是檢視的一個簡單查詢,SQL Server也把它變成一個複雜的結合體,需要花費一定的時間。

B.修改限制

當用戶試圖修改檢視的某些行時,SQL Server必須把它轉化為對基本表的某些行的修改。事實上,當從檢視中插入或者刪除時,情況也是這樣。對於簡單檢視來說,這是很方便的,但是,對於比較複雜的檢視,可能是不可修改的,這些檢視有如下特徵:
  a.有UNIQUE等集合操作符的檢視
  b.有GROUP BY子句的檢視
  c.有諸如AVG\SUM\MAX等聚合函式的檢視
  d.使用DISTINCT關鍵字的檢視
  e.連線表的檢視(其中有些例外)
  
(3).建立檢視的限制:

在建立檢視時,還要注意試圖必須滿足以下幾點限制:
<1>.不能將規則或者DEFAULT定義關聯於檢視;
<2>.定義檢視的查詢中不能含有ORDER BY\COMPUTER\COMPUTER BY 子句和INTO關鍵字;
<3>.如果檢視中某一列是一個算術表示式、建構函式或者常數,而且檢視中兩個或者更多的不同列擁有一個相同的名字(這種情況通常是因為在檢視的定義中有一個連線,而且這兩個或者多個來自不同表的列擁有相同的名字),此時,使用者需要為檢視的每一列指定列的名稱。

2.索引

(1).什麼是索引?

索引是以表列為基礎的資料庫物件,它儲存著表中排序的索引列,並且記錄了索引列在資料表中的物理儲存位置,實現了表中資料的邏輯排序,其主要目的是提高SQL Server系統的效能,加快資料的查詢速度和減少系統的響應時間。索引通過記錄表中的關鍵值指向表中的記錄,這樣資料庫引擎就不用掃描整個表而定位到相關的記錄。相反,如果沒有索引,則會導致SQL Server搜尋表中的所有記錄,以獲取匹配結果。

索引除了可以提高查詢表內資料的速度以外,還可以使表和表之間的連線速度加快。例如,在實現資料參照完整性時,可以將表的外來鍵製作為索引,這樣將加速表與表之間的連線。

(2).索引的分類
有3種索引型別:聚集索引、非聚集索引和唯一索引。如果表中存在聚集索引,則非聚集索引使用聚集索引來加快資料查詢。

<1>.聚集索引

聚集索引會對錶和檢視進行物理排序,所以這種索引對查詢非常有效,在表和檢視中只能有一個聚集索引。當建立主鍵約束時,如果表中沒有聚集索引,SQL Server會用主鍵列作為聚集索引鍵。可以在表的任何列或列的組合上建立索引,實際應用中一般定義成主鍵約束的列建立聚集索引。

<2>.非聚集索引

非聚集索引不會對錶和檢視進行物理排序。如果表中不存在聚集索引,則表示未排序的。在表或檢視中,最多可以建立250個非聚集索引,或者249個非聚集索引和1個聚集索引。

<3>.唯一索引

唯一索引不允許兩行具有相同的索引值。只要列中資料是唯一的,就可在同一個表上建立一個唯一的聚集索引。如果必須實施唯一性以確保資料的完整性,則應在列上建立UNIQUE或PRIMARY KEY約束,而不要建立唯一索引。

(3).使用索引的代價

雖然索引有很多優點,但索引的存在也讓系統付出了一定的代價。建立索引和維護索引都會消耗時間,當對錶中的資料進行增加、刪除和修改操作時,索引就要進行維護,否則索引的作用就會下降;另外,每個索引都會佔用一定的物理空間,如果佔用的物理空間過多,就會影響到整個SQL Server系統的效能。

(4).建立索引的原則

建立索引雖然可以提高查詢速度,但是它是犧牲一定的系統性能。因此,在建立時,哪些列適合建立索引,哪些列不適合建立索引,需要進行判斷,具體以下原則:

<1>.有主鍵的資料列要建立索引。因為主鍵可以加速定位到表中的某一行

<2>.有外來鍵的資料列要建立索引。外來鍵列通常用於表與表之間的連線,在其上建立索引可以加快表間的連線

<3>.對於經常查詢的資料列最好建立索引

A.對於需要在指定範圍內快速或頻繁查詢的資料列,因為索引已經排序,其指定的範圍是連續的,查詢可以利用索引的排序,加快查詢的時間

B.經常用在WHERE子句中的資料列,將索引建立在WHERE子句的集合過程中,對於需要加速或頻繁檢索的資料列,可以讓這些經常參與查詢的資料列按照索引的排序進行查詢,加快查詢的時間

<4>.對於那些查詢中很少涉及的列、重複值比較多的列不要建立索引
例如,在查詢中很少使用的列,有無索引並不能提高查詢的速度,相反增加了系統維護時間和消耗了系統空間。

<5>.對於定義為text、image和bit資料型別的列不要建立索引。因為這些資料型別的資料列的資料量要麼很大、要麼很小,不利於使用索引

3.儲存過程

(1).什麼是儲存過程?

當開發一個應用程式時,為了易於修改和擴充,經常會將負責不同功能的語句集中起來而且按照用途分別放置,以便能夠反覆呼叫,而這些獨立放置且擁有不同功能的語言,即是“過程”(Procedure)。

儲存過程(Stored Producedures)是一組為完整特定功能的SQL語句集,經編譯後儲存在資料庫中。使用者通過指定儲存過程的名字給出引數(如果該儲存過程帶有引數)來執行它。

它能夠包含執行各種資料庫操作的語句,並且可以呼叫其他的儲存過程;能夠接受輸入引數,並以輸出引數的形式將多個數據值返回給呼叫程式(Calling Procedure)或批處理(Batch);向呼叫程式或批處理返回一個狀態值,以表明成功或失敗(以及失敗的原因)。

(2).儲存過程的優點

<1>.儲存過程優點

A.執行速度快

儲存過程只在創造時進行編譯,已經通過語法檢查和效能優化,以後每次執行儲存過程都不需再重新編譯,而我們通常使用的SQL語句每執行一次就編譯一次,所以使用儲存過程可提高資料庫執行速度。

B.允許元件式程式設計

經常會遇到複雜的業務邏輯和對資料庫的操作,這個時候就會用SP來封裝資料庫操作。當對資料庫進行復雜操作時(如對多個表進行Update,Insert,Query,Delete時),可將此複雜操作用儲存過程封裝起來與資料庫提供的事務處理結合一起使用。只需建立儲存過程一次並將其儲存在資料庫中,以後即可在程式中呼叫該過程任意次。在程式碼上看,SQL語句和程式程式碼語句的分離,可以提高程式程式碼的可讀性。

儲存過程可以設定引數,可以根據傳入引數的不同重複使用同一個儲存過程,從而高效的提高程式碼的優化率和可讀性。

C.減少網路流量

一個需要數百行Transact-SQL程式碼的操作由一條執行過程程式碼的單獨語句就可實現,而不需要在網路中傳送數百行程式碼。

對於同一個針對資料庫物件的操作,如果這一操作所涉及到的T-SQL語句被組織成一儲存過程,那麼當在客戶機上呼叫該儲存過程時,網路中傳遞的只是該呼叫語句,否則將會是多條SQL語句。從而減輕了網路流量,降低了網路負載。

D.提高系統安全性

可將儲存過程作為使用者存取資料的管道。可以限制使用者對資料表的存取許可權,建立特定的儲存過程供使用者使用,避免非授權使用者對資料的訪問,保證資料的安全。

<2>.儲存過程缺點:

A.移植性差。
依賴於資料庫廠商,難以移植(當一個小系統發展到大系統時,對資料庫的要求也會發生改變);

B.難以除錯、維護。
業務邏輯大的時候,封裝性不夠,難除錯難以維護;

C.伺服器不能負載均衡。
複雜的應用用儲存過程來實現,就把業務處理的負擔壓在資料庫伺服器上了。沒有辦法通過中間層來靈活分擔負載和壓力.均衡負載等。

(3).儲存過程分類

<1>.系統儲存過程

系統儲存過程(System Stored Procedures)主要儲存在master資料庫中,並以sp_為字首,並且系統儲存過程主要是從系統表中獲取資訊,從而為系統管理員管理SQL Server提供支援。

<2>.本地儲存過程

本地儲存過程(Local Stored Procedures)也就是使用者自行建立在使用者資料庫中的儲存過程。事實上一般所說的儲存過程值得就是本地儲存過程。使用者建立的儲存過程是由使用者建立並能完成某一特定功能(如查詢使用者所需的資料資訊)的儲存過程。

<3>.臨時儲存過程

臨時儲存過程(Temporary Stored Procedures)可分為以下兩種:

A.本地臨時儲存過程

如果在建立儲存過程中,以井號(#)作為其名稱的第一個字元,則該儲存過程將成為一個存放在tempdb資料庫中的本地臨時儲存過程(例如,CREATE PROCEDURE #book_proc…..)。本地臨時儲存過程只有建立它的連線的使用者才能夠執行它,而且一旦這位使用者斷開與SQL Server的連線,本地臨時儲存過程就會自動刪除,當然,這位使用者也可以在連線期間用DROP PROCEDURE命令刪除多建立的本地臨時儲存過程。

B.全域性臨時儲存過程

如果在所建立的儲存過程名稱是以兩個井號(# #)開始,則該儲存過程將成為一個儲存在tempdb資料庫中的全域性臨時儲存過程,如果沒有,便立即將全域性臨時儲存過程刪除;如果有,SQL Server會讓這些執行中的操作繼續進行,但是不允許任何使用者再執行全域性臨時儲存過程,等到所有未完成的操作執行完畢後,全域性臨時儲存過程就會自動刪除。

由於全域性臨時儲存過程能夠被所有的連線使用者使用,因此,必須注意其名稱不能和其他連線所採用的名稱相同。

<4>.遠端儲存過程

遠端儲存過程(Remote Stored Procedures)是位於遠端伺服器上的儲存過程,通常可以使用分散式查詢和EXECUTE命令執行一個遠端儲存過程。

<5>.擴充套件儲存過程

擴充套件儲存過程(Extended Stored Procedures)是使用者可以使用外部程式語言編寫的儲存過程。擴充套件儲存過程在使用和執行上與一般的儲存過程完全相同。可以將引數傳遞給擴充套件儲存過程,擴充套件儲存過程也能夠返回結果和狀態值。

為了區別,擴充套件儲存過程的名稱通常以xp_開頭。擴充套件儲存過程是以動態連結庫(DLLS)的形式存在,能讓SQL Server動態的裝載和執行。擴充套件儲存過程一定要儲存在系統資料庫master中。