powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Partitioned by range таблица
2 сообщений из 2, страница 1 из 1
Partitioned by range таблица
    #36900074
kasyanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня есть табличка в DB2 9.1 на z/OS, заполненная персональными данными людей.
Табличка большая, будет 200 млн строк. На каждого человека – одна строка. Заполняется она программой автогенерации на основании статистики использования фамилий и имен, то есть с учетом реального процентного соотношения разных фамилий. То есть Смирновых и Ивановых там около 2 % от общего числа, ну и так далее по убыванию втсречаемости.
Есть мысль сделать партиционное табличное пространство для обеспечения параллелизма. И сделать table-partitioned распределение по диапазонам на основании колонки с фамилией. Я так понимаю,что нужно так определить диапазоны, чтобы на каждый из них попадало примерно одинаковое количество записей (не индексных, а данных)?
Как бы так написать запрос на тестовой таблице (скажем в 2 млн строк), чтобы понять, какие диапазоны сделать. Например, решаем сделать 10 партиций, и хотим получить примерно такой резалт :
От АБА до БАК – 10%
От БАЛ до БЕШ – 10 %

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

Я думаю, проще написать програмку с курсором, которая, зная сколько всего записей, при достижении каждых 10 % запоминает значение ключевого поля…
...
Рейтинг: 0 / 0
Partitioned by range таблица
    #36900733
kasyanov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал одним запросом. В таблице lastnames содержится фамилия (MAN_NAME) и коэффициент ее использования (coeff), так что сумма всех коэффициентов около 1. Тогда считаем коэффициент нарастающим итогом, и путем целочисленного деления определяем переходы. Запрос делит массив на 20 частей (правда, использовал rownum на персоналке с 9.7 для удобства определения предыдущей записи).

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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
;


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
 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
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Partitioned by range таблица
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]