數(shù)據(jù)庫性能調(diào)優(yōu)是每一個優(yōu)秀SQL Server管理員最終的責(zé)任。雖然保證數(shù)據(jù)的安全和可用性是我們的的目標(biāo),但是假如數(shù)據(jù)庫應(yīng)用程序無法滿足用戶的要求,那么DBA們會因為性能低下的設(shè)計和實現(xiàn)而受到指責(zé)。SQL Server 2005在數(shù)據(jù)庫性能方面得到了很多提高,尤其是表分區(qū)的技術(shù)。如果你還沒不了解表分區(qū)的特征,那么請你花點(diǎn)時間讀這篇文章。
表分區(qū)的概念不是一個新的概念;只要你當(dāng)過一段時間的SQL Server DBA,那么你可能已經(jīng)對一些頻繁訪問的表進(jìn)行過歸檔,當(dāng)這個表中的歷史數(shù)據(jù)變的不再經(jīng)常被訪問的時候。比如,假設(shè)你有一個打印時間報表的應(yīng)用,你的報告很少會查詢1995年的數(shù)據(jù),因為絕大部分的預(yù)算規(guī)劃會基于最近幾年的數(shù)據(jù)。
在SQL Server的早期版本中,你可以創(chuàng)建多個表。每一個表都具有相同的列結(jié)構(gòu),用來保存不同年份的數(shù)據(jù)。這樣,當(dāng)存在著對歷史數(shù)據(jù)訪問的必要的時候,你可以創(chuàng)建一個視圖來對這些表進(jìn)行查詢處理。將數(shù)據(jù)保存在多個表中是很方便的,因為相對于查詢時掃描整個大表,掃描小表會更快。但是這種好處只有在你預(yù)先知道哪些時間段的數(shù)據(jù)會被訪問。同時,一旦數(shù)據(jù)過期,你還需要創(chuàng)建新表并且轉(zhuǎn)移新產(chǎn)生的歷史數(shù)據(jù)。
SQL Server 7和SQL Server 2000支持分布式分區(qū)視圖(distributed partitioned views,又稱為物化視圖,materialized views).分布式分區(qū)視圖由分布于多臺服務(wù)器上的、具有相同表結(jié)構(gòu)的表構(gòu)成,而且你還需要為每一個服務(wù)器增加鏈接服務(wù)器定義(linked server definitions),最后在其中一臺服務(wù)器上創(chuàng)建一個視圖將每臺服務(wù)器上返回的數(shù)據(jù)合并起來。這里的設(shè)計思想是數(shù)據(jù)庫引擎可以利用多臺服務(wù)器的處理能力來滿足查詢。
但是,分布式分區(qū)視圖(DPV)受到很多限制,你可以在SQL Server的在線幫助文檔中閱讀到。雖然DPV在一些情況下能夠提供性能上的提高,但是這種技術(shù)不能被廣泛的應(yīng)用。已經(jīng)被證明它們不能滿足逐步增長的企業(yè)級應(yīng)用的要求。何況,DPV的實現(xiàn)是一個費(fèi)力的過程,需要DBA進(jìn)行很多工作。
SQL Server 2005開始支持表分區(qū),這種技術(shù)允許所有的表分區(qū)都保存在同一臺服務(wù)器上。每一個表分區(qū)都和在某個文件組(filegroup)中的單個文件關(guān)聯(lián)。同樣的一個文件/文件組可以容納多個分區(qū)表。
在這種設(shè)計架構(gòu)下,數(shù)據(jù)庫引擎能夠判定查詢過程中應(yīng)該訪問哪個分區(qū),而不用掃描整個表。如果查詢需要的數(shù)據(jù)行分散在多個分區(qū)中,SQL Server使用多個處理器對多個分區(qū)進(jìn)行并行查詢。你可以為在創(chuàng)建表的時候就定義分區(qū)的索引。 對小索引的搜索或者掃描要比掃描整個表或者一張大表上的索引要快很多。因此,當(dāng)對大表進(jìn)行查詢,表分區(qū)可以產(chǎn)生相當(dāng)大的性能提升。
現(xiàn)在讓我們通過一個簡單的例子來了解表分區(qū)是如何發(fā)揮作用的。在這篇文章中,我不想深入到分區(qū)的語法細(xì)節(jié)當(dāng)中,這些你可以在SQL Server的在線幫助文檔中找到。下面的例子基于存儲著一個時間報表系統(tǒng)的數(shù)據(jù)的數(shù)據(jù)倉庫。除了默認(rèn)的文件組,我另外創(chuàng)建了7個文件組,每一個文件組僅包含一個文件,這個文件將存儲由分區(qū)函數(shù)定義的一部分?jǐn)?shù)據(jù)。
為了測試表分區(qū)的性能提升,我向這個分區(qū)表中插入了一千五百萬行,同時向另外一個具有相同表結(jié)構(gòu)、但是沒有進(jìn)行分區(qū)的表插入了同樣的數(shù)據(jù)。對分區(qū)表執(zhí)行的INSERT語句運(yùn)行的更快一些。甚至在我的內(nèi)存不到1G的筆記本電腦上,對分區(qū)表的INSERT語句比不分區(qū)的表的INSERT語句要快上三倍。當(dāng)然,查詢的執(zhí)行時間依據(jù)硬件資源的差異而所有變化,但是你還是能夠在你的環(huán)境中感到不同程度的提升。
表分區(qū)的概念不是一個新的概念;只要你當(dāng)過一段時間的SQL Server DBA,那么你可能已經(jīng)對一些頻繁訪問的表進(jìn)行過歸檔,當(dāng)這個表中的歷史數(shù)據(jù)變的不再經(jīng)常被訪問的時候。比如,假設(shè)你有一個打印時間報表的應(yīng)用,你的報告很少會查詢1995年的數(shù)據(jù),因為絕大部分的預(yù)算規(guī)劃會基于最近幾年的數(shù)據(jù)。
在SQL Server的早期版本中,你可以創(chuàng)建多個表。每一個表都具有相同的列結(jié)構(gòu),用來保存不同年份的數(shù)據(jù)。這樣,當(dāng)存在著對歷史數(shù)據(jù)訪問的必要的時候,你可以創(chuàng)建一個視圖來對這些表進(jìn)行查詢處理。將數(shù)據(jù)保存在多個表中是很方便的,因為相對于查詢時掃描整個大表,掃描小表會更快。但是這種好處只有在你預(yù)先知道哪些時間段的數(shù)據(jù)會被訪問。同時,一旦數(shù)據(jù)過期,你還需要創(chuàng)建新表并且轉(zhuǎn)移新產(chǎn)生的歷史數(shù)據(jù)。
SQL Server 7和SQL Server 2000支持分布式分區(qū)視圖(distributed partitioned views,又稱為物化視圖,materialized views).分布式分區(qū)視圖由分布于多臺服務(wù)器上的、具有相同表結(jié)構(gòu)的表構(gòu)成,而且你還需要為每一個服務(wù)器增加鏈接服務(wù)器定義(linked server definitions),最后在其中一臺服務(wù)器上創(chuàng)建一個視圖將每臺服務(wù)器上返回的數(shù)據(jù)合并起來。這里的設(shè)計思想是數(shù)據(jù)庫引擎可以利用多臺服務(wù)器的處理能力來滿足查詢。
但是,分布式分區(qū)視圖(DPV)受到很多限制,你可以在SQL Server的在線幫助文檔中閱讀到。雖然DPV在一些情況下能夠提供性能上的提高,但是這種技術(shù)不能被廣泛的應(yīng)用。已經(jīng)被證明它們不能滿足逐步增長的企業(yè)級應(yīng)用的要求。何況,DPV的實現(xiàn)是一個費(fèi)力的過程,需要DBA進(jìn)行很多工作。
SQL Server 2005開始支持表分區(qū),這種技術(shù)允許所有的表分區(qū)都保存在同一臺服務(wù)器上。每一個表分區(qū)都和在某個文件組(filegroup)中的單個文件關(guān)聯(lián)。同樣的一個文件/文件組可以容納多個分區(qū)表。
在這種設(shè)計架構(gòu)下,數(shù)據(jù)庫引擎能夠判定查詢過程中應(yīng)該訪問哪個分區(qū),而不用掃描整個表。如果查詢需要的數(shù)據(jù)行分散在多個分區(qū)中,SQL Server使用多個處理器對多個分區(qū)進(jìn)行并行查詢。你可以為在創(chuàng)建表的時候就定義分區(qū)的索引。 對小索引的搜索或者掃描要比掃描整個表或者一張大表上的索引要快很多。因此,當(dāng)對大表進(jìn)行查詢,表分區(qū)可以產(chǎn)生相當(dāng)大的性能提升。
現(xiàn)在讓我們通過一個簡單的例子來了解表分區(qū)是如何發(fā)揮作用的。在這篇文章中,我不想深入到分區(qū)的語法細(xì)節(jié)當(dāng)中,這些你可以在SQL Server的在線幫助文檔中找到。下面的例子基于存儲著一個時間報表系統(tǒng)的數(shù)據(jù)的數(shù)據(jù)倉庫。除了默認(rèn)的文件組,我另外創(chuàng)建了7個文件組,每一個文件組僅包含一個文件,這個文件將存儲由分區(qū)函數(shù)定義的一部分?jǐn)?shù)據(jù)。
為了測試表分區(qū)的性能提升,我向這個分區(qū)表中插入了一千五百萬行,同時向另外一個具有相同表結(jié)構(gòu)、但是沒有進(jìn)行分區(qū)的表插入了同樣的數(shù)據(jù)。對分區(qū)表執(zhí)行的INSERT語句運(yùn)行的更快一些。甚至在我的內(nèi)存不到1G的筆記本電腦上,對分區(qū)表的INSERT語句比不分區(qū)的表的INSERT語句要快上三倍。當(dāng)然,查詢的執(zhí)行時間依據(jù)硬件資源的差異而所有變化,但是你還是能夠在你的環(huán)境中感到不同程度的提升。

