Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Автоматическое секционирование.  [new]
Sand Winter
Member

Откуда: ­ Д
Сообщений: 3272
В общем:
Есть несколько таблиц (dwh). Секционированы range по дате +hash. Данные за разные периоды могут выгружаться в разном порядке, секции, наверно, могут и ручками создать.
В связи с этим добавление(split) партиций в автомате чревато багами.
Очень не хочется браться за это.

Принимаю полезные советы по архитектуре и/или решению:)

P.S. раз в месяц ходит джоб удаляет устаревшие секции.
19 июл 07, 18:03    [4411983]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое секционирование.  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
Полезные советы
19 июл 07, 19:03    [4412361]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое секционирование.  [new]
Sand Winter
Member

Откуда: ­ Д
Сообщений: 3272
SQL*Plus
Полезные советы


Какие детали Вам непонятны? версия от 9ки и выше.
19 июл 07, 19:07    [4412389]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое секционирование.  [new]
Sevick
Member

Откуда: из-за компа
Сообщений: 833
Sand Winter

В связи с этим добавление(split) партиций в автомате чревато багами.


Какие вы видите препятствия?
19 июл 07, 19:23    [4412485]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое секционирование.  [new]
SERG1257
Member

Откуда:
Сообщений: 2789
Решение "в лоб" - создать заранее нужное количество партиций (пустых) и проследить за отсутствием багов.
Не понял насчет удаляет устаревшие секции.
Не понял, что вы называете "в автомате"

Sand Winter
Очень не хочется браться за это.

Надо Федя, надо :-)
19 июл 07, 20:25    [4412701]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое секционирование.  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18363
Сейчас работаю с системой, где подобное реализовано.
Есть:
- собственный словарь данных системы, где помечены объекты, подлежащие секционированию.
Список настраивается.
Для каждого задействованного индекса можно пометить - локальный или нет.
- поддерживается ровно два вида секционирования: для статических данных по ID и для трафика - "rolling window" по датам
- Все секционированные объекты одного класса бьются на равное количество секций с идентичными границами.
- Написана пара пакетов, которые реализуют, собственно, логику секционирования. Достаточно проработанную - умеют провести анализ и выбрать среди split и add, ведут логи и внятно сигнализируют об ошибках.
- Есть внешняя утилита, которая цепляется и выполняет "высокоуровневую" логику.
На круг довольно удобно: заходишь в консоль и говоришь примерно так: "а нарежь-ка, голубчик, два десятка двухнедельных партиций для трафика"...
И идешь курить :)
19 июл 07, 22:47    [4413011]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое секционирование.  [new]
Sand Winter
Member

Откуда: ­ Д
Сообщений: 3272
2 andrey_anonymous
Спасибо успокоили, хоть кто-то так делает

2 SERG1257
ок, надо:)
В автомате, значит, не руками. Пошли данные за новый месяц в автомате прицепили секцию, т.е. без надзора админа.
Удаляет (drop, а может и truncate) устаревшие секции ( ну скажем постановили, что нам нужны данные только за последние 12 месяцев, тогда все остальные устаревшие).
"Решение в лоб" мы тоже рассматривали - отложили на случай "если c автоматом совсем плохо будет".

2Sevick
Препятствий никаких, но у Андрея в системе для этого написана пара пакетов, а это ровно в 4 раза больше, чем написано у меня:)
А чем больше кода, тем больше багов. И плюс это ddl, что от него хорошего ждать.
20 июл 07, 09:40    [4413656]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое секционирование.  [new]
Sand Winter
Member

Откуда: ­ Д
Сообщений: 3272
procedure Get_New_And_old_parts(i_Table_Name varchar2, i_schema varchar2, i_Month date,
         o_New_Part out varchar2, o_Old_Part out varchar2)
is
  type t_List is table of varchar2(32765);
  l_Parts   t_List;
  l_MaxVals t_List;
  l_query varchar2(32765);
  l_find number;
  l_date date;
begin  
  select Partition_Name, Ap.High_Value bulk collect
    into l_Parts, l_MaxVals
    from All_Tab_Partitions Ap
   where Ap.Table_Name = i_Table_Name
     and Ap.Table_Owner = i_schema
   order by Ap.Partition_Position;

  for i in 1..l_Parts.count loop
    if l_MaxVals(i) <> 'MAXVALUE' then
      l_query := l_query ||', '||l_MaxVals(i)||chr(10);
    end if;
  end loop;
  
    l_query :=
'declare
  type t_Date is varray('||l_Parts.count||') of date;
  l_d t_Date:=t_Date('||substr(l_query,2)||');
  l_find number;
begin
  for i in 1 .. l_d.count loop
    if l_d(i) > :i_Month then
      l_Find := i;
      :date := l_d(i);
      exit;
    end if;
  end loop;
  if l_find is NULL and l_d.count < l_d.limit then
    l_find := l_d.limit;
  end if;  
  :find := l_find;
end;';

--Log_debug('TEST', l_query);
    execute immediate l_query 
    using in i_Month, out l_date, out l_find;

    if l_date <> add_months(i_month,1) or l_date is Null then -- в этом случае нужна новая секция
      o_New_Part := i_Table_Name ||'_'||To_Char(i_Month, 'MMYYYY');
      if l_find is not NULL then -- нашлась старая секция с этим месяцем
        o_Old_Part := l_Parts(l_Find);      
      end if;
    end if;
end;

Вот такой уродец уродился. o_New_Part - имя новой секции, o_Old_Part - имя секции которой делаем SPLIT, если NULL то add. На простой таблице, видимо, грязно выругается. Будем тестироваться:(
21 июл 07, 19:27    [4419931]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое секционирование.  [new]
ora_live
Member

Откуда: http://cleanmonday.ru/
Сообщений: 198
Sand Winter

for i in 1..l_Parts.count loop
if l_MaxVals(i) <> 'MAXVALUE' then
l_query := l_query ||', '||l_MaxVals(i)||chr(10);
end if;
end loop;


Если данная процедура всегда применяется к таблицам в которых есть секция maxvalue, то условие if l_MaxVals(i) <> 'MAXVALUE' можно убрать, а цикл сделать до l_Parts.count-1.
21 июл 07, 22:51    [4420141]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Автоматическое секционирование.  [new]
ILoveCoffee
Member

Откуда: Astana
Сообщений: 986
а секционирование входит в стандартную поставку 10g EE? Бесплатно ?
17 фев 09, 12:04    [6828236]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое секционирование.  [new]
ILoveCoffee
Member

Откуда: Astana
Сообщений: 986
Изв. за оффтоп.
17 фев 09, 12:04    [6828241]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое секционирование.  [new]
ILoveCoffee
Member

Откуда: Astana
Сообщений: 986
Имелось ввиду Enterprise -)) изв туплю.
17 фев 09, 12:06    [6828254]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое секционирование.  [new]
Андрей Панфилов
Member

Откуда: Москва > Melbourne
Сообщений: 3778
ILoveCoffee,

http://www.oracle.com/corporate/pricing/technology-price-list.pdf
17 фев 09, 12:07    [6828265]     Ответить | Цитировать Сообщить модератору
 Re: Автоматическое секционирование.  [new]
dimacrat
Member

Откуда: Москва
Сообщений: 305
ILoveCoffee,

Это опция Enterpise Edition. Стоит отдельных денег.
17 фев 09, 12:08    [6828272]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить