Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Новый топик    Ответить
 Partitioned by range таблица  [new]
kasyanov
Member

Откуда:
Сообщений: 231
У меня есть табличка в DB2 9.1 на z/OS, заполненная персональными данными людей.
Табличка большая, будет 200 млн строк. На каждого человека – одна строка. Заполняется она программой автогенерации на основании статистики использования фамилий и имен, то есть с учетом реального процентного соотношения разных фамилий. То есть Смирновых и Ивановых там около 2 % от общего числа, ну и так далее по убыванию втсречаемости.
Есть мысль сделать партиционное табличное пространство для обеспечения параллелизма. И сделать table-partitioned распределение по диапазонам на основании колонки с фамилией. Я так понимаю,что нужно так определить диапазоны, чтобы на каждый из них попадало примерно одинаковое количество записей (не индексных, а данных)?
Как бы так написать запрос на тестовой таблице (скажем в 2 млн строк), чтобы понять, какие диапазоны сделать. Например, решаем сделать 10 партиций, и хотим получить примерно такой резалт :
От АБА до БАК – 10%
От БАЛ до БЕШ – 10 %

Вся ИВА – 10%
и т.д.

Я думаю, проще написать програмку с курсором, которая, зная сколько всего записей, при достижении каждых 10 % запоминает значение ключевого поля…
14 окт 10, 17:56    [9609415]     Ответить | Цитировать Сообщить модератору
 Re: Partitioned by range таблица  [new]
kasyanov
Member

Откуда:
Сообщений: 231
Сделал одним запросом. В таблице lastnames содержится фамилия (MAN_NAME) и коэффициент ее использования (coeff), так что сумма всех коэффициентов около 1. Тогда считаем коэффициент нарастающим итогом, и путем целочисленного деления определяем переходы. Запрос делит массив на 20 частей (правда, использовал rownum на персоналке с 9.7 для удобства определения предыдущей записи).

with t as (
select substr(man_name,1,3) part,sum(coeff) sumcoeff 
from lastnames 
group by substr(man_name,1,3) ), t1 as (
select part,(select sum(sumcoeff) from t as ts where ts.part < t.part) incsum
from t), t2 as (
select rownum rn, part, incsum, mod(incsum*10000, 500) modsum from t1), t3 as (
select part, incsum, modsum, (select modsum from t2 as t2p where t2p.rn=t2.rn-1) prevmodsum from t2)
select part, incsum
from t3
where prevmodsum>modsum
;


 PART INCSUM
---- ----------
БАМ 0.0504042
БОШ 0.10048607
ВОС 0.15482963
ГРО 0.20378977
ЕВГ 0.25009441
ЗИП 0.30068005
КАТ 0.35017225
КОС 0.40858455
КУН 0.45271053
ЛУН 0.50105814
МИС 0.55150333
НИЛ 0.60074158
ПЕХ 0.65276848
ПЫН 0.70005917
СЕК 0.75002757
СОМ 0.80250228
ТИШ 0.85172711
ФУН 0.90001135
ШАР 0.9511417
ЯШН 0.99995435
15 окт 10, 10:12    [9611873]     Ответить | Цитировать Сообщить модератору
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Ответить