程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQL Server 2008中的稀疏列和列集

SQL Server 2008中的稀疏列和列集

編輯:關於SqlServer

  這是兩個新增的特性。

  我的總結如下

  1. 稀疏列主要是為了提供對可空字段的更好一個存儲機制,它可以節省空間(具體說它在真正空值的時候就不占空間),但也會帶來一些性能方面的影響。所以要有所權衡。

  稀疏列主要使用場景:一個實體有很多屬性列,但很多屬性都可能填不滿。這在以前我們稱為屬性集問題。

  稀疏列不是一個數據類型,它是一個列的屬性而已。

  2. 列集是可以定義所有稀疏列的集合。這是一個XML數據類型。如果為多個稀疏列定義了一個列集,那麼針對這些列的修改,就既可以直接修改這些列,也可以通過一次性通過修改列集字段來完成。列集字段其實是一個計算字段。

  下面來看一個例子

  首先,看看如何使用稀疏列。這裡的關鍵在於定義的時候使用SPARSE關鍵字

USE AdventureWorks 
GO 
 
CREATE TABLE DocumentStore 
(DocID int PRIMARY KEY, 
Title varchar(200) NOT NULL, 
ProductionSpecification varchar(20) SPARSE NULL, 
ProductionLocation smallint SPARSE NULL, 
MarketingSurveyGroup varchar(20) SPARSE NULL ) ; 
GO 

--插入數據是一模一樣的 
INSERT DocumentStore(DocID, Title, ProductionSpecification, ProductionLocation) 
VALUES (1, 'Tire Spec 1', 'AXZZ217', 27) 
GO 
 
INSERT DocumentStore(DocID, Title, MarketingSurveyGroup) 
VALUES (2, 'Survey 2142', 'Men 25 - 35') 
GO
然後,我們看看如何把列集與稀疏列進行結合使用

USE AdventureWorks; 
GO 
 
CREATE TABLE DocumentStoreWithColumnSet 
(DocID int PRIMARY KEY, 
Title varchar(200) NOT NULL, 
ProductionSpecification varchar(20) SPARSE NULL, 
ProductionLocation smallint SPARSE NULL, 
MarketingSurveyGroup varchar(20) SPARSE NULL, 
MarketingProgramID int SPARSE NULL, 
SpecialPurposeColumns XML COLUMN_SET FOR ALL_SPARSE_COLUMNS);--目前這裡只是支持ALL_SPARSE_COLUMNS這個關鍵字,也就是說所有的稀疏列 
GO

--使用列集之後,既可以直接使用列集插入數據,也可以使用稀疏列本身插入數據

INSERT DocumentStoreWithColumnSet (DocID, Title, ProductionSpecification, ProductionLocation) 
VALUES (1, 'Tire Spec 1', 'AXZZ217', 27) 
GO 
 
INSERT DocumentStoreWithColumnSet (DocID, Title, MarketingSurveyGroup) 
VALUES (2, 'Survey 2142', 'Men 25 - 35') 
GO


INSERT DocumentStoreWithColumnSet (DocID, Title, SpecialPurposeColumns) 
VALUES  (3, 'Tire Spec 2',  '<ProductionSpecification>AXW9R411</ProductionSpecification><ProductionLocation>38</ProductionLocation>')  
GO
有意思的是,此時如果再以SELECT *的語法查詢該表的話,那些稀疏列默認是不會被返回的,而只是返回列集

  當然啦,如果還是想返回稀疏列本身的內容,我們可以通過下面的語法

  SELECT  DocID, Title, ProductionSpecification, ProductionLocation FROM  DocumentStoreWithColumnSet WHERE ProductionSpecification IS NOT NULL ;

  至於更新,和插入一樣,兩種方式都是可以的,且效果一樣

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved