Задача оракл dwh
Есть "нормализованная" бд когда в огромных таблицах хранится не поля с большими строками, а циферки, по которым наджойниваешься на огромную таблицу со строками.Можно объединить эти таблицы в кластер, хотя не думаю что проблема в этом.
С датами и даблами таже херь. Тащатся данные соответственно через функции типа "забрать строку такой то номер"
Если я правильно понял суть проблемы, то функция - черный ящик для оптимизатора. Дефакто происходит nested loop join (пройтись по таблице, для каждой строки залезая в другую таблицу), гибельный на больших объемах данных. Надо было использовать вьюхи, чтобы происходил hash join.
Функций разных всего 3, соответственно лезут они в 3 больших таблицы. Просто каждая в строке селекта вызывается раз сто...
Функции детерминистик? Может помочь.
А вообще, нужно поконкретней.
Основная таблица.
Ключ плюс 300+ полей типа integer
3 огромные таблицы:
String, mid, index
Data, mid, index
Double, mid, index
3 функции соответственно, которые применяются к каждому полю первой таблицы.
Функции делают следующее. С помощью connect by path из какой- то из трех таблиц выбераются все стринги/даты/ или даблы для конкретного mid, сортируются по индексу и собираются в одну последовательность разделенные ";"
Чо я сделал. Создал еще три таблицы в которых лежат
Mid, aggr где аггр - уже собраная эта херня описанная выше.
Остается триста раз наджойнить эти три новые таблицы на первоначальную и никаких функций. Но может есть менее гомоздкое решение?
То есть когда таких полей десяток - два, то решение суперское, предварительно рассчитанные агрегаты моментально джойнятся и все ок, а вот когда 300 полей - хз
Либо же мутить ГТТ таблички мелкие в количестве 300 штук типа одна табличка предварительно расчитанная под каждое поле основной таблицы, тогда каждая будет по 150 000 строк примерно, но это же ебу даться надо, наплодить ради одного куска говна 300 temporary табличек. Хочу простое красивое решение негромоздкое
Хочу простое красивое решение негромоздкоеПСЖ.
Но может есть менее гомоздкое решение?Попробуй unpivot/pivot
Ключ плюс 300+ полей типа integerСдается мне, вот тут и есть основная проблема.
Что, реально набор из 300+ чисел одним ключом определяется?
важно то что там насыпаны миды из трех огромных таблиц
в 300+ полей
и надо прицепить три огромные таблицы
к каждому полю
Функции, которые ты вызываешь - конвейерные?
употреблением всяких умных слов
да в рот их ебать, конвейерные они или нет
как избавиться от функций с ростом производительности я понимаю
а как наджойнить 300 раз таблицы - нет
а как наджойнить 300 раз таблицы - неттак, а в чем проблема? Джойниться таблицы будут по первичному ключу, так что проблема лишь в том, что данных будет много, запрос можно сгенерить скриптом достаточно быстро (если имена колонок однотипные).
а реально нужно в итоговую выборку включать все 300 показателей да еще и составных? что это за тема такая?
1. Unpivot для основной таблиы 2. Join с тремя агрегатными таблицами 3. Pivot того что получилось.
Правда я не уверен что это будет быстрее.
1. Как часто меняются данные таблицах?
2. Как часто тебе нужно их забирать?
да в рот их ебать, конвейерные они или нетдумать не пытался?
http://bit.ly/1mKpnjp
ясен пень они у тебя тормозят
я знаю что такое конвейерные функции
я вообще против функций в загрузках DWH
проблема с функциями не стоит, я от них избавился.
проблема в том, что джойнятся не по ключу
а по каждому столбцу
все говно до меня отрабатывало часов 8. я попробовал 40 раз наджойнить таблицы, это заняло 80 минут. попробовал 100, оставил, какой результат - не знаю (ушел вчера домой, плюс 100 эти попробовал не хешем а нестед лупсами с индекс рендж сканом). если он увеличивается пропорционально - это проблема.
Картинко для маштаба
меняются постоянно, забирать каждый день
меняются постоянно1. Сколько строк в день в среднем:
1. Добавляется/изменяется в основной таблице
2. Удаляется в основной таблице
3. Добавляется/изменяется в дополнительных таблицах
4. Удаляется из дополнительных таблиц
2. Те же параметры, но пиковые значения.
Предложение подумать об инкрементальности вместо полного перекачивания? Подумаю, ок.
Тему можно закрывать )))
слава ораклу, героям слава !
Оставить комментарий
ppp6663669
Есть "нормализованная" бд когда в огромных таблицах хранится не поля с большими строками, а циферки, по которым наджойниваешься на огромную таблицу со строками. С датами и даблами таже херь. Тащатся данные соответственно через функции типа "забрать строку такой то номер"Ацки тормозит
Когда в запросе несколько вызовов функции, меняю их на джойны с предварительно рассчитанными таблицами и все работает шустро и бодро очень, проблем нет
Наткнулся на запрос, вообще гг, 300 функций в селекте. Таблица откуда селектят 160 000 строк. Функции лезут иерархическим подзапросом в 90 милионные таблицы
Create table as select отрабатывает за часов 8
Как ускорить номально? Неужели 300 джойнов мутить?
Фоточка селекта для маштаба приложу чуть позже