亮网络解锁器,解锁网络数据的无限可能 了解详情
写点什么

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:231141
用户头像

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

关注

评论

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

为什么中间件协议对区块链生态系统至关重要?

CECBC

运维大佬嘲笑我,这个你都不知道?

李阿柯

redis 面试 运维自动化

Nebula 基于 ElasticSearch 的全文搜索引擎的文本搜索

NebulaGraph

elasticsearch 索引 图数据库

SpringCloud Gateway 路由数量对性能的影响研究

中原银行

微服务 SpringCloud Gateway JMH性能基准测试 中原银行

数字人民币是央行数字货币还是法定数字货币?

CECBC

前端 JavaScript 之『防抖』的简单代码实现

编程三昧

JavaScript 编程 大前端 防抖 函数节流

只等你来!OpenAtom XuperChain开发者夏季论坛来啦

百度开发者中心

百度 开源 开发者

🌏【架构师指南】分布式ID生成算法技术总结

洛神灬殇

分布式ID 6月日更

如果把四个消息队列都拉到一个群里,他们会聊些什么?

悟空聊架构

故事 消息队列 群聊 6月日更 悟空聊架构

“懂行”共识拓宽数字通道:川蜀大地与智能时代的“热辣”共振

脑极体

5分钟速读之Rust权威指南(二十四)Box

wzx

rust

SpringCloud Gateway 路由转发性能优化

中原银行

微服务 性能优化 SpringCloud Gateway 中原银行

并发王者课-铂金2:豁然开朗-“晦涩难懂”的ReadWriteLock竟如此妙不可言

MetaThoughts

Java 多线程 并发

Taro3无埋点的探索与实践

GrowingIO技术专栏

taro AST sdk 无埋点 babel

数据库事务与锁详解

阿骆麦迪

MySQL 事务 6月日更

「SQL数据分析系列」6. 使用集合

数据与智能

sql 集合

停车场事故频频,AI 达人将摄像头变身安全卫士

阿里云视频云

阿里云 计算机视觉 音视频 应用 英特尔

【21-10】PowerShell 日期和时间

耳东@Erdong

PowerShell 6月日更

苹果iOS内购三步曲:App内退款、历史订单查询、绑定用户防掉单!--- WWDC21

37手游iOS技术运营团队

ios wwdc 苹果退款 appstore WWDC21

JavaScript 学习(四)

空城机

JavaScript 大前端 6月日更

成为一个面霸需要面试多少回?

escray

极客时间 6月日更

Flink State 和 Fault Tolerance(一)

Alex🐒

flink 翻译 flink1.13

Kubernetes手记(14)- 用户权限系统

雪雷

k8s 6月日更

爆场预警!百度大脑开放日-AI赋能软硬件产品创新

百度大脑

百度大脑开放日

校外培训行业迎来强监管,“教育+区块链”新模式试图解决行业痼疾

CECBC

SpringCloud Gateway 动态路由

中原银行

微服务 SpringCloud Gateway 中原银行

Low-Code能否威胁到专业的程序员?| 话题

三掌柜

试用期 签约计划 人气作者 TOP10

很多小伙伴问我推荐什么书籍和网课,这次把私藏很久的资料都贡献了(上)

C语言与CPP编程

Java c++ C语言 数据结构与算法 #python

C++友元的概念和使用的一些介绍

良知犹存

c++

优雅编程 | 7 个你应该掌握的 JavaScript 编码技巧

devpoint

JavaScrip 6月日更

MySQL基础之十五:索引

打工人!

MySQL 6月日更

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