濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > SQL Server 2008中的數(shù)據(jù)表壓縮功能詳細(xì)介紹

SQL Server 2008中的數(shù)據(jù)表壓縮功能詳細(xì)介紹

熱門(mén)標(biāo)簽:寧夏外呼系統(tǒng)方案 電銷外呼系統(tǒng)違規(guī) 濟(jì)南電銷外呼防封卡怎么樣 高德地圖標(biāo)注生成 南京外呼系統(tǒng)租用 400電話怎么申請(qǐng)收費(fèi)標(biāo)準(zhǔn) 怎樣在地圖標(biāo)注自己的信息 智能語(yǔ)音外呼系統(tǒng)打電話 400電話辦理2273649Z空間

SQL Server 2005 SP2為我們帶來(lái)了vardecimal功能,當(dāng)時(shí)針對(duì)decimail和numeric數(shù)據(jù)類型推出了新的存儲(chǔ)格式--vardecimal。vardecimal存儲(chǔ)格式允許 decimal和numeric數(shù)據(jù)類型的存儲(chǔ)作為一個(gè)可變長(zhǎng)度列。 這項(xiàng)功能使得原來(lái)定長(zhǎng)的decimal數(shù)據(jù)在數(shù)據(jù)文件中以可變長(zhǎng)的格式存儲(chǔ),據(jù)稱這項(xiàng)功能可以為典型的數(shù)據(jù)倉(cāng)庫(kù)節(jié)省30%的空間,而SQL Server 2008在這一基礎(chǔ)上又進(jìn)一步增強(qiáng)了數(shù)據(jù)壓縮功能。SQL Server 2008現(xiàn)在支持行壓縮和頁(yè)面壓縮兩種選項(xiàng),數(shù)據(jù)壓縮選項(xiàng)可以在以下對(duì)象上啟用:

1.未創(chuàng)建聚簇索引的表
2.創(chuàng)建聚簇索引的表
3.非聚簇索引(對(duì)表設(shè)置壓縮選項(xiàng)不會(huì)影響到該表上的非聚簇索引,因此聚簇索引的壓縮需要單獨(dú)設(shè)置)
4.索引視圖
5.分區(qū)表和分區(qū)索引中的單個(gè)分區(qū)

使用數(shù)據(jù)壓縮的意義:

首先讓我們來(lái)看看,為什么在存儲(chǔ)成本不斷降低的今天,微軟還要煞費(fèi)苦心地在SQL Server中實(shí)現(xiàn)并且不斷改進(jìn)數(shù)據(jù)壓縮技術(shù)呢?

盡管存儲(chǔ)成本已經(jīng)不再是傳統(tǒng)意義上的首要考慮因素,但是這并不代表數(shù)據(jù)庫(kù)尺寸不是一個(gè)問(wèn)題,因?yàn)閿?shù)據(jù)庫(kù)尺寸除了會(huì)影響到存儲(chǔ)成本之外,還極大地關(guān)聯(lián)到管理成本和性能問(wèn)題。

致于為什么會(huì)有管理成本的問(wèn)題?因?yàn)閿?shù)據(jù)庫(kù)需要備份,數(shù)據(jù)庫(kù)的尺寸越大,那么備份時(shí)間就會(huì)越長(zhǎng),當(dāng)然另外一點(diǎn)就是消耗的備份硬件成本也會(huì)隨之提高(包括需要的備份介質(zhì)成本和為了滿足備份窗口而需要更高級(jí)的備份設(shè)備帶來(lái)的采購(gòu)成本),還有一種管理成本就是數(shù)據(jù)庫(kù)的維護(hù)成本,例如我們經(jīng)常需要完成的 DBCC任務(wù),數(shù)據(jù)庫(kù)尺寸越大,我們就需要更多的時(shí)間來(lái)完成這些任務(wù)。

接著我們?cè)倏纯葱阅軉?wèn)題。SQL Server在掃描磁盤(pán)讀取數(shù)據(jù)的時(shí)候都是按照數(shù)據(jù)頁(yè)為單位進(jìn)行讀取的,因此如果一張數(shù)據(jù)頁(yè)中包含的數(shù)據(jù)行數(shù)越多,SQL Server在一次數(shù)據(jù)頁(yè)IO中獲得的數(shù)據(jù)就會(huì)越多,這樣也就帶來(lái)了性能的提升。

