知方可補不足~SQL為(wei)大數據(ju)引入分區表
一些概念
分區(qu)表在(zai)oracle和(he)sqlserver中都上(shang)存在(zai)的(de)(de)(de)(de)(de),當數據(ju)表的(de)(de)(de)(de)(de)數據(ju)量過大(da)時,上(shang)千萬,上(shang)億的(de)(de)(de)(de)(de)數據(ju),在(zai)進(jin)行(xing)數據(ju)查詢時需要顯得比較慢,性能很差,這(zhe)時是(shi)時候引入(ru)分區(qu)表了,分區(qu)表顧名思義,就(jiu)是(shi)把物(wu)理表用一些文件(jian)NDF進(jin)行(xing)分塊存儲,以緩減IO的(de)(de)(de)(de)(de)壓力(li),因為當你(ni)的(de)(de)(de)(de)(de)SQL文件(jian)過大(da)的(de)(de)(de)(de)(de),這(zhe)其(qi)實對系統的(de)(de)(de)(de)(de)IO影響是(shi)最大(da)的(de)(de)(de)(de)(de),這(zhe)種分區(qu)表我(wo)感(gan)覺類似于數據(ju)的(de)(de)(de)(de)(de)分片(pian)(mongodb),它(ta)將有效的(de)(de)(de)(de)(de)利(li)用服(fu)務器的(de)(de)(de)(de)(de)CPU多核資(zi)源(yuan),并行(xing)去處理你(ni)的(de)(de)(de)(de)(de)請求,所以在(zai)大(da)數據(ju)情況下(xia),分區(qu)表是(shi)很好(hao)的(de)(de)(de)(de)(de)一種選(xuan)擇(ze)!
我們通常(chang)也把電腦的磁盤分成若干(gan)的區,其中一種(zhong)考慮也是為了性能,安(an)全等
sql的分(fen)區表于(yu)若干的文(wen)(wen)件(jian)(jian)組組成(cheng),它們可以被(bei)理(li)解成(cheng)依(yi)照某個條件(jian)(jian)(分(fen)區函數)來進行劃(hua)分(fen)的文(wen)(wen)件(jian)(jian)塊(kuai),當(dang)你(ni)進行curd操(cao)作時,SQL會把(ba)它同時響應到對應的塊(kuai)上(shang)去,文(wen)(wen)件(jian)(jian)組里至(zhi)少包(bao)含(han)一個文(wen)(wen)件(jian)(jian),當(dang)然(ran)可以是(shi)多個,它們也可以在不同的磁盤上(shang)。
說干就干
下面來一(yi)(yi)步(bu)一(yi)(yi)步(bu)的實現(xian)一(yi)(yi)下分區表的建立邏輯
--建立(li)兩個文件組 ALTER DATABASE Test ADD FILEGROUP BEFORE2000 ALTER DATABASE Test ADD FILEGROUP AFTER2000 ALTER DATABASE Test ADD FILEGROUP AFTER2010 --創建文(wen)件 ALTER DATABASE Test ADD FILE (Name=N'Before2000',filename='c:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\Before2000.ndf',size=5mb,maxsize=100Mb,filegrowth=5mb) TO FILEGROUP Before2000 ALTER DATABASE Test ADD FILE (Name=N'After2000',filename='c:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\After2000.ndf',size=5mb,maxsize=100Mb,filegrowth=5mb) TO FILEGROUP After2000 ALTER DATABASE Test ADD FILE (Name=N'After2010',filename='c:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\After2010.ndf',size=5mb,maxsize=100Mb,filegrowth=5mb) TO FILEGROUP After2010
上面代碼在磁盤(pan)上建立了(le)兩(liang)個文件(jian)(jian)(jian)組,用來存儲2000年以(yi)前(qian),2000-2010年,以(yi)2010年以(yi)后(hou)的數據,而ndf是分區表文件(jian)(jian)(jian)的類(lei)型,一(yi)個分區表文件(jian)(jian)(jian)組可以(yi)由多個ndf文件(jian)(jian)(jian)構成
--編寫(xie)分區函數 CREATE PARTITION FUNCTION RangeTime (DATETIME) AS RANGE LEFT FOR VALUES ('2000-01-01','2010-01-01') --編寫分區(qu)方案, 分區(qu)方案也就是將分區(qu)函數與(yu)文件組進行一個關聯 CREATE PARTITION SCHEME RangeSchema_CreateTime AS PARTITION RangeTime TO (BEFORE2000,AFTER2000,AFTER2010)
上面分(fen)(fen)區函數(shu)說明(ming)以(yi)哪(na)里依據(ju)進(jin)行分(fen)(fen)區,而(er)分(fen)(fen)區方(fang)案是將它與(yu)分(fen)(fen)區文件(jian)組進(jin)行接(jie)合(he),或(huo)者和(he)數(shu)據(ju)表進(jin)行打通(tong),以(yi)后我們用(yong)的時候,直接(jie)用(yong)分(fen)(fen)區函數(shu)(表名(ming))即可(ke)。
--創建分(fen)區(qu)表,先建表,再設主(zhu)鍵(jian),否則會出錯(cuo) CREATE TABLE Order ( ID VARCHAR(50) , UserId VARCHAR(50) , CreateTime DATETIME ) ON RangeSchema_CreateTime(CreateTime)
上面(mian)代碼建(jian)(jian)立(li)一(yi)(yi)張表,并進行分(fen)區的配置(zhi),注意,在建(jian)(jian)立(li)表后,再建(jian)(jian)立(li)主鍵,我們填充一(yi)(yi)些數據(ju)就可(ke)以測試了,下面(mian)介紹(shao)幾個(ge)常用的命令
返(fan)回(hui)2001-2-2日這條(tiao)數據會被分配到哪個(ge)分區了
--測試(shi)某(mou)個對象放在哪個分區(qu)里 SELECT $PARTITION.RangeTime('2001-2-2')
查看指定分區內的數據
--查看某(mou)個分區表(biao)里(li)存放的數(shu)據(ju) SELECT * FROM shop WHERE $PARTITION.RangeTime(CreateTime) = 1
查看某個分區里,記錄的個數
--查(cha)看某(mou)個分區表的個數 SELECT $PARTITION.RangeTime(CreateTime) AS 分區編號 , COUNT(id) AS 記錄數 FROM shop GROUP BY $PARTITION.RangeTime(CreateTime)
當(dang)數(shu)(shu)據量達到一定(ding)指數(shu)(shu)時,我們(men)必須要進(jin)行調整,而(er)選擇(ze)哪種方法(fa)是靠技(ji)術決策人(ren)的(de),我們(men)每個開發(fa)人(ren)員都應該把自(zi)(zi)己(ji)(ji)當(dang)成是技(ji)術的(de)決策人(ren),對(dui)自(zi)(zi)己(ji)(ji)的(de)代碼和自(zi)(zi)己(ji)(ji)的(de)人(ren)生(sheng)負責!
感謝您的閱讀!