как правильно выбрать индекс???

gventur
Дата: 10.12.2007 20:41:58
Добрый вечер!
Есть такая проблема, у меня есть таблица в которой помимо некоторых полей есть еще два поля типа date PEIROD_BEGIN (default sysdate)и PERIOD_END...соответственно дата начала когда начало действовать данное значение и до какого числа оно действовало...
В таблице РК (ID,PEIROD_BEGIN). ну и по РК создан индекс (автоматически)...
Поля PEIROD_BEGIN и PERIOD_END всегда заполнены причем если это значение актуально на сейчас то поле PERIOD_END - нереально большое (например 01.01.3000)
ТО есть получается после создание этой таблицы у всех данных есть заполненные эти поля (значениями SYSDATE и 1,1,3000) после каких-то измений в главной таблице в эту таблицу добавляется новая запись, а в строй для этого ID PERIOD_END меняется на SYSDATE
Вопрос: по каким полям/полю лутше строить индекс что бы запрос на выборку такого плана

select * from history
where  PERIOD_BEGIN = date1;

работал как можно быстрее???
ответ сходу
Дата: 10.12.2007 20:53:57
Варианты:
1. Создать индекс по полю PERIOD_BEGIN для использования в указанном запросе.
2. Если вдруг PK нужен только для обеспечения уникальности (нет запросов к таблице по ID, что маловероятно, но вдруг...), можно создать его как РК (PEIROD_BEGIN, ID)

P.S. default sysdate ИМХО не лучший дизайн, т.к. в запросах врядли идет выборка по значению даты начала с точностью до мсек. И, вероятно, по смыслу дата начала должна быть именно датой без времени, тогда лучше указать default trunc(sysdate), ну или trunc до приемлимой точности - часа или минуты, например.
Apex
Дата: 11.12.2007 10:37:17
Ну, во-первых, если вы ходите выбрать все актуальные записи на дату date1, то запрос должен будет выглядеть вот так:
select * from history
where  PERIOD_BEGIN > date1 and date1 =< PERIOD_END;
Во-вторых подобный подход к созданию исторических таблиц мне не нравится по нескольким причинам, главная из которых, то что актуальные записи физически соседствуют с историческими.
Ну а в остальном, думаю, вам подойдет примерно такой набор индексов: (ID, PERIOD_BEGIN, PERIOD_END) - чтобы искать конкретную запись на конкретную дату, (PERIOD_BEGIN, PERIOD_END) - чтобы искать много записей на конкретную дату... Например так.
-------------------------------------------------------
Автор благодарит алфавит за любезно предоставленные ему буквы.
gventur
Дата: 11.12.2007 11:22:25
Благодарю)) сейчас буду тестить))
Maxifly
Дата: 11.12.2007 11:39:35
Apex
подобный подход к созданию исторических таблиц мне не нравится по нескольким причинам, главная из которых, то что актуальные записи физически соседствуют с историческими.


А какой подход к созданию истоических таблиц Вам нравится?
Apex
Дата: 11.12.2007 11:58:04
Maxifly

А какой подход к созданию исторических таблиц Вам нравится?

Мне нравится, когда исторические и актуальные данные разведены по разным сегментам. Т.е. либо две отдельные таблицы: одна для актуальных записей, другая для исторических, либо две и более партиций. Такой подход неудобен с точки зрения писанины, но на мой взгляд его легче поддерживать. Например в любой момент можно усечь исторические записи, либо засунуть их сегменты в мусорку (recycle pool), чтоб не вытесняли собой необходимые OLTP актуальные записи.
Но есть и альтернативное мнение.
gventur
Дата: 11.12.2007 12:31:05
Apex

...две отдельные таблицы: одна для актуальных записей, другая для исторических...


так и есть...есть две таблицы в одной актуальные данные во второй история изменения... )))