最后考慮存儲(chǔ)的成本,按照原先SQL Server 2005 SP2中vardecimal的壓縮數(shù)據(jù)為例,30%的空間節(jié)省也就意味著30%的存儲(chǔ)成本,而按照SQL Server 2008當(dāng)前放出的測(cè)試數(shù)據(jù),采用新的數(shù)據(jù)壓縮技術(shù)可以達(dá)到2X-7X的存儲(chǔ)率,再加上如果企業(yè)要考慮容災(zāi)而增加的存儲(chǔ)空間,這樣節(jié)省的存儲(chǔ)硬件成本也將是想當(dāng)可觀的。

使用數(shù)據(jù)壓縮方法:

SQL Server 2008中的壓縮選項(xiàng)可以在創(chuàng)建表或索引時(shí)通過(guò)Option進(jìn)行設(shè)置,例如:

復(fù)制代碼 代碼如下:
CREATE TABLE TestTable (col1 int, col2 varchar(200)) WITH (DATA_COMPRESSION = ROW);

如果需要改變一個(gè)分區(qū)的壓縮選項(xiàng),則可以用以下語(yǔ)句:
復(fù)制代碼 代碼如下:
ALTER TABLE TestTable REBUILD PARTITION = 1 WITH (DATA COMPRESSION = PAGE);

如果需要為分區(qū)表的各個(gè)分區(qū)設(shè)置不同的壓縮選項(xiàng),可以使用以下的語(yǔ)句:(SQL Server 2008可以對(duì)不同的分區(qū)使用不同的壓縮選項(xiàng),這一點(diǎn)對(duì)于數(shù)據(jù)倉(cāng)庫(kù)應(yīng)用是非常重要的,因?yàn)閿?shù)據(jù)倉(cāng)庫(kù)的事實(shí)表通常都會(huì)有一個(gè)或數(shù)個(gè)熱分區(qū),這些分區(qū)中的數(shù)據(jù)經(jīng)常需要更新,為了避免數(shù)據(jù)壓縮給這些分區(qū)上的數(shù)據(jù)更新帶來(lái)額外的處理載荷,可以對(duì)這些分區(qū)關(guān)閉壓縮選項(xiàng))
復(fù)制代碼 代碼如下:
CREATE TABLE PartitionedTable (col1 int, col2 varchar(200))
ON PS1 (col1)
WITH (
DATA_COMPRESSION = ROW ON PARTITIONS(1),
DATA_COMPRESSION = PAGE ON PARTITION(2 TO 4));

如果是為某個(gè)索引設(shè)置壓縮選項(xiàng)的話,可以使用:

復(fù)制代碼 代碼如下:

CREATE INDEX IX_TestTable_Col1 ON TestTable (Col1) WITH (DATA_COMPRESSION = ROW);

如果是修改某個(gè)索引的壓縮選項(xiàng),可以使用:

復(fù)制代碼 代碼如下:
ALTER INDEX IX_TestTable_Col1 ON TestTable REBUILD WITH (DATA_COMPRESSION = ROW);

SQL Server 2008同時(shí)還提供了一個(gè)名為sp_estimate_data_compression_savings存儲(chǔ)過(guò)程幫助DBA估計(jì)激活壓縮選項(xiàng)后對(duì)象尺寸。

使用數(shù)據(jù)壓縮的原理:

對(duì)于行壓縮,SQL Server 2008采用以下三種方法來(lái)節(jié)省存儲(chǔ)空間:
減少了與記錄相關(guān)聯(lián)的元數(shù)據(jù)開(kāi)銷。此元數(shù)據(jù)為有關(guān)列、列長(zhǎng)度和偏移量的信息。在某些情況下,元數(shù)據(jù)開(kāi)銷可能大于舊的存儲(chǔ)格式。

它對(duì)于數(shù)值類型(例如,integer、decimal和float)和基于數(shù)值的類型(例如,datetime和money)使用可變長(zhǎng)度存儲(chǔ)格式。

它通過(guò)使用不存儲(chǔ)空字符的可變長(zhǎng)度格式來(lái)存儲(chǔ)定長(zhǎng)字符串。
對(duì)于頁(yè)面壓縮,SQL Server 2008則是在一張數(shù)據(jù)頁(yè)面上依次采用:

1.行壓縮
2.前綴壓縮
3.字典壓縮

使用數(shù)據(jù)壓縮注意事項(xiàng):

