Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Билинговая система / 6 сообщений из 6, страница 1 из 1
13.08.2005, 14:16
    #33214174
prgm_alx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Билинговая система
Приветствую мастеров греса.
Пришел со следующей проблемой:
В настоящий момент разрабатываю билинговую систему, которая должна фиксировать сколько раз в час каждый клиент (прибор в моем случае) вышел на связь + записать его характеристики. Проблема в том, что этих приборов достаточно много, система должна функционировать 24 часа в сутки 365 дней в году.
Далее к проблеме:
Есть основная таблица Component
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
CREATE TABLE Component
(
    ComponentId         SERIAL      NOT NULL,
    Version             INTEGER     NOT NULL,
    ClientId            INTEGER     NOT NULL,
    CreateDate          TIMESTAMP   NOT NULL DEFAULT current_timestamp,
	VisitDate			DATE			NULL,
	VisitCount_01		INT			NOT NULL DEFAULT  0 ,
	VisitCount_02		INT			NOT NULL DEFAULT  0 ,
	VisitCount_03		INT			NOT NULL DEFAULT  0 ,
	VisitCount_04		INT			NOT NULL DEFAULT  0 ,
	VisitCount_05		INT			NOT NULL DEFAULT  0 ,
	VisitCount_06		INT			NOT NULL DEFAULT  0 ,
	VisitCount_07		INT			NOT NULL DEFAULT  0 ,
	VisitCount_08		INT			NOT NULL DEFAULT  0 ,
	VisitCount_09		INT			NOT NULL DEFAULT  0 ,
	VisitCount_10		INT			NOT NULL DEFAULT  0 ,
	VisitCount_11		INT			NOT NULL DEFAULT  0 ,
	VisitCount_12		INT			NOT NULL DEFAULT  0 ,
	VisitCount_13		INT			NOT NULL DEFAULT  0 ,
	VisitCount_14		INT			NOT NULL DEFAULT  0 ,
	VisitCount_15		INT			NOT NULL DEFAULT  0 ,
	VisitCount_16		INT			NOT NULL DEFAULT  0 ,
	VisitCount_17		INT			NOT NULL DEFAULT  0 ,
	VisitCount_18		INT			NOT NULL DEFAULT  0 ,
	VisitCount_19		INT			NOT NULL DEFAULT  0 ,
	VisitCount_20		INT			NOT NULL DEFAULT  0 ,
	VisitCount_21		INT			NOT NULL DEFAULT  0 ,
	VisitCount_22		INT			NOT NULL DEFAULT  0 ,
	VisitCount_23		INT			NOT NULL DEFAULT  0 ,
        ....

    CONSTRAINT PK_Component PRIMARY KEY
    (
        ComponentId
    ),
    CONSTRAINT FK_Component_Client FOREIGN KEY 
    (
        ClientId
    ) REFERENCES Client (
        ClientId
    )
);

ALTER TABLE Component CLUSTER ON PK_Component;

CREATE INDEX "IX_Component_VisitDate"   ON Component (VisitDate);

В этой таблице по расчетам будет 10 000 000 записей за год.
Каждый прибор выходит на связь примерно 3-5 раз в день, он отмечаемя на сервере, записывает нужную информацию или обновляет ее.

