Обеспечение использования индекса для столбца Informix DATETIME - PullRequest
1 голос
/ 03 августа 2010

Скажем, у меня есть таблица в БД Informix:

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 ]

1 голос
/ 04 августа 2010

Поскольку вы заставляете сервер преобразовывать два значения в 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 и более поздних) версиях.

0 голосов
/ 04 августа 2010
  1. Я не увидел 'date_to_accounts_ni', определенный в вашей таблице password_audit. Какой это тип данных / длина?

  2. Ваш первый индекс для password_audit.update_date является адекватным, зачем вам индексировать (ДАТА (update_table))

...