SQL Server數(shù)據(jù)表壓縮
概述
SQL Server的主要性能取決于磁盤I/O效率,SQL Server 。
2008提供了數(shù)據(jù)壓縮功能來(lái)提高磁盤I/O效率。
表壓縮意味著減小數(shù)據(jù)的磁盤占有量,所以壓縮可以用在堆表、聚集索引的表、非聚集索引的表、索引視圖、分區(qū)表上。
可壓縮的數(shù)據(jù)類型
smallint、int、Bigint、decimal、numeric、real、float、money、smallmoeny、bit、datetime、datetime2、datetimeoffset、char、nchar、binary、rowversion。
SQLServer中有兩種壓縮類型:數(shù)據(jù)與備份
行壓縮
壓縮會(huì)改變數(shù)據(jù)的物理存儲(chǔ)方式,但不需要對(duì)代碼做任何修改。
行壓縮流程:首先識(shí)別表中每一列的數(shù)據(jù)類型,然后轉(zhuǎn)換為可變長(zhǎng)度,最后將存儲(chǔ)空間的請(qǐng)求總量減少到實(shí)際需求量。
如:固定長(zhǎng)度的類型int、char、nchar等,在數(shù)據(jù)頁(yè)中以不定長(zhǎng)度的方式存儲(chǔ)(存儲(chǔ)真實(shí)數(shù)據(jù)長(zhǎng)度)。
1、SSMS行壓縮
表->右鍵->存儲(chǔ)->管理壓縮->對(duì)所有分區(qū)使用相同壓縮類型->右側(cè) 選擇row->立即執(zhí)行->完成。
ALTER TABLE [dbo].[AnnexFileList] REBUILD PARTITION = ALL WITH ( DATA_COMPRESSION = ROW );
在壓縮堆表或聚集索引時(shí)并不同時(shí)包含非聚集索引,因此需要另外單獨(dú)對(duì)非聚集索引進(jìn)行操作。
索引->右鍵->存儲(chǔ)->管理壓縮->對(duì)所有分區(qū)使用相同壓縮類型->右側(cè) 選擇row->立即執(zhí)行->完成。
ALTER INDEX [PK_ANNEXFILELIST]
ON [dbo].[AnnexFileList] REBUILD PARTITION = ALL
WITH ( DATA_COMPRESSION = ROW );2、T-SQL行壓縮
--在現(xiàn)有表進(jìn)行壓縮
--聚集
alter table ceshi rebuild with(data_compression=row)
--非聚集
alter index new_name on ceshi rebuild with(data_compression=row)
--在創(chuàng)建表時(shí)進(jìn)行壓縮
create table yasuo
(
id int primary key,
name varchar(50),
mail varchar(50)
)
with (data_compression=row)創(chuàng)建時(shí)指定行壓縮方式,這時(shí)并未發(fā)生改變。只要數(shù)據(jù)插入表中,該行即被壓縮。
頁(yè)壓縮
頁(yè)壓縮通過(guò)執(zhí)行額外的一些步驟增強(qiáng)了行壓縮的功能。
頁(yè)壓縮步驟:行壓縮、前綴壓縮、字典壓縮。
首先對(duì)于每一列將確定一個(gè)值,此值可以減少每一列中值的存儲(chǔ)空間。一旦確定該值后,每一列的前綴值的行將被存儲(chǔ)在頁(yè)頭中。所有的信息稱為壓縮信息,存儲(chǔ)在頁(yè)頭之下。標(biāo)識(shí)的值(前綴值)位于沒列中,將由指向壓縮信息部分中對(duì)應(yīng)值的引用進(jìn)行替換。
下一步字典壓縮,搜索整個(gè)頁(yè)面而非單個(gè)列,重復(fù)值被移動(dòng)到頁(yè)頭的壓縮信息部分,取而代之的是指向該值的引用。
在SSMS中頁(yè)壓縮步驟與行壓縮步驟一致,只是選擇壓縮方式為Page。T-SQL中將row改成page即可。
需要注意
1、如果保留在內(nèi)存中的數(shù)據(jù)是壓縮的,一旦被選中,則必須先進(jìn)行解壓縮。
2、在插入新行時(shí),數(shù)據(jù)也是行或頁(yè)壓縮的。
3、當(dāng)更新或刪除時(shí),行壓縮對(duì)象保留當(dāng)前的壓縮級(jí)別。但是頁(yè)壓縮可能需要重新計(jì)算,取決于發(fā)生變化的數(shù)據(jù)量。
用哪種壓縮
- 需要頻繁更新的對(duì)象應(yīng)該使用行壓縮。
- 只是執(zhí)行讀取操作的應(yīng)該使用頁(yè)壓縮。
到此這篇關(guān)于SQL Server數(shù)據(jù)表壓縮的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
幾個(gè)擴(kuò)展存儲(chǔ)過(guò)程使用方法
sqlserver里面有一些危險(xiǎn)的擴(kuò)展存儲(chǔ)過(guò)程,可以操作注冊(cè)表,所以很多情況下,下面的存儲(chǔ)過(guò)程為了服務(wù)器安全都會(huì)將這些存儲(chǔ)過(guò)程刪除。不過(guò)防御與安全同等重要。下面是具體的注冊(cè)的操作方法。2010-07-07
數(shù)據(jù)庫(kù)中聚簇索引與非聚簇索引的區(qū)別[圖文]
在《數(shù)據(jù)庫(kù)原理》里面,對(duì)聚簇索引的解釋是:聚簇索引的順序就是數(shù)據(jù)的物理存儲(chǔ)順序,而對(duì)非聚簇索引的解釋是:索引順序與數(shù)據(jù)物理排列順序無(wú)關(guān)。正式因?yàn)槿绱?,所以一個(gè)表最多只能有一個(gè)聚簇索引2012-02-02
SQL Server實(shí)現(xiàn)顯示每個(gè)類別最新更新數(shù)據(jù)的方法
這篇文章主要介紹了SQL Server實(shí)現(xiàn)顯示每個(gè)類別最新更新數(shù)據(jù)的方法,涉及SQL Server數(shù)據(jù)庫(kù)Select查詢操作使用技巧,需要的朋友可以參考下2017-03-03
SQL對(duì)數(shù)據(jù)進(jìn)行按月統(tǒng)計(jì)或?qū)?shù)據(jù)進(jìn)行按星期統(tǒng)計(jì)的實(shí)例代碼
這篇文章主要介紹了SQL對(duì)數(shù)據(jù)進(jìn)行按月統(tǒng)計(jì)或?qū)?shù)據(jù)進(jìn)行按星期統(tǒng)計(jì)的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08
SQL Server誤區(qū)30日談 第8天 有關(guān)對(duì)索引進(jìn)行在線操作的誤區(qū)
在線索引操作會(huì)在操作開始時(shí)和操作結(jié)束時(shí)對(duì)資源上短暫的鎖。這有可能導(dǎo)致嚴(yán)重的阻塞問(wèn)題2013-01-01
SQL Server 2012使用Offset/Fetch Next實(shí)現(xiàn)分頁(yè)數(shù)據(jù)查詢
在Sql Server 2012之前,實(shí)現(xiàn)分頁(yè)主要是使用ROW_NUMBER(),在SQL Server2012,可以使用Offset ...Rows Fetch Next ... Rows only的方式去實(shí)現(xiàn)分頁(yè)數(shù)據(jù)查詢,具體代碼詳解大家參考下本文2017-07-07
SQL?Server?查詢死鎖及解決死鎖的基本知識(shí)(最新整理)
在 SQL Server 中,死鎖是指兩個(gè)或多個(gè)進(jìn)程互相等待對(duì)方持有的資源,從而無(wú)法繼續(xù)執(zhí)行的現(xiàn)象,這篇文章主要介紹了SQL?Server?查詢死鎖以及解決死鎖的基本知識(shí),需要的朋友可以參考下2024-07-07
sql?server自動(dòng)生成拼音首字母的函數(shù)
建立一個(gè)查詢,執(zhí)行語(yǔ)句生成函數(shù)fn_GetPy,下面是具體的實(shí)現(xiàn),需要的朋友可以參考下2014-01-01