盡管SQL Server 2008的數(shù)據(jù)壓縮功能非常有價(jià)值,但是仍然需要注意一些問(wèn)題:
數(shù)據(jù)壓縮功能僅在企業(yè)版和開(kāi)發(fā)版中可用

數(shù)據(jù)壓縮可以讓一張數(shù)據(jù)頁(yè)存儲(chǔ)更多的數(shù)據(jù)行,但是并不能改變單行數(shù)據(jù)最長(zhǎng)8060字節(jié)這一限制。

在一張已經(jīng)設(shè)置了數(shù)據(jù)壓縮的表上創(chuàng)建聚簇索引時(shí),聚簇索引默認(rèn)繼承原表上的壓縮選項(xiàng)

在未設(shè)置聚簇索引的表上設(shè)置頁(yè)面壓縮時(shí),只有以下情況才會(huì)獲得頁(yè)面壓縮的實(shí)際效果:

1.數(shù)據(jù)使用BULK INSERT語(yǔ)法添加到表中
2.數(shù)據(jù)使用INSERT INTO ... WITH (TABLOCK)語(yǔ)法添加到表中
3.執(zhí)行帶有頁(yè)面壓縮選項(xiàng)的ALTER TABLE ... REBUILD命令

在未設(shè)置聚簇索引的表上更改壓縮選項(xiàng),會(huì)導(dǎo)致該表上所有非聚簇索引都需要重建,因?yàn)檫@些非聚簇索引指向的數(shù)據(jù)行地址已經(jīng)都發(fā)生了改變。

在改變壓縮選項(xiàng)時(shí)所需要的臨時(shí)空間大小與創(chuàng)建索引是所需要的空間是一樣的,因此對(duì)于分區(qū)表,我們可以逐個(gè)分區(qū)設(shè)置壓縮選項(xiàng)來(lái)減少臨時(shí)空間的需求壓力。

由于SQL Server 2008中數(shù)據(jù)壓縮技術(shù)其實(shí)是SQL Server 2005 SP2中vardecimal技術(shù)的一個(gè)超集,因此設(shè)置了數(shù)據(jù)壓縮后就沒(méi)有必要保留vardecimal了。當(dāng)然SQL Server 2008為了保持向后兼容性,在當(dāng)前版本中仍然保留了vardecimal,但是SQL Server 2008的下一個(gè)版本及可能就會(huì)棄用vardecimal選項(xiàng),因此做了這些設(shè)置的數(shù)據(jù)庫(kù)應(yīng)該盡早改變到數(shù)據(jù)壓縮設(shè)置下。

SQL Server 2008的壓縮選項(xiàng)是工作在存儲(chǔ)引擎層的,對(duì)于SQL Server的其他部件來(lái)說(shuō)這一特性是透明的,因此當(dāng)我們用BULK LOAD的方式將外面的數(shù)據(jù)導(dǎo)入SQL Server時(shí),會(huì)顯著的增加CPU的工作載荷,同時(shí)將以壓縮的數(shù)據(jù)表導(dǎo)出到外部文件時(shí),可能會(huì)消耗比原來(lái)多很多的空間。

下面是其他網(wǎng)友的補(bǔ)充

SQL Server 2008中的數(shù)據(jù)壓縮

SQL Server 2008中引入了數(shù)據(jù)壓縮的功能,允許在表、索引和分區(qū)中執(zhí)行數(shù)據(jù)壓縮。這樣不僅可以大大節(jié)省磁盤(pán)的占用空間,還允許將更多數(shù)據(jù)頁(yè)裝入內(nèi)存中,從而降低磁 盤(pán)IO,提升查詢的性能。當(dāng)然,凡事有利有弊,在啟用數(shù)據(jù)壓縮后,數(shù)據(jù)庫(kù)服務(wù)器就需要額外的CPU資源來(lái)進(jìn)行壓縮處理。一般說(shuō)來(lái),數(shù)據(jù)庫(kù)服務(wù)器的CPU占 用率不會(huì)太高,而磁盤(pán)IO容易成為瓶頸,所以在大多數(shù)情況下對(duì)大數(shù)據(jù)庫(kù)特別是數(shù)據(jù)倉(cāng)庫(kù)啟用該項(xiàng)功能還是利大于弊。

