Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / посоветуйте, как решить проблему / 4 сообщений из 4, страница 1 из 1
19.11.2007, 18:26
    #34949968
alecsey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
посоветуйте, как решить проблему
исходные данные: есть огромная таблица items(customer,item,start_date,end_date,...<прочие атрибуты>) - получаем таблицу с текущими и историческими данными, историческими данными обычно активно интересуются не более недели(пока выставили счёт, пока он дошёл и тп... позже тоже бывает интересуются, но реже), отношение customer к item - один ко многим, удалений в таблице не бывает, запросы бывают много чаще чем апдейты+добавление... для получения списка item's приминяются запросы вида select * from items where customer=<customer> and <date of search> between start_date and end_date, где <date of search> - практически всегда попадает в интервал sysdate-1/24... сейчас система стала заметно подтормаживать, пытаюсь решить проблему, есть несколько вариантов, хотелось бы услышать мнение

1) сеционировать по диапазону на 2 партиции: устаревшие(end_date less than <дата на месяц меньше текущей>), текущие остальные... и раз в N месяцев запускать по расписанию скрипт выделяющий из текущей партиции записи закрытые более месяца назад и переводящий их в устаревшую партицию(тут надо поподробней посмотреть в возможности oracl'a, напрмер похоже придётся пересобирать индексы)
2) создать механизм(через тригеры или по расписанию, или через процедуры работы с базовой таблицей) - который будет на каждое изменение таблицы items, вносить изменения и в денормализованую таблицу items_current(customer, items<список item'ов через запятую>, start_date<максимальное значение start_date для всех item'ов даного customer>, end_date<null>), при запросах искать в начале в таб items_current и только если не найдутся необходимые данные(дата поиска < start_date или дата поиска > даты последнего обновления если обновление по расписанию)
3) вариация 2)... хранить не 1 запись для каждого customer, а набор записей например за месяц тогда кол-во "непопавших" записей можно считать равным 0
...
Рейтинг: 0 / 0
20.11.2007, 00:52
    #34950451
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
посоветуйте, как решить проблему
alecseyесть несколько вариантов, хотелось бы услышать мнение
Приведенные варианты показывают, что Вам стоит сначала прочитать Кайта, а уж потом садиться реализовывать БД.

Оба варианта нормальны в своей ситуации, но если делать их по-человечески. Первый - просто обычный range partition по дате, без извращений. Второй - materialized view + query rewrite (тут сходу не уверен, что query rewrite легко и непринужденно заюзается - надо смотреть)
...
Рейтинг: 0 / 0
20.11.2007, 13:22
    #34951726
alecsey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
посоветуйте, как решить проблему
softwarer alecseyесть несколько вариантов, хотелось бы услышать мнение
Приведенные варианты показывают, что Вам стоит сначала прочитать Кайта, а уж потом садиться реализовывать БД.
Оба варианта нормальны в своей ситуации, но если делать их по-человечески. Первый - просто обычный range partition по дате, без извращений. Второй - materialized view + query rewrite (тут сходу не уверен, что query rewrite легко и непринужденно заюзается - надо смотреть)
Спасибо за критику, но
1) это не извращение, а движущееся окно, у кайта описывалось если не ошибаюсь ;)
2) materialized view - смотрел в эту сторону, не совсем подходит, complite refresh будет занимать слишком много времени
...
Рейтинг: 0 / 0
20.11.2007, 14:57
    #34952165
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
посоветуйте, как решить проблему
alecsey1) это не извращение, а движущееся окно, у кайта описывалось если не ошибаюсь ;)
Описывалось, но в главе про аналитические функции :)

alecsey2) materialized view - смотрел в эту сторону, не совсем подходит, complite refresh будет занимать слишком много времени
Вам таки надо выбрать что-нибудь одно. Если refresh будет занимать слишком много времени, значит завершения переноса между этими движущимися окнами Вы вообще не дождетесь.
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / посоветуйте, как решить проблему / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]