分区表说明
用分區(qū)表,以下是說明和方法!SQL code 高性能網(wǎng)站建設(shè)之 MS Sql Server數(shù)據(jù)庫分區(qū) 什么是數(shù)據(jù)庫分區(qū)? 數(shù)據(jù)庫分區(qū)是一種對表的橫向分割,Sql server 2005企業(yè)版和之后的Sql server版本才提供這種技術(shù),這種對表的橫向分割不同于2000中的表分割,它對訪問用戶是透明的,用戶并不會感覺的表被橫向分割了。(2000中的表橫向分割是建n個表例如按時間建表每月一個表,表名不同,最后需要做一個大視圖) 關(guān)于具體的如何做分區(qū),請參考數(shù)據(jù)庫分區(qū)演練http://www.cnblogs.com/yukaizhao/archive/2008/05/07/sql_partition_test.html 為什么要分區(qū)? 顯而易見分區(qū)是為了提高數(shù)據(jù)庫的讀寫性能,提高數(shù)據(jù)庫的效率; 分區(qū)是否總是可以提高效率? 分區(qū)是一把雙刃劍,并不總能提高效率,這和具體情況有關(guān)系。 之所以有分區(qū)技術(shù),分區(qū)技術(shù)用的好的話可以提高性能,是因?yàn)橐环矫娣謪^(qū)把一大塊數(shù)據(jù)分成了n小塊,這樣查詢的時候很快定位到某一小塊上,在小塊中尋址要快很多;另一方面CPU比磁盤IO快很多倍,而硬件上又有多個磁盤,或者是RAID(廉價磁盤冗余陣列),可以讓數(shù)據(jù)庫驅(qū)動CPU同時去讀寫不同的磁盤,這樣才有可能可以提高效率。 分區(qū)在有些時候并不能提高讀寫效率,比如說我們經(jīng)常看到的按照日期字段去分區(qū)MSDN例子,這個實(shí)例中是按照記錄的生成時間來分區(qū)的,把一年的數(shù)據(jù)分割成12個分區(qū),每月一個。這樣的分區(qū)導(dǎo)致分區(qū)并不能實(shí)現(xiàn)CPU同步寫并提高寫入性能,因?yàn)樵谕粋€時段CPU總是要寫入到最新的那一個分區(qū)對應(yīng)的磁盤中。另一個問題是:這樣分區(qū)是否可以提高讀取性能呢?答案是不一定,要看根據(jù)什么字段來查詢,如果是根據(jù)時間來查詢,根據(jù)時間生成報表那么這種分區(qū)肯定會提高查詢的效率,但是如果是按照某個客戶查詢客戶最近1年內(nèi)的賬單數(shù)據(jù),這樣數(shù)據(jù)分布到不同的分區(qū)上,這樣的話效率就不一定能提高了,這要看數(shù)據(jù)在同一個分區(qū)上連續(xù)分布的讀性能高,還是CPU從幾個磁盤上同步讀取,然后在合并數(shù)據(jù)的性能更高一些,這和讀取數(shù)據(jù)的記錄數(shù)也有關(guān)系。 如何分區(qū)?用什么字段做分區(qū)依據(jù)? 具體如何分區(qū)和涉及的業(yè)務(wù)有關(guān)系,要看業(yè)務(wù)上最經(jīng)常的寫入和讀取操作是什么,然后再考慮分區(qū)的策略。 既然與具體業(yè)務(wù)相關(guān),我們就假定一個業(yè)務(wù)環(huán)境,假如我們要做一個論壇,對論壇的帖子和回復(fù)表進(jìn)行分區(qū)。 論壇中最常見的寫操作是1)發(fā)帖 2)回復(fù)帖子, 最常見的讀操作是 1) 根據(jù)帖子id顯示帖子詳情和分頁的帖子回復(fù) 2) 根據(jù)帖子版面帖子列表頁根據(jù)版面id分頁讀取帖子列表數(shù)據(jù) 怎么分區(qū)更合適呢?現(xiàn)在還沒有準(zhǔn)確答案,我有兩種可能的方案,寫下來,大家討論看看。 方案1. 根據(jù)帖子ID區(qū)域段分區(qū)(1-300w一個分區(qū)、300w-600w一個分區(qū)…),這樣理論上可以提高帖子詳細(xì)頁的讀取速度,而對于寫操作性能沒有益處,對于根據(jù)版面id讀取帖子列表頁有可能有益 方案2. 根據(jù)版面id進(jìn)行分區(qū),這樣對于寫性能應(yīng)該有提高,不同的分區(qū)對應(yīng)不同的版面,當(dāng)有兩個版面同時有發(fā)帖回帖操作時,有可能可以并發(fā)寫。對于根據(jù)版面id獲得帖子列表頁數(shù)據(jù)也可以提高性能,而對于帖子詳細(xì)信息頁沒有性能影響。 多大的數(shù)據(jù)量才需要分區(qū)? 這個問題我只能說一個內(nèi)部標(biāo)準(zhǔn),如果一張表的記錄超過在超過1000w,并以每月百萬的數(shù)據(jù)量增長,那就需要分區(qū)。大家有不同的看法請回復(fù)討論 關(guān)于具體的如何做分區(qū),請參考數(shù)據(jù)庫分區(qū)演練http://www.cnblogs.com/yukaizhao/archive/2008/05/07/sql_partition_test.html [code=SQL]代碼加注釋,希望對初學(xué)者有用。 USE[master]GOifexists (select*from sys.databases where name ='Test_1') dropdatabase Test_1 GO--創(chuàng)建新庫,要演練分區(qū)所以我們會多創(chuàng)建兩個文件組Test_A,Test_B,以便在后面的分區(qū)方案中使用。CREATEDATABASE[Test_1]ONPRIMARY ( NAME = N'test_1', FILENAME = N'D:\sqldata\test_1.mdf' , SIZE = 10240KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), FILEGROUP [test_A] ( NAME = N'Test_A', FILENAME = N'D:\sqldata\test_A.ndf' , SIZE = 1024KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ), FILEGROUP [test_B] ( NAME = N'Test_B', FILENAME = N'D:\sqldata\test_B.ndf' , SIZE = 1024KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ) LOGON ( NAME = N'Test_log', FILENAME = N'D:\sqldata\Test_log.ldf' , SIZE = 7616KB , MAXSIZE = 2048GB , FILEGROWTH =10%) COLLATE Chinese_PRC_CI_AS GOUSE[Test_1]GO--若分區(qū)函數(shù)存在則先drop掉IFEXISTS (SELECT*FROM sys.partition_functions WHERE name = N'test_partition') DROP PARTITION FUNCTION[test_partition]GO/**//*創(chuàng)建分區(qū)函數(shù)給后面的分區(qū)方案使用,分區(qū)函數(shù)很簡單就是指定一個范圍確定在某個值為什么的時候放在那個分區(qū)上*/--新建一個簡單的分區(qū)函數(shù),該函數(shù)以1000為界分兩個區(qū)create partition function test_partition(int) AS RANGE LEFTFORVALUES (1000) go/**//*看分區(qū)方案是否存在,若存在先drop掉*/IFEXISTS (SELECT*FROM sys.partition_schemes WHERE name = N'test_scheme') DROP PARTITION SCHEME test_scheme GO--創(chuàng)建分區(qū)方案,分區(qū)方案需要指定一個分區(qū)函數(shù),并指定在分區(qū)函數(shù)中分的區(qū)需要放在哪一個文件組上create partition scheme test_scheme AS PARTITION [test_partition]TO (test_A,test_B) GO--創(chuàng)建分區(qū)表ifobject_id('student','U') isnotnulldroptable student; gocreatetable student ( id intidentity(1,1) notnull, name varchar(10) notnull, class intnotnull, grade int ) on test_scheme(class) --在此處指定該表要使用的分區(qū)方案,并將指定分區(qū)依據(jù)列go--隨便插入幾條數(shù)據(jù)insertinto student values ('AQU',10,100); -- 這條數(shù)據(jù)在A分區(qū)上insertinto student values ('AQU_邊界',1000,89); -- 這邊數(shù)據(jù)也在A分區(qū)上是個邊界,因?yàn)槲覀兩厦嬖诤瘮?shù)中指定的是RANGE LEFT,所以1000在A分區(qū)上insertinto student values ('BQU',1001,90); -- 這一條肯定是在B分區(qū)上了。go--最后看看結(jié)果。$partition.分區(qū)函數(shù)(分區(qū)列)可以返回某一行所在的分區(qū)序號select*,分區(qū)序號 = $partition.test_partition(class) from student GO [/code]
轉(zhuǎn)載于:https://www.cnblogs.com/wala-wo/archive/2012/01/16/5119514.html
總結(jié)
- 上一篇: SQL Server 负载均衡集群(转)
- 下一篇: jquery 使用方法