SQL Server 2008的數(shù)據(jù)壓縮分為行壓縮和頁(yè)壓縮兩種。行壓縮主要是通過(guò)將固定長(zhǎng)度類型存儲(chǔ)為可變長(zhǎng)度類型來(lái)實(shí)現(xiàn),同時(shí)還減少了與記錄相關(guān)聯(lián)的元數(shù)據(jù)開(kāi)銷。頁(yè)壓縮在行壓縮的基礎(chǔ)上又增加了前綴壓縮和字典壓縮,能獲得更大的壓縮率。

要 啟用數(shù)據(jù)庫(kù)壓縮只需在建表語(yǔ)句后加入WITH (DATA_COMPRESSION = ROW)或是WITH (DATA_COMPRESSION = PAGE)即可。如需將現(xiàn)有的索引修改為啟用壓縮,可通過(guò)ALTER INDEX index ON Table REBUILD WITH (DATA_C0MPRESSION=ROW)或ALTER INDEX index ON Table REBUILD WITH (DATA_C0MPRESSION=PAGE)實(shí)現(xiàn)。

最后提供一段簡(jiǎn)單的用以判斷是否需要壓縮數(shù)據(jù)表的腳本,并自動(dòng)生成壓縮腳本供系統(tǒng)管理員執(zhí) 行。這里用到未公開(kāi)的存儲(chǔ)過(guò)程sp_MSforeachtable。在這段腳本中@precommand參數(shù)用于執(zhí)行command指令執(zhí)行前的SQL命 令,建立一張臨時(shí)表用于保存數(shù)據(jù)表的信息,@command1參數(shù)表示需要執(zhí)行的SQL命令,對(duì)每一張表都利用sp_spaceused存儲(chǔ)過(guò)程獲取表的 磁盤(pán)占用信息并保存到建立的臨時(shí)表中,@postcommand參數(shù)用于執(zhí)行command指令后的SQL命令,將之前建立的臨時(shí)表與系統(tǒng)關(guān)聯(lián),根據(jù)設(shè)置 的條件(數(shù)據(jù)表占用空間大于10G)生成數(shù)據(jù)表壓縮腳本。

exec sp_MSforeachtable
@precommand=N'
create table ##(
id int identity,
name sysname,
rows int,
reserved Nvarchar(50),
data varchar(50),
indexdata varchar(50),
unused varchar(50))',
@command1=N'insert into ##(name,rows,reserved,data,indexdata,unused) exec sp_spaceused ''?''
update ## set data=SUBSTRING(data, 1, LEN(data) - 2) where id=scope_identity() AND LEN(data) >=2',
@postcommand=N'SELECT ''ALTER TABLE '' + TABLENAME + '' REBUILD WITH ( DATA_COMPRESSION = PAGE )'' FROM sys.tables A
JOIN
(SELECT C.name + ''.'' + A.name AS TABLENAME, object_id FROM ## A
JOIN sys.objects B
ON A.name = B.name
JOIN sys.schemas C
ON B.schema_id = C.schema_id
WHERE CAST(data AS int) > 10000000 AND object_id IN (SELECT object_id FROM sys.tables)) B
ON A.object_id = B.object_id AND type = ''U'';drop table ##'

相信到了這里,朋友們對(duì)于SQL Server 2008中的數(shù)據(jù)壓縮技術(shù)有了一個(gè)較為全面的了解。

標(biāo)簽:平頂山 茂名 長(zhǎng)白山 貴港 唐山 仙桃 潛江 惠州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《SQL Server 2008中的數(shù)據(jù)表壓縮功能詳細(xì)介紹》,本文關(guān)鍵詞  SQL,Server,2008,中的,數(shù)據(jù)表,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《SQL Server 2008中的數(shù)據(jù)表壓縮功能詳細(xì)介紹》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于SQL Server 2008中的數(shù)據(jù)表壓縮功能詳細(xì)介紹的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    抚州市| 资阳市| 湟源县| 防城港市| 扶余县| 米脂县| 诸暨市| 巴彦淖尔市| 大渡口区| 柳江县| 阳新县| 巧家县| 延寿县| 昌都县| 五华县| 正阳县| 建阳市| 资兴市| 永年县| 崇阳县| 新源县| 仁化县| 礼泉县| 玉环县| 塔河县| 龙岩市| 洪雅县| 房产| 定州市| 梓潼县| 绥宁县| 安庆市| 盱眙县| 临城县| 平和县| 武山县| 金堂县| 汕尾市| 遂宁市| 建水县| 泾阳县|