确保在 Informix DATETIME 列上使用索引

Posted

技术标签:

【中文标题】确保在 Informix DATETIME 列上使用索引【英文标题】:Ensuring index is used on Informix DATETIME column 【发布时间】:2010-08-03 16:37:08 【问题描述】:

假设我在 Informix DB 上有一个表:

create table password_audit (
    username CHAR(20),
    old_password CHAR(20),
    new_password CHAR(20),
    update_date DATETIME YEAR TO FRACTION));

我需要 update_date 字段以毫秒为单位(或者可能是秒 - 同样的问题适用),因为在同一天会有多次密码更新。

假设,我有一个夜间批处理作业,想要从 password_audit 表中检索今天的所有记录。

为了提高性能,我想在 update_date 列上放置一个索引。如果我这样做:

CREATE INDEX pw_idx ON password_audit(update_date);

并运行此 SQL:

SELECT *
FROM password_audit
WHERE DATE(update_date) = mdy(?,?,?)

(其中 ?, ?, ? 是我的批处理作业传入的月、日和年)

那么我认为我的索引不会被使用 - 是吗?

我想我需要创建一个类似这样的索引:

CREATE INDEX pw_idx ON password_audit(DATE(update_date));

- 是吗?

【问题讨论】:

【参考方案1】:

因为您强制服务器将两个值转换为 DATE,而不是 DATETIME,所以它可能不会使用索引。

您最好将 SQL 生成为:

SELECT *
  FROM password_audit
 WHERE update_date
       BETWEEN DATETIME(2010-08-02 00:00:00.00000) YEAR TO FRACTION(5)
           AND DATETIME(2010-08-02 23:59:59.99999) YEAR TO FRACTION(5)

这相当冗长。或者,也许更容易一些:

SELECT *
  FROM password_audit
 WHERE update_date >= DATETIME(2010-08-02 00:00:00.00000) YEAR TO FRACTION(5)
   AND update_date <  DATETIME(2010-08-03 00:00:00.00000) YEAR TO FRACTION(5)

这两个都应该能够使用 update_date 列上的索引。您可以尝试从文字中删除一些尾随零,但我认为您无法将它们全部删除 - 但请查看 SET EXPLAIN ON 输出告诉您的内容。

根据您的服务器版本,您可能需要在创建索引后运行 UPDATE STATISTICS,然后优化器才会使用它;与当前(11.10 和更高版本)版本相比,这在 Informix 的旧版本(例如 10.00 和更早版本)上是一个更大的问题。

【讨论】:

好的,谢谢乔纳森,会调查这个。您认为我提出的第二个索引不会被我提出的 SQL 使用吗? @dairemac:Jonathan 的查询示例暗示索引仅在 update_date 上。每当您指示引擎在查询中转换或强制转换列时,它将扫描整个表以执行转换,因此不会利用索引。看看 EXPLAIN 告诉你什么。 功能索引可以工作...但它会存储功能结果。如果列上没有常规(非功能性)索引,那么功能性索引应该可以正常工作。 由于需求变化,从未有机会进行此设置。如果我有机会,我会出于兴趣而这样做,并将结果发布到这里。无论如何感谢您的帮助。【参考方案2】:

    我没有看到您的 password_audit 表中定义了“date_to_accounts_ni”。 它是什么数据类型/长度?

    您在 password_audit.update_date 上的第一个索引就足够了,为什么要索引 (DATE(update_table))?

【讨论】:

1.抱歉,应该是 update_date 而不是 date_to_accounts_ni。修改了问题。 2. 因为查询该表的 SQL 将查找在特定日期具有 update_date 的所有记录,即 WHERE DATE(update_date) = mdy(?,?,?) 如果您对时间不感兴趣,您可能希望使用单独的日期和时间字段并分别对它们进行索引。这将使日期的检索完全匹配,而使用日期+时间几乎不会产生完全匹配。

以上是关于确保在 Informix DATETIME 列上使用索引的主要内容,如果未能解决你的问题,请参考以下文章

DATETIME - 来自 Informix 的 HH:MM:SS 格式的 DATETIME

在 UPDATE 查询中使用 DateTime 或字符串参数时,Informix 11.7 返回 -1 作为受影响的行数

Informix SQL 比较 Where 语句上的 DateTime 值

保存 Informix DATETIME YEAR TO SECOND 值的等效 Java 数据类型?

DateTime 列上的 Mono InvalidOperationException (SQL Server)

Informix 和 .NET 的时间和日期时间格式