powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / большие системы
11 сообщений из 11, страница 1 из 1
большие системы
    #33542160
Драга
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть вопрос, скорее даже на проектирование БД...

Суть, есть некая расчетная система, СУБД выбран Postgresql.
С определенной периодичностью данные попадают в табличку (в основном update) и затем через систему триггеров кучу всего изменют (тарифы, балансы и прочую зависимую информацию).

Табличка - это по сути счетчики потребления. Планируемое кол-во записей в таблице порядка 3-5 млн. При этом за каждое обновление изменяться будет порядка 50-100тыс.записей... несколько раз в час. Данные там иерархические. Хотя иерархию можно жестко порезать до 3-5 вложений.

Вот.. Поскольку Postgresql субд версионная, то имхо ему поплохеет от такого масштаба изменений.

Вопрос собственно по ньюансам проектирования субд и разнесения информации по таблицам, плюс вопросы по скорости обработки всей этой информации, периодичности запуска аналайзера и вакуума и прочего.

Если кто-нибудь пожелает поделиться своим опытом, буду рад выслушать.
...
Рейтинг: 0 / 0
большие системы
    #33542282
ZiNTeR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ДрагаЕсть вопрос, скорее даже на проектирование БД...

Суть, есть некая расчетная система, СУБД выбран Postgresql.
С определенной периодичностью данные попадают в табличку (в основном update) и затем через систему триггеров кучу всего изменют (тарифы, балансы и прочую зависимую информацию).

Табличка - это по сути счетчики потребления. Планируемое кол-во записей в таблице порядка 3-5 млн. При этом за каждое обновление изменяться будет порядка 50-100тыс.записей... несколько раз в час. Данные там иерархические. Хотя иерархию можно жестко порезать до 3-5 вложений.

Вот.. Поскольку Postgresql субд версионная, то имхо ему поплохеет от такого масштаба изменений.

Вопрос собственно по ньюансам проектирования субд и разнесения информации по таблицам, плюс вопросы по скорости обработки всей этой информации, периодичности запуска аналайзера и вакуума и прочего.

Если кто-нибудь пожелает поделиться своим опытом, буду рад выслушать.
Назови мне хотя одну СУБД, которая будет от радости танцевать при таких объемах :)
Если честно, то еще не успел поработать с такими объемами в postgreSQL - было дело в myql - база была более 150 метров, так вот:
Был атаблица items с товарами, где было одно поле типа text. Когда в таблице стало данных до указанного мной объема ее надо было переработать в php (в Mysql такую обработку в принципе сделать невозможно) и было там одно поле "av" - тип Integer - там были значения 0 или 1 - в зависимости от того,было ли поле уже обработано, или нет. Так вот, когда я писал обработчки (он должен был из этой таблицы в другую по своим правилам вытащить данные - конкретнее - описание товаров выдрать из html кода страниц по жутким правилам) Короче, когда я делал откат к первому - то есть запрос типа update ... set av=0 то он обрабатывался более 30 секунд :). Конечно, ситуация в postgreSQL явно была бы не столь плачевная, но все же...
Отсюда единственное, что я могу (исходя из своего опыта) подсказать - Если сущность(объект) имеет множество параметров состояния(считай полей в БД) то лучше их разбить по нескольким таблицам - желательно - по частоте применения. То есть, те, с которыми работаешь достаточно часто - 1 таблица, те, с которыми пореже - во 2-ой. Идеальный вариант - так сказать разбить по таблицам на основе представлений. То есть - к примеру - список товаров: здесь у товара краткое представление - или просмотр товара - ту полное представление - которое будет вызываться реже, чем краткое, следовательно...
Что еще тебе могу сказать - в этой ситуации тебе стоило бы применять частичную деструктуризацию данных. Иными словами - хранить наиболее используемые данные в нескольких таблицах, чтобы:
1. уменьшать число обойденных за раз таблиц (то есть реально обходиться одним запросом, а не несколькими)
2. Стараться сделать так, чтобы чтобы для этих данных соотношение select/update было максимально.
Да, и еще перед проектированием напиться - лично мне помогает %)
Вот в принципе и все что я могу тебе посоветовать
...
Рейтинг: 0 / 0
большие системы
    #33542313