Но, заказчику нужна еще информация сколько приборов выходило на связь каждый день.
Для этого я разработал сводную таблицу, которая по моей идее должна заполнять раз в сутки.
Таблица имеет вид:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
CREATE TABLE ComponentLog
(
	VisitDate			DATE		NOT NULL,
    ClientId            INTEGER		NOT NULL,
	VisitCount_01		INT			NOT NULL DEFAULT  0 ,
	VisitCount_02		INT			NOT NULL DEFAULT  0 ,
	VisitCount_03		INT			NOT NULL DEFAULT  0 ,
	VisitCount_04		INT			NOT NULL DEFAULT  0 ,
	VisitCount_05		INT			NOT NULL DEFAULT  0 ,
	VisitCount_06		INT			NOT NULL DEFAULT  0 ,
	VisitCount_07		INT			NOT NULL DEFAULT  0 ,
	VisitCount_08		INT			NOT NULL DEFAULT  0 ,
	VisitCount_09		INT			NOT NULL DEFAULT  0 ,
	VisitCount_10		INT			NOT NULL DEFAULT  0 ,
	VisitCount_11		INT			NOT NULL DEFAULT  0 ,
	VisitCount_12		INT			NOT NULL DEFAULT  0 ,
	VisitCount_13		INT			NOT NULL DEFAULT  0 ,
	VisitCount_14		INT			NOT NULL DEFAULT  0 ,
	VisitCount_15		INT			NOT NULL DEFAULT  0 ,
	VisitCount_16		INT			NOT NULL DEFAULT  0 ,
	VisitCount_17		INT			NOT NULL DEFAULT  0 ,
	VisitCount_18		INT			NOT NULL DEFAULT  0 ,
	VisitCount_19		INT			NOT NULL DEFAULT  0 ,
	VisitCount_20		INT			NOT NULL DEFAULT  0 ,
	VisitCount_21		INT			NOT NULL DEFAULT  0 ,
	VisitCount_22		INT			NOT NULL DEFAULT  0 ,
	VisitCount_23		INT			NOT NULL DEFAULT  0 ,

    CONSTRAINT FK_ComponentLog_Client FOREIGN KEY 
    (
        ClientId
    ) REFERENCES Client (
        ClientId
    )
);
Эту таблицу заполняет скрипт
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
INSERT INTO ComponentLog
SELECT
	VisitDate,
	ClientId,
	SUM(
		CASE
			WHEN VisitCount_01 >  0  THEN  1 
			ELSE  0 
		END
	) AS VisitCount_01,
	SUM(
		CASE
			WHEN VisitCount_02 >  0  THEN  1 
			ELSE  0 
		END
	) AS VisitCount_02,
	SUM(
		CASE
			WHEN VisitCount_03 >  0  THEN  1 
			ELSE  0 
		END
	) AS VisitCount_03,
	SUM(
		CASE
			WHEN VisitCount_04 >  0  THEN  1 
			ELSE  0 
		END
	) AS VisitCount_04,
	SUM(
		CASE
			WHEN VisitCount_05 >  0  THEN  1 
			ELSE  0 
		END
	) AS VisitCount_05,
	SUM(
		CASE
			WHEN VisitCount_06 >  0  THEN  1 
			ELSE  0 
		END
	) AS VisitCount_06,
	SUM(
		CASE
			WHEN VisitCount_07 >  0  THEN  1 
			ELSE  0 
		END
	) AS VisitCount_07,
	SUM(
		CASE
			WHEN VisitCount_08 >  0  THEN  1 
			ELSE  0 
		END
	) AS VisitCount_08,
	SUM(
		CASE
			WHEN VisitCount_09 >  0  THEN  1 
			ELSE  0 
		END
	) AS VisitCount_09,
	SUM(
		CASE
			WHEN VisitCount_10 >  0  THEN  1 
			ELSE  0 
		END
	) AS VisitCount_10,
	SUM(
		CASE
			WHEN VisitCount_11 >  0  THEN  1 
			ELSE  0 
		END
	) AS VisitCount_11,
	SUM(
		CASE
			WHEN VisitCount_12 >  0  THEN  1 
			ELSE  0 
		END
	) AS VisitCount_12,
	SUM(
		CASE
			WHEN VisitCount_13 >  0  THEN  1 
			ELSE  0 
		END
	) AS VisitCount_13,
	SUM(
		CASE
			WHEN VisitCount_14 >  0  THEN  1 
			ELSE  0 
		END
	) AS VisitCount_14,
	SUM(
		CASE
			WHEN VisitCount_15 >  0  THEN  1 
			ELSE  0 
		END
	) AS VisitCount_15,
	SUM(
		CASE
			WHEN VisitCount_16 >  0  THEN  1 
			ELSE  0 
		END
	) AS VisitCount_16,
	SUM(
		CASE
			WHEN VisitCount_17 >  0  THEN  1 
			ELSE  0 
		END
	) AS VisitCount_17,
	SUM(
		CASE
			WHEN VisitCount_18 >  0  THEN  1 
			ELSE  0 
		END
	) AS VisitCount_18,
	SUM(
		CASE
			WHEN VisitCount_19 >  0  THEN  1 
			ELSE  0 
		END
	) AS VisitCount_19,
	SUM(
		CASE
			WHEN VisitCount_20 >  0  THEN  1 
			ELSE  0 
		END
	) AS VisitCount_20,
	SUM(
		CASE
			WHEN VisitCount_21 >  0  THEN  1 
			ELSE  0 
		END
	) AS VisitCount_21,
	SUM(
		CASE
			WHEN VisitCount_22 >  0  THEN  1 
			ELSE  0 
		END
	) AS VisitCount_22,
	SUM(
		CASE
			WHEN VisitCount_23 >  0  THEN  1 
			ELSE  0 
		END
	) AS VisitCount_23

