|
|
|
Работа с секционированными таблицами
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток. Попалась задача на секционированные таблицы. Перекопал кучу инфы, но не представляю что еще почитать чтобы решить следующую задачку: Таблица счетов: Account(ID, AccountNumber, ClientID, DateBegin, DateEnd), Логический ключ = ID, Интервальное секционирование по полю DateEnd, ~50 млн записей Таблица остатков по счетам: AccountRest(ID, AccountID, DateRest, OutRestVal), Логический ключ = AccountID, списочное секционирование по DateRest, 1 500 млн записей Таблица клиентов: Client(ID, ClientName, DateBegin, DateEnd) , Логический ключ = ID, Интервальное секционирование по полю DateEnd, ~10 млн записей Задача: напишите запрос на SQL (с учетом диалекта и доп возможностей Oracle) возвращающий наиболее эффективно с точки зрения производительности следующие данные: Для заданной даты получить Номера счета, наименования клиентов по этим счетам и остатки по этим счетам Аргументируйте свой ответ Если не учитывать секционирование, как я представляю запрос чтобы получить то что требуется в задаче будет следующим: SELECT ac.AccountNumber, cl.Clientname, ar.OutRestVal FROM Account ac JOIN Client cl ON ac.ClientID = cl.ID AND TO_DATE('2004-05-03', 'yyyy-mm-dd') BETWEEN ac.DateBegin AND ac.DateEnd JOIN AccountRest ar ON ac.ID = ar.AccountID Подскажите пожалуйста где почитать и как примерно подходить к решению данной задачки? Инфу по работе с секционированием в Oracle я перечитал, но как ее применить относительно данного случая?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2017, 20:55 |
|
||
|
Работа с секционированными таблицами
|
|||
|---|---|---|---|
|
#18+
Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2017, 22:04 |
|
||
|
Работа с секционированными таблицами
|
|||
|---|---|---|---|
|
#18+
Fogel, спасибо. Это как альтернатива моему запросу, и конечно же аккуратнее. Я с секционированием не понимаю логики работы с тремя таблицами с разными количествами записей. Конечно же секционирование позволяет ускорить запросы при обращении к каждой, но как это соотнести с разным количеством записей 50 млн, 1500 млн и 10 млн. Подозреваю, что есть какие-то общие подходы при обработке данных в такого типа таблицах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2017, 11:21 |
|
||
|
Работа с секционированными таблицами
|
|||
|---|---|---|---|
|
#18+
evgeny643, думается, суть вопроса была в том, чтобы "посадить" условия запроса на схему секционирования таблиц и заставить работать механизм partition pruning для исключения из рассмотрения секций, не содержащих требуемых в результате выборки данных... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2017, 11:48 |
|
||
|
Работа с секционированными таблицами
|
|||
|---|---|---|---|
|
#18+
Как строить: Про индексы и распределение по секциям ничего не сказано => ждем FTS и HJ, не запариваемся. Предполагаем, что на дату количество остатков соответствует количеству активных счетов. - Начинаем с клиентов (с одной стороны, самая скромная табличка, с другой - ну логично же :):) ) Секционирование интервальное, по дате окончания валидности записи. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. - дальше без вариантов цепляем account. Без вариантов inner join, клиенты без счетов и счета без клиентов по условию не требуеются. Секционирование учитываем аналогично предыдущему пункту Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. - финал: забираем остатки. В принципе, по логике тут может ждать засада - остаток на дату не обязательно сформирован по всем счетам, и по-хорошему следовало бы поискать "ближайший". Но это не относится непосредственно к теме учета секционирования, потому забьем для ясности изложения. Зато к вопросу относится указание, что секционирование - списочное, т.е. надо четко "попасть" в ключ. Поскольку в условии не указано иное, предположим, что дата в ключе обрезана до начала суток ('DD'). Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2017, 13:53 |
|
||
|
Работа с секционированными таблицами
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous, спасибо огромное. Долго пытался разобраться, похоже нужно больше времени ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2017, 20:21 |
|
||
|
Работа с секционированными таблицами
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous- финал: забираем остатки. В принципе, по логике тут может ждать засада - остаток на дату не обязательно сформирован по всем счетам, и по-хорошему следовало бы поискать "ближайший". с етим и будет загвоздка, так как нет даты окончания действия остатка раз есть секционирование по DateRest, то мож и остаток формируют за каждый день ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2017, 11:31 |
|
||
|
|

start [/forum/topic.php?fid=52&gotonew=1&tid=1884781]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
151ms |
get topic data: |
8ms |
get first new msg: |
5ms |
get forum data: |
2ms |
get page messages: |
33ms |
get tp. blocked users: |
1ms |
| others: | 213ms |
| total: | 442ms |

| 0 / 0 |