ChameLe0n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Апдейтил 1 поле в таблице ~4 млн записей, заняло времени 2,5 часа.. Vacuum выполняется раз в сутки. А вообще что тебе мешает сделать тестовую базу, забить нужную таблицу и попробовать проапдейтить ее несколько раз?
...
Рейтинг: 0 / 0
большие системы
    #33543213
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробую вставить свои 5 копеек.
В чем основная проблема большого количества обновлений за один раз? ИМХО - это rollback сегмент, в который эти данные будут гнаться как старые. Отсюда и методы борьбы - разнести WAL и данные на разные винты (физические), применение шустрых веников типа скази и т.д.

ИМХО количество памяти все равно не критично, ибо основное время будет занимать ожидание сброса данных на веник.

Из нерекомендуемого, но чудодейственного :) - отключить fsync, увеличить время сброса на веник и т.д.

И кстати, наверно для блокировочников такая задача будет существенно попрощее.

Из орагнизации - попробовать разбить обновление на несколько более мелких транзакций.
...
Рейтинг: 0 / 0
большие системы
    #33545352
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот еще из рассылки Постгреса:
> Why does Access run so much faster? How can I get Postgres to run as fast
> as Access?

While it's true that Access almost certainly takes some shortcuts, 24
minutes for an update across 1.2 millon rows seems an awefully long time
for Postgres. Is this table exceptionally large in same way (ie: lots
of columns)? I expect running with fsync off would be closer to 'Access
mode' though it has risks (of course). Also, it might be faster to
insert into a seperate table rather than run a huge update like that in
Postgres. Also, if there are indexes on the table in question, you
might drop them before doing the update/insert and recreate them after
the query has finished.
...
Рейтинг: 0 / 0
большие системы
    #33545543
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно проектировать базу так, что апдейтов будет немного, или точнее они будут в коротких записях (дисковая цена невелика).
например:
табла 1:
(собственно записи)
(id1,.....
- все версии записей. Не апдейтятся, а вставляются (могут даже не удаляться - но это отдельная пестня)

табла 1пк:
("ключи" записей)
(id,id1)
тут апдейтится только (id1) - т.е. очень короткая обновляемая запись.

Пользователи до завершения обновления видят (id,id1(0)), после (id,id1(1)).


(никакого преимущества наверное нет, но зато вы видите все версии (пока их не покоцаете сами).)
...
Рейтинг: 0 / 0
большие системы
    #33545867
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вспомнил еще одну штуку, где-то по МССКЛ была мысль, о разделении таблиц на несколько по типу:
1. Таблица удаленных
2. Таблица вставленных
3. Обновление - есть вставка+удаление
...
Рейтинг: 0 / 0
большие системы
    #33546070
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Andrey Daeron1. Таблица удаленных
2. Таблица вставленных
3. Обновление - есть вставка+удаление
ну вот это-то и лишнее (удалять из одной таблы, вставлять в другую)

"удаленная", это не имеющая ссылки в "табл 1пк" в поле id1 - т.е не актуальная (не доступная йузерам). Т.е. обновление - вставка (версии) в "табл 1" + обновление сцылки в "табл 1пк". (в часности, любая запись табл 1 должна содержать указатель на id "ключевой" - что делается триггерами на вставку и на апдейт, но не в качестве ФК - для возможности "удаления" записи _без_ требования апдейта (SET NULL/DEFAULT) "версий".
...
Рейтинг: 0 / 0
большие системы
    #33552388
skyogre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На мой взгляд использование триггеров в бизнес логике приложения неуместно.
Там можно написать всё что угодно и потом забыть про него. А потом он взруг начнёт выполняться по нескольку минут и начнётся судорожный поиск где же такое происходит. Лучше весь этот биллинг-метод разбиьт на несколько явно вызывающихся процедур, то есть главное, чтобы видно было.

А использование двух таблиц для вставки и удаления происходит не для увеличения производительности, а для того, чтобы иметь лог состояний строки.

У меня похожая процедурка выполнялась довольно долго, но т.к. жила в бэкграунде, то для пользователя это было незаметно.
...
Рейтинг: 0 / 0
большие системы
    #33552433
skyogre
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А вообще самым эффективным решением будет держать в памяти часть наиболее часто используемых данных и таким образом уменьшать нагрузку на базу.
По-моему стоит попробовать и посмотреть что получиться, а потом уже потимизировать процесс. Тюнинг параметров постгреса, отправить лог на другой винт, навернуть памятии конечно же оптимизацуия запросов.
Но для этого нужно хотя бы нужно иметь query analyze.
...
Рейтинг: 0 / 0
большие системы
    #33554824
landy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyogre
Но для этого нужно хотя бы нужно иметь query analyze.

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


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