FROM
	Component
GROUP BY
	VisitDate,
	ClientId
Он работает медленно, но терпимо, на моем железе около 5 мин (будет запускать каждые сутки в 00.00)
После того как отработает этот скрипт мне нужно обновить таблицу Component, чтоб новые выходы на связь считались в новых сутках. Для этого после певого (представленный выше) скрипта выполняется второй
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
UPDATE
	Component
SET
	VisitDate			= NULL,
	VisitCount_01		=  0 ,
	VisitCount_02		=  0 ,
	VisitCount_03		=  0 ,
	VisitCount_04		=  0 ,
	VisitCount_05		=  0 ,
	VisitCount_06		=  0 ,
	VisitCount_07		=  0 ,
	VisitCount_08		=  0 ,
	VisitCount_09		=  0 ,
	VisitCount_10		=  0 ,
	VisitCount_11		=  0 ,
	VisitCount_12		=  0 ,
	VisitCount_13		=  0 ,
	VisitCount_14		=  0 ,
	VisitCount_15		=  0 ,
	VisitCount_16		=  0 ,
	VisitCount_17		=  0 ,
	VisitCount_18		=  0 ,
	VisitCount_19		=  0 ,
	VisitCount_20		=  0 ,
	VisitCount_21		=  0 ,
	VisitCount_22		=  0 ,
	VisitCount_23		=  0 
Дык проблема в том, что этот запрос выполняется на моих данных час!!!
Это никуда не годится, кто что посоветует???
...
Рейтинг: 0 / 0
14.08.2005, 00:01
    #33214391
vfabr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Билинговая система
сдается мне что таблицы можно организовать по другому тогда может и запросы покороче будут

честно особо не вникал в суть но большое колличество столбцов и многоточие после них наводит на мысли ...
...
Рейтинг: 0 / 0
15.08.2005, 10:27
    #33214996
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Билинговая система
prgm_alxПосле того как отработает этот скрипт мне нужно обновить таблицу Component, чтоб новые выходы на связь считались в новых сутках. Для этого после певого (представленный выше) скрипта выполняется второй
Код: plaintext
1.
2.
3.
4.
5.
6.
UPDATE
	Component
SET
	VisitDate			= NULL,
	VisitCount_01		=  0 ,
	VisitCount_02		=  0 ,
...
Дык проблема в том, что этот запрос выполняется на моих данных час!!!
Это никуда не годится, кто что посоветует???Вообще не запускать второй скрипт, а в первый добавить условие типа WHERE VisitDate = now().
...
Рейтинг: 0 / 0
15.08.2005, 10:29
    #33215001
4321
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Билинговая система
1. Не подскажете, где этто у насс 23 часа в сссутки?
2. А чё б вам попросту не транкейтить таблицу компонент? (или дропать). Ну не всю, ес-но, а ея переменную часть. Попросту вынесите переменную часть таблицы в отдельную, связанную с исходной 1-1...

Или хотяб перед апдейтами дропните все индексы, в которые входят обновляемые поля. И поднимите после апдейта. (Если висят триггера на апдейт, или условия на целосность - сделайте то же самое -дроп в начале транзакции + подъем в конце).
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
27.09.2007, 20:53
    #34832859
Shweik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Билинговая система
Может прежде стоит ознакомиться с аналогичными открытыми системами ?
Например
netams - учёт траффика с возможностью биллинга
atslog - учёт звонков мини атски.
Оба проекта держат опционально поддерживают хранение данных в PostgreSQL.
В частности вопрос о заливке сырых данных от какихто устройств/процессов в постгрес
тут уже поднимался - см поиск.
...
Рейтинг: 0 / 0
28.09.2007, 10:21
    #34833584
Vladimir Kozlov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Билинговая система
DeN1X_DeN1SПомогите сделать элементарную билинговую систему на java! Пожалуйста

О, пятница :)
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Билинговая система / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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