设为首页 收藏本站
查看: 599|回复: 0

[经验分享] 《Microsoft Sql server 2008 Internals》读书笔记--第七章Special Storage(5)

[复制链接]

尚未签到

发表于 2016-11-7 09:26:44 | 显示全部楼层 |阅读模式
《Microsoft Sql server 2008 Internals》索引目录:  《Microsoft  Sql server 2008 Internals》读书笔记--目录索引
  上文简单介绍了 filestream数据存储和修改的一些特性。下面我们来继续了解SQL Server 2008中新增的稀疏列(sparse column),它可以看作是对Null值作了优化存储的普通列。

  稀疏列削减了针对null值的空间存储。允许你有更多的列,而不是之前的1024列,只要它们中的大多数是null值。使用稀疏列的成本是存非null值的存储和取回的开销。
  稀疏列的管理
  如果一个列的90%可能null,那么可以考虑使用稀疏列,这不是一个强制规定。而在SQL Server 2008中可以允许一个表有30000列,但非稀疏列不能超过1024列。(计算列不算作非稀疏列) 计算列的数量取决于行数据和字节数。(在第五章中已经介绍过,一个固定长度的列通常使用整个列宽,一个可变长的Null列在列偏移数组中至少使用两字节)。稀疏列本身不占空间,一些固定的开销是允许稀疏列在行中必需的。一旦你用sparse属性定义一个列,SQL Server在行的末尾处定义一个稀疏向量,我们将在后面的节中“物理存储”中继续了解。但行的大小不超过8060字节,包括稀疏列。此外,行中所有固定长度的非null稀疏列不超过8019字节。
  表创建
  看一个例子:
  USE testdb;GOCREATE TABLE test_nosparse(col1 int,col2 char(8000),col3 varchar(8000));GOINSERT INTO test_nosparseSELECT null, null, null;INSERT INTO test_nosparseSELECT 1, 'a', 'b';GO
  成功插入数据。但另一个表
  CREATE TABLE test_sparse(col1 int SPARSE,col2 char(8000) SPARSE,col3 varchar(8000) SPARSE);GOINSERT INTO test_sparseSELECT NULL, NULL, NULL;INSERT INTO test_sparseSELECT 1, 'a', 'b';GO--Msg 576, Level 16, State 5, Line 3--Cannot create a row that has sparse data of size 8042 which is greater than the allowable maximum sparse data size of 8019.
为什么出错?int(4字节)+char(8000字节)+24字节对应行溢出指针,超过8019字节。
表修改
  可以修改一个表的非稀疏列为稀疏列,反之亦然。 但是小心。困为如果你修改一个比较大的行,而该行中没有稀疏列改为稀疏列时,将会减少允许在一个页面中的数据的字节数,这可能导致出错。
  看例子:
  IF EXISTS (SELECT * FROM sys.tables        WHERE name = 'test_nosparse_alter')DROP TABLE test_nosparse_alter;GOCREATE TABLE test_nosparse_alter(c1 int,c2 char(4020) ,c3 char(4020) ,c4 datetime);GOINSERT INTO test_nosparse_alter SELECT NULL, NULL, NULL, NULL;INSERT INTO test_nosparse_alter SELECT 1, 1, 'b', GETDATE();GOALTER TABLE test_nosparse_alterALTER COLUMN c4 datetime SPARSE;--Msg 1701, Level 16, State 1, Line 1--Creating or altering table 'test_nosparse_alter' failed because the minimum row size would be 8075, including 23 bytes of internal overhead. This exceeds the maximum allowable table row size of 8060 bytes.
除了上述限制外,还有:
  一个稀疏列不能有一个默认值
■列集中不能定义约束或默认值
包含列集的表中不支持分发查询(distribute queries)
列集不支持复制
<span style="" font-size:"="">■the change Data Capture feature dos not support COLUMN_sets
列集不能做为任何索引的一部分,包括xml索引,全文索引和索引视图。列集不能被作为包含性列添加到任何索引。
在一个筛选索引的筛选表达式或筛选声明中不能使用列集。
当一个视图包含列集时,列集作为一个xml列出现在视图中。
XML数据有2G限制。如果一行中所有non-null稀疏列的复合数据超过这个限制,操作错误。
使用一个列集从表中复制所有的数据(使用select * into 或insert into select * )并不复制单个的稀疏列。列集作为一个xml数据列被复制。
  关于稀疏列的使用,这里有一篇权威的文章,http://msdn.microsoft.com/en-us/library/cc280604.aspx
  关于列集的官方使用,请看:http://msdn.microsoft.com/zh-cn/library/cc280521.aspx
  下文我们看看稀疏列的物理存储。
邀月注:本文版权由邀月和CSDN共同所有,转载请注明出处。
助人等于自助! 3w@live.cn

  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-296857-1-1.html 上篇帖子: 利用配置文件实现SQL-Server与Oralce数据库访问类的转换 下篇帖子: 在.NET中根据SQL Server系统表获取数据库管理信息
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表