Как оптимизировать структуру данных нагруженных таблиц?
Есть две таблицы, назовём title и spec, в них, соответственно, общая информация о событии и спецификации события. Они партиционированы и имеют много полей (до 40 каждая), созданы индексы на некоторые поля по отдельности ещё до меня.
Сейчас мы перешли полностью на систему, использующую данные этих таблиц, и теперь загрузка и запросы из них должны быть быстрыми. Два раза в день идёт загрузка новой информации, а в рабочие часы пересчитываются некоторые события(update`ы и insert`ы).
Из этих таблиц очень часто идут запросы по разным отчётам и оповещениям.
Сейчас я разработал что-то вроде антифрода, и для наполнения витрины (аггрегированных данных из этих таблиц), создал сначал б-три индексы, один покрывающий на TITLE, а другой по условиям WHERE. Таким образом, INSERT за один день проходил за 6 секунд. На следующий день оказалось, то, что раньше считалось по этим таблицам за полчаса, теперь считается за пять часов. Тогда я удалил эти индексы и создал на каждую по bitmap local индексу просто по trunc(START_DATE). Моя загрузка за день идёт теперь 13 секунд, но остальные операции всё равно затягиваются, хоть уже и меньше.
Подскажите, как сделать так, чтобы индексы на этих таблицах не особо тормозили загрузку данных в них, но и моя загрузка данных из них шла хотя бы до минуты за день данных?
Может быть, стоит провести ревизию всех пакетов и запросов и удалить эти 5 индексов на отдельные поля типа title.ID? Всё равно в плане запросов я не вижу, чтобы этот индекс где-то участвовал, хотя они соединяются при помощи spec.title_id.
Может, подскажете другие варианты архитектуры? В какую сторону будет правильнее двигаться для оптимизации всего и вся?
Сколько данных в таблице? Сколько данных грузится каждый день? Как часто пересчитывается статистика, пересчитывается ли принудительно после загрузки? Как выглядят медленные и быстрые планы?
А не глядя остается только согласиться с "Может быть, стоит провести ревизию всех пакетов и запросов", поскольку раз нет фактической инфы, то вам на месте должно быть виднее.
Vapaamies: Партиции по месяцам в обеих таблицах. Title - в среднем 265 000 записей за день , spec - 560 000. Статистика считается два раза в день. Но это всего лишь один из видов использования этих таблиц.
Два раза в день идёт загрузка новых данных, после этого по ним проходит антифрод с кучей запросов из них и статистики.
В рабочее время из этих таблиц тянутся отчёты, проходят пересчёты отдельных контрагентов и ещё всякая живность из джобов на нужды пользователям.
Вот фактическая инфа. Я здесь хочу, чтобы мне подсказали best practices по ведению таких БД. У меня крутится идея создать дублирующие таблицы на часто используемые поля, их будет до 15 штук и организовать заливку в них. А нагрузку на отчёты и прочее разделить между этими двумя ресурсами. Однако, тогда возрастёт сложность пересчётов.
Может, есть ещё идеи? Свободное место на серверах тоже оставляет желать лучшего.
TheRL: Мне кажется, что для отчетов тут логично использовать материализованные представления -- это и будут ваши дублирующие таблицы, но средствами Oracle, со штатной синхронизацией.