欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SqlServer2008实例22表基础之减少NULL列的存储空间

程序员文章站 2023-03-08 11:01:37
SQL Server 2008引入了稀疏列,它是一种优化的存储方式,为NULL值启用零字节的存储。因此,可以为表定义大量的稀疏列(到编写本书时,可允许30 000个稀疏列)。当数据库设计和应用程序需要大量不常填充的列,或表中列集只和表中存储数据的子集相关时,这个改进是理想的。 1.定义一个稀疏列,只需要在CREATE或ALTER TABLE命令中的列定义之后添加SPARSE存储属性即可:USE AdventureWorksGOCREATE TABLE dbo.WebsitePro......

    SQL Server 2008引入了稀疏列,它是一种优化的存储方式,为NULL值启用零字节的存储。因此,可以为表定义大量的稀疏列(到编写本书时,可允许30 000个稀疏列)。当数据库设计和应用程序需要大量不常填充的列,或表中列集只和表中存储数据的子集相关时,这个改进是理想的。
    1.定义一个稀疏列,只需要在CREATE或ALTER TABLE命令中的列定义之后添加SPARSE存储属性即可:

USE AdventureWorks
GO

CREATE TABLE dbo.WebsiteProduct
(
	WebsiteProductID int NOT NULL PRIMARY KEY IDENTITY(1,1),
	ProductNM varchar(255) NOT NULL,
	PublisherNM varchar(255) SPARSE NULL,
	ArtistNM varchar(150) SPARSE NULL,
	ISBNNBR varchar(30) SPARSE NULL,
	DiscsNBR int SPARSE NULL,
	MusicLabelNM varchar(255) SPARSE NULL
)

 2.插入两个新行

USE AdventureWorks
GO

INSERT dbo.WebsiteProduct
	(ProductNM,PublisherNM,ISBNNBR)
VALUES
	('SQL Server 2008 Transact-SQL Recipes','Apress','1590599802')

INSERT dbo.WebsiteProduct
	(ProductNM,ArtistNM,DiscsNBR,MusicLableNM)	
VALUES
	('Etiquette','Casiotone',1,'Tomlab')	

3.查询一下结果

SELECT ProductNM,PublisherNM,ISBNNBR
FROM dbo.WebsiteProduct
WHERE ISBNNBR IS NOT NULL

SqlServer2008实例22表基础之减少NULL列的存储空间

   4.使用列集。使用列集可以对所有定义在表中的稀疏列进行逻辑分组。xml数据类型计算列允许SELECT和数据修改,它通过在列定义之后指定COLUMN S盯FOR ALL SPARSE COLUMNS进行定义。一个表只可以有一个列集,并且也不可以在已经定义了稀疏列的表增加列集。下南重新创建前面的表,不过这次会包含列集:
 

USE AdventureWorks
GO

DROP TABLE dbo.WebsiteProduct

CREATE TABLE dbo.WebsiteProduct
(
	WebsiteProductID int NOT NULL PRIMARY KEY IDENTITY(1,1),
	ProductNM varchar(255) NOT NULL,
	PublisherNM varchar(255) SPARSE NULL,
	ArtistNM varchar(150) SPARSE NULL,
	ISBNNBR varchar(30) SPARSE NULL,
	DiscsNBR int SPARSE NULL,
	MusicLableNM varchar(255) SPARSE NULL,
	ProductAttributeCS xml COLUMN_SET FOR ALL_SPARSE_COLUMNS
)

--重新插入数据
INSERT dbo.WebsiteProduct
	(ProductNM,PublisherNM,ISBNNBR)
VALUES
	('SQL Server 2008 Transact-SQL Recipes','Apress','1590599802')

INSERT dbo.WebsiteProduct
	(ProductNM,ArtistNM,DiscsNBR,MusicLableNM)	
VALUES
	('Etiquette','Casiotone','1','Tomlab')	
	
SELECT ProductNM,ProductAttributeCS
FROM dbo.WebsiteProduct
WHERE ProductNM IS NOT NULL

SqlServer2008实例22表基础之减少NULL列的存储空间

结果中看到的,每一行都展示了显示所有非NULL列值元素的无类型的XML数据。可以使用INSERT和UPDATE来修改所有稀疏列的值。随后的查询演示了添加一个新行:
 

USE AdventureWorks
GO

INSERT dbo.WebsiteProduct
	(productNM,productAttributeCS)
VALUES
	(
		'Roots & Echoes',
		'<ArtistNM>The Coral</ArtistNM>
		<DiscsNBR>1</DiscsNBR>
		<MusicLableNM>Deltasonic</MusicLableNM>'
	)

    任何未在DML操作中引用的稀疏列都将被置为NULL值。一旦表定义了列集,执行SELECT凇查询将不会再返回所有稀疏列,如下面的查询演示的(只有非稀疏列和列集);

USE AdventureWorks
GO

SELECT * 
FROM dbo.WebsiteProduct

SqlServer2008实例22表基础之减少NULL列的存储空间

 可以显式地命名每个疏列:

SELECT ProductNM,ArtistNM
FROM dbo.WebsiteProduct
WHERE ArtistNM IS NOT NULL

 SqlServer2008实例22表基础之减少NULL列的存储空间

本文地址:https://blog.csdn.net/ngbshzhn/article/details/107320905