本文簡要介紹MAX-Length數(shù)據(jù)及添加數(shù)據(jù)到LOB列的存儲,另外主要介紹filestream 數(shù)據(jù)的基
本文簡要介紹MAX-Length數(shù)據(jù)及添加數(shù)據(jù)到LOB列的存儲,另外主要介紹filestream 數(shù)據(jù)的基礎(chǔ)。
SQL2005/2008給我們MAX定義符選項(xiàng)來定義可變長度字段。通過MAX定義,你可以讓SQL Server來決定存儲值作為常規(guī)的varchar,nvarchar或varbinary或LOB數(shù)據(jù)(通常在大于8000字節(jié)時會使用text,ntext,image)。
在存儲引擎中,每一個LOB列被分解成不大于8040字節(jié)的碎片。當(dāng)附加數(shù)據(jù)到LOB列時,SQL Server查找附加點(diǎn),并試圖尋找新數(shù)據(jù)將被增加的位置,新老數(shù)據(jù)如果合起來大于8040字節(jié),那么分配一個大對象頁(Large Object Page)直到余下的碎片小于8040字節(jié),再尋找一個頁存放其余的字節(jié)。當(dāng)SQL Server為LOB數(shù)據(jù)分配頁時,它有兩個分配策略:(1)如果數(shù)據(jù)小于64Kb,隨機(jī)分配一個頁。這個頁來自一個大對象IAM的部分的一個范圍(extent),但頁不一定是連續(xù)的。(2)如果大于64KB,它使用一個附加頁分配器,一次性的分配一個范圍,在這個范圍中連續(xù)地寫數(shù)據(jù)。因而,推薦的做法是:如果需要插入64KB數(shù)據(jù),那么一次插入8*8040時,數(shù)據(jù)將是繼續(xù)存放的,而且是在一個范圍(extent)內(nèi)。
如果你發(fā)現(xiàn)一個Large Object 數(shù)據(jù)變得越來越碎片,可以使用ALter Index reorganize選項(xiàng)來整理它。前提是默認(rèn)打開為ON的WithLOB_compaction選項(xiàng)你沒有關(guān)閉它。
文件流數(shù)據(jù)(FileStream Data)
盡管SQL Server提供了很大的便利,使得你可以在中靈活存儲Large object Data。好處:
1、大對象數(shù)據(jù)的事務(wù)一致性可以保證。
2、包含大對象數(shù)據(jù)的備份與恢復(fù),允許你完整地在某個時刻點(diǎn)恢復(fù)大對象數(shù)據(jù)。
3、所有的數(shù)據(jù)使用一個單一的存儲和查詢環(huán)境。
但是也有一些不利因素:
1、大對象數(shù)據(jù)在緩存中占用大量的緩沖器。
2、更新一個大對象會引起大范圍的數(shù)據(jù)整理。
3、數(shù)據(jù)庫文件會變得非常大。
SQL Server 2008 和 SQL Server Native Client 10.0 支持增強(qiáng)的 FILESTREAM 功能。FILESTREAM 功能允許通過 SQL Server 或通過直接訪問 Windows 文件系統(tǒng)來存儲和訪問大型二進(jìn)制值。大型二進(jìn)制值是大于 2 GB 的值。有關(guān)增強(qiáng)的 FILESTREAM 支持的詳細(xì)信息,請參閱FILESTREAM 概述。文件流來作為一種大數(shù)據(jù)存儲方案,其優(yōu)勢:
1、大對象數(shù)據(jù)存儲在文件系統(tǒng)中卻在數(shù)據(jù)庫中有一個48字節(jié)的文件指針值存儲在包含文件流的列中。
2、大對象數(shù)據(jù)可以通過T-SQL和NTFS 流APIs來訪問。
3、大對象數(shù)據(jù)的大小僅受限于NTFS值大小,而不是老的2GB大小限制(LOB數(shù)據(jù))
劣勢:
1、數(shù)據(jù)庫鏡像不能被用于包含文件流數(shù)據(jù)的數(shù)據(jù)庫。
2、數(shù)據(jù)庫快照不能包含文件流文件組,因而,文件流數(shù)據(jù)不可用。在快照中使用slect請求一個文件流列會出錯。
3、文件流數(shù)據(jù)不能被SQL Server本地加密。