我有一个表,用于存储每天至少运行一次的查询结果。有一bit
列表示该行是否来自最近运行的具有特定参数集的特定查询。(是的,它是一个函数依赖,但对性能来说是必要的非规范化,因为这个表上的大多数查询只对最近的结果感兴趣。)
由于此bit
列几乎总是假值,因此我正在寻找调整仅返回真值的查询的最佳方法。分区不是一个选项(标准版)。看起来使列 SPARSE 将是一个有趣的解决方案,但我相信这将需要我将列更改为可为空的并使用 NULL 而不是 0 作为假值。似乎有点笨拙。
是否有类似于 SPARSE 的选项可以优化具有大部分(超过 99%)错误值的非空位列的空间/性能?
Pinal Dave 的文章指出零值和空值都已优化,但这对我来说似乎不正确,因为它们是不同的值——除非 MSSQL 对非空列使用相同的机制来指示默认值。如果这是真的,那就太好了,但是BOL没有提到这一点。
过滤索引 (
WHERE IsMostRecentRun = 1
) 对我来说听起来比使用稀疏索引更好。如果您可以做到这一点,false
而不是用 表示null
,那么您可以同时执行这两项操作,但是虽然这可能会在基表中节省一些空间,但我怀疑过滤索引的查询性能会获得更大的收益 - 只要因为它覆盖。如果您需要覆盖太多列和/或还需要过滤或加入其他列,那么您可能会在从过滤索引的搜索或范围扫描中获得的改进与查找等成本之间找到一个平衡点获取其余的列。总而言之,您似乎需要一个额外的列作为标志,这似乎很可疑。这些信息不是多余的吗?不能用其他数据来判断吗?在这种情况下,我会专注于索引调整以优化现有列的使用,而不是存储和维护冗余数据。
(我也不认为 Pinal 是正确的。)