Задача оракл dwh

ppp6663669

Есть "нормализованная" бд когда в огромных таблицах хранится не поля с большими строками, а циферки, по которым наджойниваешься на огромную таблицу со строками. С датами и даблами таже херь. Тащатся данные соответственно через функции типа "забрать строку такой то номер"
Ацки тормозит
Когда в запросе несколько вызовов функции, меняю их на джойны с предварительно рассчитанными таблицами и все работает шустро и бодро очень, проблем нет
Наткнулся на запрос, вообще гг, 300 функций в селекте. Таблица откуда селектят 160 000 строк. Функции лезут иерархическим подзапросом в 90 милионные таблицы
Create table as select отрабатывает за часов 8
Как ускорить номально? Неужели 300 джойнов мутить?
Фоточка селекта для маштаба приложу чуть позже :)

luna89

Есть "нормализованная" бд когда в огромных таблицах хранится не поля с большими строками, а циферки, по которым наджойниваешься на огромную таблицу со строками.
Можно объединить эти таблицы в кластер, хотя не думаю что проблема в этом.
С датами и даблами таже херь. Тащатся данные соответственно через функции типа "забрать строку такой то номер"

Если я правильно понял суть проблемы, то функция - черный ящик для оптимизатора. Дефакто происходит nested loop join (пройтись по таблице, для каждой строки залезая в другую таблицу), гибельный на больших объемах данных. Надо было использовать вьюхи, чтобы происходил hash join.

ppp6663669

Функций разных всего 3, соответственно лезут они в 3 больших таблицы. Просто каждая в строке селекта вызывается раз сто...

lisnayt289

Ну сделать промежуточную таблицу, в которой хранится рассчитанные значения функции, и дополнять (например мерджем ), соответственно считать 100 раз не надо.
Функции детерминистик? Может помочь.
А вообще, нужно поконкретней.

ppp6663669

Поконкретнее попробую
Основная таблица.
Ключ плюс 300+ полей типа integer
3 огромные таблицы:
String, mid, index
Data, mid, index
Double, mid, index
3 функции соответственно, которые применяются к каждому полю первой таблицы.
Функции делают следующее. С помощью connect by path из какой- то из трех таблиц выбераются все стринги/даты/ или даблы для конкретного mid, сортируются по индексу и собираются в одну последовательность разделенные ";"
Чо я сделал. Создал еще три таблицы в которых лежат
Mid, aggr где аггр - уже собраная эта херня описанная выше.
Остается триста раз наджойнить эти три новые таблицы на первоначальную и никаких функций. Но может есть менее гомоздкое решение?
То есть когда таких полей десяток - два, то решение суперское, предварительно рассчитанные агрегаты моментально джойнятся и все ок, а вот когда 300 полей - хз

ppp6663669

Ситуация осложнена тем, что несмотря на то, что в исходной таблице 160000 строк, 3 предварительно рассчитанных таблицы с агрегациями по примерно 30 млн строк каждая, соответственно их наджойнивать 300 раз.
Либо же мутить ГТТ таблички мелкие в количестве 300 штук типа одна табличка предварительно расчитанная под каждое поле основной таблицы, тогда каждая будет по 150 000 строк примерно, но это же ебу даться надо, наплодить ради одного куска говна 300 temporary табличек. Хочу простое красивое решение негромоздкое :(

SergeRRRRRR

Хочу простое красивое решение негромоздкое
ПСЖ.

luna89

Но может есть менее гомоздкое решение?
Попробуй unpivot/pivot

marat7256

Ключ плюс 300+ полей типа integer
Сдается мне, вот тут и есть основная проблема.
Что, реально набор из 300+ чисел одним ключом определяется?

ppp6663669

да это неважно
важно то что там насыпаны миды из трех огромных таблиц
в 300+ полей
и надо прицепить три огромные таблицы
к каждому полю

kill-still

Функции, которые ты вызываешь - конвейерные?

ppp6663669

парни вы меня пугаете
употреблением всяких умных слов
да в рот их ебать, конвейерные они или нет
как избавиться от функций с ростом производительности я понимаю
а как наджойнить 300 раз таблицы - нет

Andbar

а как наджойнить 300 раз таблицы - нет
так, а в чем проблема? Джойниться таблицы будут по первичному ключу, так что проблема лишь в том, что данных будет много, запрос можно сгенерить скриптом достаточно быстро (если имена колонок однотипные).

olegusmaximus

а реально нужно в итоговую выборку включать все 300 показателей да еще и составных? что это за тема такая?

mbolik1

Попробуй так:
1. Unpivot для основной таблиы 2. Join с тремя агрегатными таблицами 3. Pivot того что получилось.
Правда я не уверен что это будет быстрее.

mbolik1

И ещё вопросы:
1. Как часто меняются данные таблицах?
2. Как часто тебе нужно их забирать?

kill-still

да в рот их ебать, конвейерные они или нет
думать не пытался? :(
http://bit.ly/1mKpnjp
ясен пень они у тебя тормозят

ppp6663669

Крот, дорогой, читай пожалуйста внимательнее то, что я пишу.
я знаю что такое конвейерные функции
я вообще против функций в загрузках DWH
проблема с функциями не стоит, я от них избавился.
проблема в том, что джойнятся не по ключу
а по каждому столбцу
все говно до меня отрабатывало часов 8. я попробовал 40 раз наджойнить таблицы, это заняло 80 минут. попробовал 100, оставил, какой результат - не знаю (ушел вчера домой, плюс 100 эти попробовал не хешем а нестед лупсами с индекс рендж сканом). если он увеличивается пропорционально - это проблема.
Картинко для маштаба :)

ppp6663669

меняются постоянно, забирать каждый день

mbolik1

меняются постоянно
1. Сколько строк в день в среднем:
1. Добавляется/изменяется в основной таблице
2. Удаляется в основной таблице
3. Добавляется/изменяется в дополнительных таблицах
4. Удаляется из дополнительных таблиц
2. Те же параметры, но пиковые значения.

ppp6663669

Да, но зачем? (С)
Предложение подумать об инкрементальности вместо полного перекачивания? Подумаю, ок.

ppp6663669

В общем прописанный руками юз_нл на 270 таблиц отработал за 1400 секунд
Тему можно закрывать )))
слава ораклу, героям слава ! :)
Оставить комментарий
Имя или ник:
Комментарий: