说我在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));
- 是吗?
答案 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)
我没有在password_audit表中看到'date_to_accounts_ni'。 它是什么数据类型/长度?
你的第一个关于password_audit.update_date的索引就足够了,你为什么要索引 (DATE(update_table))?