2025上半年,最新 AI实践都在这!20+ 应用案例,任听一场议题就值回票价 了解详情
写点什么

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

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

关注

评论

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

JVM超神之路:金三银四跳槽需要的JVM知识点,都给你整理好了

Java你猿哥

Java 面试 JVM 面经 Java工程师

大模型时代的异构计算平台

百度Geek说

人工智能 深度学习 AI 企业号 3 月 PK 榜

OpenAI 发布ChatGPT 插件支持,官方文档译文

B Impact

2023年中国品牌全域智能营销白皮书

易观分析

营销 品牌

火山引擎基于 Dragonfly 加速实践

SOFAStack

开源 开发者 开发

如何使用ShareSDK快速实现Android APP的社会化分享登录功能

MobTech袤博科技

夺冠在即!2022 OceanBase数据库大赛12强集结

OceanBase 数据库

数据库 oceanbase

面试官:说说什么是单点登录?什么是SSO?什么是CAS?

Java你猿哥

Java ssm CAS SSO

面试官:给你一段SQL,你会如何优化?

Java MySQL 数据库 sql 性能优化

保姆级教程!玩转 ChunJun 详细指南

袋鼠云数栈

大数据 开源

二本4年Java经验,五面阿里艰苦经历(定薪45K),回馈一波心得体会

Java你猿哥

Java redis 面试 Spring Boot 面经

什么是 LuaJIT?为什么 Apache APISIX 选择了 LuaJIT?

API7.ai 技术团队

lua api 网关 APISIX API Gateway

真香!180页100+题15W+字解析的《Java高级面试指南》,果断收下

Java java面试 Java八股文 Java面试题 Java面试八股文

硬核!最全“Java面试宝典+Java核心知识集”,一箭双雕杠春招

Java java面试 Java八股文 Java面试题 Java面试八股文

【v6 认证】PCTA/PCTP/PCSD 我的备考经验

TiDB 社区干货传送门

社区活动 新版本/特性发布 TUG 话题探讨 6.x 实践

MQTT安全专题01|构建可靠的物联网系统

EMQ映云科技

物联网 IoT mqtt 物联网安全 企业号 3 月 PK 榜

阿里面试:100个高频Spring面试题,助你一臂之力

Java你猿哥

Java spring 面试 Spring Boot 面经

从零开始自己动手写阻塞队列

Java你猿哥

Java 线程 阻塞队列 实战

面试官:kafka分布式消息系统,你真的了解吗?

Java kafka 消息队列 消息系统 消息中间件

深入理解Spring注解机制:注解的搜索与处理机制

Java你猿哥

Java spring Spring Boot ssm Spring注解

可观测性之谷歌性能主管最新的有关LCP的文章

Yestodorrow

性能 可观测性 用户体验

Visio 绘图注释工具:VSDX Annotator 激活版

真大的脸盆

Mac Mac 软件 注释工具

接招吧!最强“高并发”系统设计 46 连问,分分钟秒杀一众面试者

Java 系统设计 高并发

来啦!OceanBase DevCon • 2023议程公布!

OceanBase 数据库

数据库 oceanbase

浅谈 Java线程状态转换及控制

Java你猿哥

Java 后端 多线程 ssm Java工程师

操作系统跻身国家战略,中国操作系统开源社区走向何方?

OpenCloudOS

Linux 操作系统 DPU 大禹智芯 opencloudOS

BGA焊接问题解析,华秋一文带你读懂

华秋电子

来2023全球边缘计算大会与EMQ探讨云边协同落地实践

EMQ映云科技

物联网 IoT 边缘计算 emq 企业号 3 月 PK 榜

【3.17-3.24】写作社区优秀技术博文一览

InfoQ写作社区官方

热门活动 优质创作周报

Nautilus Chain主网上线在即空投规则公布,如何获得更多的空投?

西柚子

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