Сообщения

Сообщения за сентябрь, 2013

Балансировка потоков в Oracle

При параллельной загрузке данных в хранилище, чтобы уменьшить время общей загрузки таблиц часто применяется динамическая балансировка по потокам. То есть, разные задачи группируются в какое то количество потоков (обычно константа, но может также меняться в зависимости от разных условий). Выходит что на основании веса разбиваем задачи на несколько потоков, желательно чтобы  максимальный суммарный вес одного потока был минимальным. Итак получается:  Задача о ранце (рюкзаке)  ( англ.   Knapsack problem )  .  Но приведу более простой алгоритм, может и не самый эффективный, но простой и удобный в реализации. Весом могут быть разные параметры,  например: время загрузки в прошлый раз количество строк размер таблицы статистике Балансировку можно делать каждый раз, или в какой то период, и каждый раз задача может попадать в разные потоки. Реализация алгоритма на Oracle: WITH --элементы с весом или продолжительностью ITEMS AS ...

Динамическое получение диапазона дат партиций Oracle

Получить динамический диапазон дат в партициях можно из поля  HIGH_VALUE  в таблице  USER_TAB_PARTITIONS.   Но тут возникают проблемы что поле  HIGH_VALUE имеет тип LONG и не совсем удобно с ним работать не прибегая к помощи PLSQL. Но данную проблему легко решить воспользовавшись функцией  DBMS_XMLGEN.GETXMLTYPE                  Реализация алгоритма на Oracle: SELECT TABLE_NAME, PARTITION_NAME, PARTITION_POSITION, CASE WHEN PARTITION_NAME='PMAX' THEN TO_DATE('2999-12-31 00:00:00', 'yyyy-mm-dd hh24:mi:ss')+1 ELSE TO_DATE(TRIM('''' FROM REGEXP_SUBSTR(EXTRACTVALUE(DBMS_XMLGEN. GETXMLTYPE('select high_value from user_tab_partitions where table_name=''' || TABLE_NAME || ''' and partition_name = ''' || PARTITION_NAME || ...

Олимпиадная задача по Oracle

Вчера упала интересная задача, которая сводится до элементарной, которая аналогичная олимпиадной задаче Oracle. Хочу ее вынести сюда, и показать ее решение на базе алгоритма "схлопывания". Итак, есть таблица: EFF_DTTM EXP_DTTM 01.01.2013 05.01.2013 05.01.2013 08.01.2013 08.01.2013 09.01.2013 11.01.2013 15.01.2013 15.01.2013 25.01.2013 28.01.2013 30.01.2013 Нужно склеить подряд идущие даты и вывести их границы. То есть ожидаемый результат: EFF_DTTM EXP_DTTM 28.01.2013 30.01.2013 11.01.2013 25.01.2013 01.01.2013 09.01.2013 Алгоритм более сложный чем необходимо для такого упрощенного случая, но при реальном использовании появятся еще и бизнес поля, тогда алгоритм подойдет очень хорошо. Так как для схлопывания с учетом дырок в истории понадобится еще учет изменения бизнес полей. Реализация алгоритма на Oracle: WITH --исходные данные T0 AS ( SELECT TO_DATE('01.01.2013', 'DD.MM.YYYY')EFF_DTTM, TO_DATE('05.01.2013', 'DD.MM.Y...