多空值查询列的索引设计咨询:是否应创建过滤索引?
多空值查询列的索引设计咨询:是否应创建过滤索引?
嘿,这个问题问得特别接地气!针对你这种大表多空值列的查询场景,咱们一步步拆解分析:
先说说常规索引的问题
如果给每个MostlyEmptyColumnX都建常规非聚集索引,确实能加速查询,但缺点很明显:
- 这些列大部分是空值,常规索引会把所有行(包括NULL值)都纳入其中,平白占用大量存储空间,对于百万级行的表来说,这个浪费会非常可观;
- 索引维护成本高:每次插入新行(默认这些列是NULL)、或者把NULL更新为非NULL、反过来操作时,索引都要同步维护,会额外消耗数据库资源,拖慢写入性能。
所以直接建常规索引绝对不是最优解。
过滤索引才是你的最优选择
你提到@parameterA永远是非NULL值,不会查询MostlyEmptyColumnA IS NULL的情况,那创建过滤索引简直是量身定制的方案:
- 体积小、速度快:过滤索引只包含
MostlyEmptyColumnA IS NOT NULL的行,索引大小会比常规索引小很多,查询时需要扫描的索引页更少,性能自然更优; - 维护成本低:只有当列的状态从NULL变为非NULL(或反之)、或者非NULL值被更新时,才会触发索引维护,相比常规索引,能大幅降低写入操作的额外开销;
- 适配性强:SQL Server能精准识别这个过滤索引匹配你的查询场景,执行计划会直接选用它来快速定位目标数据。
你给出的过滤索引创建语句完全正确,就是这个思路:
CREATE INDEX IxMostlyEmptyColumnA ON MyTable (MostlyEmptyColumnA) WHERE MostlyEmptyColumnA IS NOT NULL;
额外的小建议
- 每个查询频繁的空值列都可以单独创建这样的过滤索引,因为你是单独按每个列查询的,分开建比组合索引更灵活;
- 可以先给其中一个列建过滤索引做测试,用
sp_spaceused查看索引占用空间,再对比常规索引的大小,同时观察查询性能的变化,直观感受它的优势; - 确保后续不会出现查询
MostlyEmptyColumnX IS NULL的需求,如果有,那可能需要额外调整,但按你目前的描述,完全不需要担心。
备注:内容来源于stack exchange,提问作者Liero
相关产品推荐
相关产品推荐

