何育朋 朱思銘
摘要:本文闡述如何使用SQL Server 2005 Enterprise Edition 的索引視圖改善數(shù)據(jù)庫(kù)系統(tǒng)的整體性能。
關(guān)鍵詞:SQL Server 2005;database;DBMS
1索引視圖的作用
Microsoft SQL Server 視圖的主要作用是:
1.1提供一種安全機(jī)制,將用戶(hù)限制到一個(gè)或多個(gè)基表的某個(gè)數(shù)據(jù)子集中。
1.2提供一種機(jī)制,允許開(kāi)發(fā)人員自定義用戶(hù)通過(guò)邏輯方式查看存儲(chǔ)在基表中的數(shù)據(jù)的方式。
在SQL Server 2005中,具有唯一的聚集索引的視圖稱(chēng)為索引視圖。
2利用索引視圖提高系統(tǒng)性能的方法
2.1可在視圖上使用非聚集索引。
視圖上的非聚集索引可提供更好的查詢(xún)性能。與表上的非聚集索引類(lèi)似,視圖上的非聚集索引可提供更多選項(xiàng),供查詢(xún)優(yōu)化器在編譯過(guò)程中選擇。例如,如果查詢(xún)包含聚集索引所未涉及的列,那么優(yōu)化器可在計(jì)劃中選擇一個(gè)或多個(gè)輔助索引,避免對(duì)索引視圖或基表進(jìn)行費(fèi)時(shí)的完全掃描。
對(duì)架構(gòu)添加索引會(huì)增加數(shù)據(jù)庫(kù)的開(kāi)銷(xiāo),因?yàn)樗饕枰掷m(xù)的維護(hù)。在索引數(shù)量和維護(hù)開(kāi)銷(xiāo)間尋求適當(dāng)?shù)钠胶恻c(diǎn)時(shí),應(yīng)謹(jǐn)慎權(quán)衡。
2.2可在查詢(xún)優(yōu)化器中使用索引視圖。
SQL Server 查詢(xún)優(yōu)化器自動(dòng)決定何時(shí)對(duì)給定的查詢(xún)執(zhí)行使用索引視圖。不必在查詢(xún)中直接引用視圖以供優(yōu)化器在查詢(xún)執(zhí)行計(jì)劃中使用。所以,現(xiàn)有的應(yīng)用程序可運(yùn)用索引視圖,而不用更改應(yīng)用程序本身。
查詢(xún)優(yōu)化器通過(guò)考慮幾個(gè)條件來(lái)決定索引視圖能否涵蓋整個(gè)或部分查詢(xún)。這些條件對(duì)應(yīng)查詢(xún)中的一個(gè) FROM 子句并由下列這幾個(gè)部分組成:
2.2.1查詢(xún) FROM 子句中的表必須是索引視圖 FROM 子句中的表的超集。
2.2.2查詢(xún)中的聯(lián)接條件必須是視圖中的聯(lián)接條件的超集。
2.2.3查詢(xún)中的聚合列必須可從視圖中的聚合列的子集派生。
2.2.4查詢(xún)選擇列表中的所有表達(dá)式必須可從視圖選擇列表或未包含在視圖定義中的表派生。
2.2.5如果與其他謂詞所匹配的行的超集相匹配,那么該謂詞將歸入另一個(gè)謂詞。例如,“T.a=10”歸入“T.a=10 and T.b=20”。任何謂詞都可歸入其自身。視圖中限制表值的那部分謂詞必須歸入查詢(xún)中限制相同表的那部分謂詞。此外,必須以 SQL Server 可驗(yàn)證的方式實(shí)現(xiàn)這一點(diǎn)。
2.2.6屬于視圖定義中的表的查詢(xún)搜索條件謂詞的所有列必須出現(xiàn)在下列視圖定義的一項(xiàng)或多項(xiàng)中:
(1)一個(gè) GROUP BY 列表。
(2)視圖選擇列表(如不存在 GROUP BY)。
(3)視圖定義中相同或等價(jià)的謂詞。
情況(1)和(2)允許 SQL Server 對(duì)視圖的列應(yīng)用查詢(xún)謂詞,以便進(jìn)一步限制視圖的列。情況 (3) 比較特殊,它不需要對(duì)列進(jìn)行篩選,因此該列不必出現(xiàn)在視圖中。如果查詢(xún)不止包含一個(gè) FROM 子句(子查詢(xún)、派生表、UNION),優(yōu)化器可能選擇幾個(gè)索引視圖來(lái)處理查詢(xún),并將它們應(yīng)用到不同 FROM 子句。
2.3可使用 NOEXPAND 視圖提示。
當(dāng) SQL Server 處理按名稱(chēng)引用視圖的查詢(xún)時(shí),視圖的定義只有在僅引用基表時(shí)才會(huì)被正常擴(kuò)展。這個(gè)過(guò)程稱(chēng)為視圖擴(kuò)展。其屬于一種宏擴(kuò)展形式。
NOEXPAND 視圖提示可強(qiáng)制查詢(xún)優(yōu)化器將視圖視為帶有聚集索引的普通表。其可防止視圖擴(kuò)展。只有在 FROM 子句中直接引用索引視圖,才會(huì)應(yīng)用 NOEXPAND 提示。例如:
SELECT Column1, Column2, ...FROM Table1, View1 WITH (NOEXPAND) WHERE ...
2.4可使用 EXPAND VIEWS 查詢(xún)提示。
處理按名稱(chēng)引用視圖的查詢(xún)時(shí),除非對(duì)視圖引用添加 NOEXPAND 提示,否則 SQL Server 總會(huì)擴(kuò)展視圖。該提示會(huì)嘗試匹配索引視圖和擴(kuò)展查詢(xún),除非在查詢(xún)末尾的一個(gè) OPTION 子句中指定 EXPAND VIEWS 查詢(xún)提示。例如,假設(shè)數(shù)據(jù)庫(kù)中有一個(gè)索引視圖 View1,以下,根據(jù)其邏輯定義(其 CREATE VIEW 語(yǔ)句)對(duì) View1 進(jìn)行了擴(kuò)展,然后 EXPAND VIEWS 選項(xiàng)會(huì)阻止在計(jì)劃中使用 View1 的索引視圖來(lái)解析該查詢(xún)。使用語(yǔ)句如下:
SELECT Column1, Column2, ... FROM Table1, View1 WHERE ...
OPTION (EXPAND VIEWS)
如要確保讓 SQL Server 通過(guò)從查詢(xún)所引用的基表直接訪問(wèn)數(shù)據(jù)來(lái)處理該查詢(xún),而不必訪問(wèn)索引視圖,那么可使用 EXPAND VIEWS。在某些情況下,EXPAND 視圖有助于消除因使用索引視圖而導(dǎo)致的鎖爭(zhēng)用。在測(cè)試應(yīng)用程序時(shí),NOEXPAND 和 EXPAND VIEWS 都可幫助用戶(hù)在使用和不使用索引視圖的情況下進(jìn)行性能評(píng)估。
對(duì)數(shù)據(jù)庫(kù)系統(tǒng)確定一組適當(dāng)?shù)乃饕赡芎軓?fù)雜。如果在設(shè)計(jì)一般索引時(shí)需要考慮眾多可能性,那么對(duì)架構(gòu)添加索引視圖會(huì)大幅提高設(shè)計(jì)和潛在結(jié)果的復(fù)雜性。例如,索引視圖可用于:
2.4.1查詢(xún)中引用的表的任何子集。
2.4.2該表子集的查詢(xún)中的條件的任何子集。
2.4.3組合的列。
2.4.4聚合函數(shù)(比如:SUM)。
2.5可應(yīng)用DTA優(yōu)化物理數(shù)據(jù)庫(kù)的設(shè)計(jì)。
數(shù)據(jù)庫(kù)優(yōu)化顧問(wèn) (DTA) 是 SQL Server 2005 的一項(xiàng)功能,可有效優(yōu)化物理數(shù)據(jù)庫(kù)設(shè)計(jì)。使用 DTA 可讓管理員有一個(gè)更清晰的思路,可以更準(zhǔn)確地、有針對(duì)性地組合使用確定索引、索引視圖和分區(qū)策略,從而簡(jiǎn)化了物理數(shù)據(jù)庫(kù)的設(shè)計(jì)過(guò)程。
3結(jié)束語(yǔ)
下圖說(shuō)明了使用以上方法通常所能取得的性能改進(jìn)程度:
實(shí)踐證明,靈活使用上述方法,能提高數(shù)據(jù)庫(kù)整體性能。
參考文獻(xiàn):
[1]Microsoft SQL Server 2005 Enterprise Edition English version helper document.
[2] ROBIN DEWSON.《SQL SERVER 2005基礎(chǔ)教程》[M].北京:人民郵電出版社,2006.
[3] SOLID QUALITY LEARNING[美].SQL SERVER 2005從入門(mén)到精通(應(yīng)用技術(shù)基礎(chǔ))[M],北京:清華大學(xué)出版社,2006.