硬核干货——《中小企业 AI 实战指南》免费下载! 了解详情
写点什么

SQL Server 2008 中的新特性——稀疏列、条件过滤索引和列集

  • 2008-09-07
  • 本文字数:1347 字

    阅读完需:约 4 分钟

Sparse Columns(稀疏列), Filtered Indexes(条件过滤索引)和 Column Sets(列集)是 SQL Server 2008 中的新特性,它们使我们可以打破 1024 个列的限制,以及有效地节省磁盘空间,但是,如果使用不当的话,它们就会成为灾难之源。

如其名称所暗示,Spare Column 就是为了解决某些列中通常情况下为 null 值的情形而设计,它节省磁盘空间的能力很是惊人,但是,我们只有在某个列符合如下条件时才能将其定义为该类型。

第一个规则就是一个需要被定义为 Sparse Column 的列必须是真正稀疏的。当值为 null 时,数据指针就完全不占用空间,就像这个列不存在一样。但如果是任何其它值,它将会比其它类型的列多占用 4 个字节的空间。这一规则对 bit 列(位列)也是有效的,在非 null 值的情况下,该列值所占用的空间将从 0.125 字节增长到 4.125 字节,据此,我们可以算出将 bit 列定义成 Sparse 列的临界值是必须要有 98% 的行值是 null。对于其它大一些的字段来说,就会更容易看到空间收益,例如,datetime 列的临界值是只要达到 52% 的行值为 null 就划算。在这些示例中的临界点我们可以看出,使用 Sparse Column 时可以节省至少 40% 的空间。SQL Server 在线图书有一个Sparse 列定义图表 ,显示了对于各种不同的列类型,在哪种情况下我们才考虑将其定义为Sparse 列。

第二个规则是,要时刻记住尽量使用Sparse 列进行索引。如果使用普通索引的话,即使你并不打算对它进行查询,它也会因为null 值浪费大量的空间。解决方案就是SQL Server 的另一个被称作“Filtered Index(条件过滤索引)”的新特性。一个过滤索引有一个where 子句用于防止对那些不满足指定条件的行进行索引。对于Sparse 列而言,这个条件显然就是where “column_name IS NOT NULL”。

Sparse 列的另一个特点就是会比普通的列要慢,所以,对于那些对 CPU 性能敏感胜过 I/O 的查询,应该考虑避免使用 Sparse 列,这是一个判断是否使用 Sparse 列的边界条件。

如果不能使用 Sparse 列的话,在普通的列上建立 Filtered Index 也是一种替代方案,它既能有效地缩小索引占用的空间,又能避开 Sparse 列的限制。如前所述,在过滤时,可以在判断该列的行值是否为空以外,增加一些其它的过滤条件。

如果你想打破 1024 个列的限制,那就必须寻求 Column Set 的帮助。Column Set 允许我们在查询时将超出 1024 以外的列捆绑到一个单独的 XML 列中。

根据 Yao Qingsong 的介绍,微软因为客户的需要保留了 1024 个列这一限制,

为了能创建多于 1024 个列,我们必须在表中定义一个 columnset 列。我们明确地提出这一点,是因为客户不能接受超过 1024 个列,而我们又不愿意让用户因这一问题无法获取数据。一旦表中定义了 columnset 列,select * 语句将会隐藏所有的 Sparse 列,代之以这个 columnset 列。但是,用户仍然可以在查询中 select 到每个独立的 sparse 列。

Column Set 列必须在表的原始设计中进行定义,如果表中已经有了任意一个 Sparse 列,就不允许再添加 Column Set 列。但是,一旦定义了 Column Set 列,新添加的 Sparse 列会被自动地添加到 Column Set 列中。

尽管 Column Set 看上去是 XML,但要尽量小心避免修改它,因为那样做的话会导致它无法再被映射到被绑定的列。

查看英文原文 Sparse Columns, Filtered Indexes, and Column Sets

2008-09-07 01:231687
用户头像

发布了 90 篇内容, 共 16.5 次阅读, 收获喜欢 11 次。

关注

评论

发布
暂无评论
发现更多内容

业内首份!博睿数据入选中国信通院《中国AIOps现状调查报告(2022)》

博睿数据

博睿数据 智能运维AIOps Swift AI

我们总结了 3 大使用建议,并首次公开 Nacos 3.0 规划图 | Nacos 开源 4 周年

阿里巴巴云原生

阿里云 开源 微服务 云原生 nacos

TDesign 品牌价值观

TDesign

落地DevOps,探索高效研发运营一体化解决方案

云智慧AIOps社区

DevOps 质量管理 代码管理 自动化运维 研发效率

SpringMVC(五、AOP)

开源 springmvc spring aop 8月月更

知识管理的成熟,需要具备什么条件?

Baklib

全新升级!《云原生架构白皮书 2022 版》重磅发布

阿里巴巴云原生

阿里云 架构 云原生 白皮书

参与openEuler社区不到1年,我成为了社区Maintainer……

openEuler

openEuler 开源社区 社区运营 #开源

开源一夏 | 拥抱新技术?你需要考虑的方面

微枫Micromaple

开源 经验总结 技术栈 技术分享 8月月更

软件架构治理 之 如何度量软件架构

码猿外

架构设计 软件架构治理

实证与虚无,抽象和具象,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang接口(interface)的使用EP08

刘悦的技术博客

Go 编程 教程 Go web 教程分享

一文读懂BizDevOps:数字化转型下的技术破局

阿里云云效

技术 DevOps 云原生 数字化转型 开发.

化整为零优化重用,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang函数的定义和使用EP07

刘悦的技术博客

Go 教程 Go web 教程分享

A tour of gRPC:07 - gRPC bidirectional straming 双向流

BUG侦探

gRPC RPC protocolBuffer

30分钟成为Contributor|共建测试子系统,赋能提升项目代码质量

OpenHarmony开发者

OpenHarmony

直播预告 | 如何从 0 到 1 打造敏捷团队?

Authing

在知识经济的年代,让你学会如何经营好自己的知识

Baklib

活动报名| MongoDB 使用规范及最佳实践线上直播来啦!

MongoDB中文社区

mongodb

有一说一!阿里巴巴8月最新发布的这份Spring Cloud Alibaba学习笔记,几乎涵盖了其所有操作

程序员小毕

Java 程序员 面试 微服务 SpringCloud

深度学习公式推导:从神经元出发

老崔说架构

如何通过FinOps实现企业云成本优化?——信通院《中国FinOps产业发展现状研究报告》解读

星汉未来

云原生 k8s IT FinOps 云成本优化

解析 RocketMQ 业务消息——“事务消息”

阿里巴巴云原生

阿里云 RocketMQ 云原生 消息队列

DevSecOps|极狐GitLab IaC 安全扫描,保障云原生安全

极狐GitLab

Docker gitlab 运维 DevSecOps IaC

“以太坊杀手” Polkadot 何以在一众公链中脱颖而出

One Block Community

区块链 去中心化 跨链技术 波卡生态

MQTT over QUIC:下一代物联网标准协议为消息传输场景注入新动力

EMQ映云科技

车联网 物联网 mqtt emqx 8月月更

开源一夏 | 实战之AngularJS 的Scope和Service的深入应用心得

恒山其若陋兮

开源 8月月更

如何提升IT对业务发展的贡献度

凌晞

数字化 构架 IT管理

培训预告 | 企业应用现代化实用教程——微服务治理与开发篇

York

容器 微服务 云原生 数字化转型 应用现代化

SQL Server 2008中的新特性——稀疏列、条件过滤索引和列集_.NET_Jonathan Allen_InfoQ精选文章