确保索引用于Informix DATETIME列

时间:2010-08-03 16:37:09

标签: database datetime indexing informix

说我在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));

- 是吗?

2 个答案:

答案 0 :(得分: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;对于较旧的(比如10.00及更早版本)的Informix版本而言,这比当前版本(11.10及更高版本)更为严重。

答案 1 :(得分:0)

  1. 我没有在password_audit表中看到'date_to_accounts_ni'。 它是什么数据类型/长度?

  2. 你的第一个关于password_audit.update_date的索引就足够了,你为什么要索引 (DATE(update_table))?