使用 col=null 分区的 SAP HANA 分区

SAP HANA partitioning with col=null partition

在 SAP HANA 1.0 SPS 12 中,我们希望通过 ValidationAreaID 和 VersionValidTo 对 table 进行分区。

目前没有问题。

但是由于与 null 的比较应该比时间戳更快,所以我想按

进行分区
} technical configuration {
    partition by 
        range (ValidationAreaID) (
            partition value = 1,
            partition value = 2,
            partition value = 3,
            partition others
        ),
        range (VersionValidTo)  (
            partition value = null,
            partition others
        )
    ;

而不是

} technical configuration {
    partition by 
        range (ValidationAreaID) (
            partition value = 1,
            partition value = 2,
            partition value = 3,
            partition others
        ),
        range (VersionValidTo)  (
            partition value = '9999-12-31',
            partition others
        )
    ;

然而,尝试按空值进行分区会导致错误消息:
Syntax error: unexpected token "null"

提供一个可关闭的答案: 分区定义子句不允许 IS NULL 检查。 分区需要由一个不同且唯一可识别的字符串或(无符号)数字或一个封闭的值范围指定(请参阅 here)。

这回答了是否可以为条件 IS NULL 评估为真的记录创建分区的部分:不能。

答案的第二部分解决了检查 IS NULL 比检查特定值更快的说法。 这通常不是真的。虽然您可能会发现检查特定列中 NULL 条目的数据分布比扫描该列的整个 main 段更快,但这并不是特别之处NULL 条目。 根据任何列(以及 table 中所有列)中不同值的总体分布,SAP HANA 将对列的主要段中的值 ID 指针进行排序和压缩。 如果例如列中所有条目的大部分当前是 NULL 它很可能会导致压缩,将所有 NULL 条目放在最顶部并使用 RLE 压缩那些条目。 在这种情况下,一般搜索 IS NULL 会非常快。 同样,对于该列的其他非常突出的值,压缩可能会发生变化。

据我所知,NULL 列存储的唯一技术差异是它们具有 hard-coded 和固定值 ID,因此可以在字典中查找避免并且所有列共享 NULL 条目的相同值 ID。由于字典查找通常不是语句执行的瓶颈,所以可以说 "NULL is faster" 想法是不正确的。