SQL Server 2008稀疏列使用心得(下)

日期: 2009-08-16 作者:Robert Sheldon翻译:孙瑞 来源:TechTarget中国 英文

使用列集   SQL Server 2008还有一个特性与稀疏列相关的,就是列集。列集同计算列相似,不同的地方就是你可以更新数据。   一个表只可以包含一个列集,并且要严格遵循像许多限制。比如,你无法将已定义为稀疏列的列集添加到表中。

然而,在已经定义为列集的表中你却可以添加稀疏列。在使用稀疏列时,你可以遵循SQL Server 2008在线指南列出的原则。   要创建一个列集,你可以在CREATE TABLE语句中添加如下的XML列定义t-sql脚本:   IF EXISTS (SELECT table_name   FROM information_s……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

使用列集

  SQL Server 2008还有一个特性与稀疏列相关的,就是列集。列集同计算列相似,不同的地方就是你可以更新数据。

  一个表只可以包含一个列集,并且要严格遵循像许多限制。比如,你无法将已定义为稀疏列的列集添加到表中。然而,在已经定义为列集的表中你却可以添加稀疏列。在使用稀疏列时,你可以遵循SQL Server 2008在线指南列出的原则。

  要创建一个列集,你可以在CREATE TABLE语句中添加如下的XML列定义t-sql脚本:

  IF EXISTS (SELECT table_name
  FROM information_schema.tables
  WHERE table_name = 'Products')
  DROP TABLE Products
  GO
  CREATE TABLE Products
  (
  ProductID INT NOT NULL PRIMARY KEY,
  ProductName NVARCHAR(50) NOT NULL,
  ProductColor NVARCHAR(15) SPARSE NULL,
  ProductWeight DECIMAL(8,2) SPARSE NULL,
  SellEndDate DATETIME SPARSE NULL,
  ProductInfo XML COLUMN_SET FOR ALL_SPARSE_COLUMNS
  )
  GO
  INSERT INTO Products
  (ProductID, ProductName, ProductColor, ProductWeight, SellEndDate)
  SELECT ProductID, Name, Color, Weight, SellEndDate
  FROM Production.Product
  GO

  表定义显示,现在的结果同之前的例子差不多,只是现在表中包含了一个ProductInfo列。注意列是用XML文件类型进行定义的,它包含COLUMN_SET FOR ALL_SPARSE_COLUMNS关键字。

  以上就是在表中创建列集需要做的事。当你从表中检索数据时,查询引擎将自动返回一个结构化数据集,它将包含稀疏列中的所有非空值。比如,如果你运行以上的SELECT语句,你将得到以下结果(只显示前10行):

1 Adjustable Race NULL
2 Bearing Ball NULL
3 BB Ball Bearing NULL
4 Headset Ball Bearings NULL
316 Blade NULL
317 LL Crankarm <ProductColor>Black</ProductColor>
318 ML Crankarm <ProductColor>Black</ProductColor>
319 HL Crankarm <ProductColor>Black</ProductColor>
320 Chainring Bolts <ProductColor>Silver</ProductColor>
321 Chainring Nut <ProductColor>Silver</ProductColor>

  正如你所见,ProductInfo列包含了产品数据,以XML文档显示。如果稀疏列的值全为空,那么将只返回一个空值。

  注意,结果集中不包含独立的稀疏列。当你在配置了列集的表中使用SELECT *检索数据时,将只返回列集和非稀疏列。然而,如果你在SELECT语句中指定稀疏列名称,列将会返回。比如,以下SELECT语句:

  SELECT ProductID, ProductName, ProductColor
  FROM Products
  WHERE SellEndDate IS NOT NULL

  下表显示了前十行的返回数据:


709 Mountain Bike Socks, M White
710 Mountain Bike Socks, L White
725 LL Road Frame - Red, 44 Red
726 Road Frame - Red, 48 Red
727 Road Frame - Red, 52 Red
728 Road Frame - Red, 58 Red
729 Road Frame - Red, 60 Red
730 Road Frame - Red, 62 Red
731 Road Frame - Red, 44 Red
732 Road Frame - Red, 48 Red

  就像上面提到的,当你检索一个列集时,所有的非空稀疏列数据都将返回。比如,ProductColor, ProductWeight 和 SellEndDate列都包含值,列集返回的结果如下:

  Red

  2.26

  2002-06-30T00:00:00

  注意结果中包含每个稀疏列的同一元素。

  使用过滤索引

  SQL Server 2008中的另一个和稀疏列相关的新特性就是过滤索引。过滤索引是一个非群集索引,它是在数据子集基础上定义的。例如,你希望在Product表中索引ProductName列时提高查询的性能。你可以创建一个过滤索引,不包含空值,像下面的例子一样。

  CREATE NONCLUSTERED INDEX ixProductName
  ON Products (ProductName)
  WHERE SellEndDate IS NOT NULL

  非群集索引和过滤索引最基本的区别就是你需要在过滤索引定义中指定一个WHERE语句。这样的话,索引只会建立在非空值基础上。所有其他值都包含在索引内。

  在使用稀疏列时,过滤索引可以帮你提升性能,减小存储压力。同列集一起使用,稀疏列和过滤索引有利于的你的部署,不过在使用之前要格外注意,使用过多的稀疏列和过滤索引,要求你的数据库要有良好的设计架构。在设计良好的情况下,稀疏列、列集和过滤索引绝对是使用SQL Server的好工具。

翻译

孙瑞
孙瑞

相关推荐