【问题标题】:How are indexed columns with NULL values treated?如何处理具有 NULL 值的索引列?
【发布时间】:2015-03-18 07:45:30
【问题描述】:

Informix-SE 4.10、7.32 和 IDS 11.70:我在 DATETIME YEAR TO FRACTION 列上有一个索引,我最近将其作为时间戳添加到具有约 800K 行的表中。当用户更新或添加新行时,此列会被填充。到目前为止,大约 7K 行具有 DATETIME 值,但其余为 NULL。 SE 和 IDS 在查询、更新和排序时如何处理具有 NULL 值 DATETIME 列的行?.. 这些行是否被忽略?索引的原因是支持使用“select max(datetime_col)”语句查找最近添加或更新的行的查询。此列的降序索引会提供更好的性能吗?

【问题讨论】:

    标签: informix


    【解决方案1】:

    按降序排序,NULLS 将是最后一个,升序(默认)将在顶部。

    但处理方式取决于您过滤数据的方式。

    你不能将NULL 与一个值进行比较,它总是假的。

    因此,如果您尝试在该表中获取日期大于CURRENT 的所有行,则不会获取具有NULL 中的列的行。

    类似地,如果您尝试获取日期小于CURRENT 的所有行,则不会获取列在NULL 中的行。

    你想要的是测试它是IS NULL还是IS NOT NULL

    【讨论】:

    • @FrankComputerAtYmailDotCom:您是否查看过带有和不带有额外 IS NOT NULL 子句的查询计划?直觉是它不会有太大的不同,但它可能很重要。一个问题是您对表运行 UPDATE STATISTICS 的频率。如果该列在一夜之间无效,然后在白天选择性地取消,则统计数据可能很重要。您是否尝试过衡量性能?
    • @FrankComputerAtYmailDotCom:在使用 MAX 函数时,NULLS 会被忽略,除非列中的每个值都是 NULL,在这种情况下它会返回 NULL。如果timestamp 等于MAX(timestamp) 的不止一行,那么您的查询将给出不止一行。如果你真的只想要一个,并且不挖掘上面的问题,你可以SELECT FIRST 1
    • @FrankComputerAtYmailDotCom:不知道你是否最好用一个单独的表,rows_modified_today,它记录了当前表中行的ID号加上修改时间。它将仅包含已修改的 0-7K 行的 ID 号;它会很小。
    • @FrankComputerAtYmailDotCom:如果您在列清空后立即执行 UPDATE STATISTICS,然后不再执行此操作,则统计信息会显示“(该列中的)所有内容都为空”。这可能有用;它可能会使查询更快。但在你完成一些工作之后,它并不完全准确。但是,如果您要修改 800K 行中的 7K,则误差小于 1%;可能没关系。
    • @FrankComputerAtYmailDotCom:是的,我指的是主键 ID,而不是 ROWID。您需要一个很好的理由将 ROWID 存储在表中;我想不出一个足够好的。单独的查找表不必是临时表;它可以只是一个(永久)表,其内容会定期删除。我现在不记得 2.10(大约 1986 年)和 4.10(大约 1989 年)之间发生了什么变化。但是,SE 5.x 和 7.x 中的优化器算法基本相同。 SE 4.10 中的算法可能不如当前版本先进,但没有您希望的那么大。
    猜你喜欢
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 2017-04-23
    • 2021-11-09
    • 2011-03-05
    • 1970-01-01
    相关资源
    最近更新 更多