Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
большие системы
|
|||
|---|---|---|---|
|
#18+
Есть вопрос, скорее даже на проектирование БД... Суть, есть некая расчетная система, СУБД выбран Postgresql. С определенной периодичностью данные попадают в табличку (в основном update) и затем через систему триггеров кучу всего изменют (тарифы, балансы и прочую зависимую информацию). Табличка - это по сути счетчики потребления. Планируемое кол-во записей в таблице порядка 3-5 млн. При этом за каждое обновление изменяться будет порядка 50-100тыс.записей... несколько раз в час. Данные там иерархические. Хотя иерархию можно жестко порезать до 3-5 вложений. Вот.. Поскольку Postgresql субд версионная, то имхо ему поплохеет от такого масштаба изменений. Вопрос собственно по ньюансам проектирования субд и разнесения информации по таблицам, плюс вопросы по скорости обработки всей этой информации, периодичности запуска аналайзера и вакуума и прочего. Если кто-нибудь пожелает поделиться своим опытом, буду рад выслушать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2006, 22:55 |
|
||
|
большие системы
|
|||
|---|---|---|---|
|
#18+
ДрагаЕсть вопрос, скорее даже на проектирование БД... Суть, есть некая расчетная система, СУБД выбран 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 было максимально. Да, и еще перед проектированием напиться - лично мне помогает %) Вот в принципе и все что я могу тебе посоветовать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2006, 02:03 |
|
||
|
большие системы
|
|||
|---|---|---|---|
|
#18+
Апдейтил 1 поле в таблице ~4 млн записей, заняло времени 2,5 часа.. Vacuum выполняется раз в сутки. А вообще что тебе мешает сделать тестовую базу, забить нужную таблицу и попробовать проапдейтить ее несколько раз? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2006, 04:47 |
|
||
|
большие системы
|
|||
|---|---|---|---|
|
#18+
Попробую вставить свои 5 копеек. В чем основная проблема большого количества обновлений за один раз? ИМХО - это rollback сегмент, в который эти данные будут гнаться как старые. Отсюда и методы борьбы - разнести WAL и данные на разные винты (физические), применение шустрых веников типа скази и т.д. ИМХО количество памяти все равно не критично, ибо основное время будет занимать ожидание сброса данных на веник. Из нерекомендуемого, но чудодейственного :) - отключить fsync, увеличить время сброса на веник и т.д. И кстати, наверно для блокировочников такая задача будет существенно попрощее. Из орагнизации - попробовать разбить обновление на несколько более мелких транзакций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2006, 12:44 |
|
||
|
большие системы
|
|||
|---|---|---|---|
|
#18+
Вот еще из рассылки Постгреса: > 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2006, 09:42 |
|
||
|
большие системы
|
|||
|---|---|---|---|
|
#18+
Можно проектировать базу так, что апдейтов будет немного, или точнее они будут в коротких записях (дисковая цена невелика). например: табла 1: (собственно записи) (id1,..... - все версии записей. Не апдейтятся, а вставляются (могут даже не удаляться - но это отдельная пестня) табла 1пк: ("ключи" записей) (id,id1) тут апдейтится только (id1) - т.е. очень короткая обновляемая запись. Пользователи до завершения обновления видят (id,id1(0)), после (id,id1(1)). (никакого преимущества наверное нет, но зато вы видите все версии (пока их не покоцаете сами).) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2006, 10:55 |
|
||
|
большие системы
|
|||
|---|---|---|---|
|
#18+
Вспомнил еще одну штуку, где-то по МССКЛ была мысль, о разделении таблиц на несколько по типу: 1. Таблица удаленных 2. Таблица вставленных 3. Обновление - есть вставка+удаление ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2006, 12:18 |
|
||
|
большие системы
|
|||
|---|---|---|---|
|
#18+
Andrey Daeron1. Таблица удаленных 2. Таблица вставленных 3. Обновление - есть вставка+удаление ну вот это-то и лишнее (удалять из одной таблы, вставлять в другую) "удаленная", это не имеющая ссылки в "табл 1пк" в поле id1 - т.е не актуальная (не доступная йузерам). Т.е. обновление - вставка (версии) в "табл 1" + обновление сцылки в "табл 1пк". (в часности, любая запись табл 1 должна содержать указатель на id "ключевой" - что делается триггерами на вставку и на апдейт, но не в качестве ФК - для возможности "удаления" записи _без_ требования апдейта (SET NULL/DEFAULT) "версий". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2006, 13:04 |
|
||
|
большие системы
|
|||
|---|---|---|---|
|
#18+
На мой взгляд использование триггеров в бизнес логике приложения неуместно. Там можно написать всё что угодно и потом забыть про него. А потом он взруг начнёт выполняться по нескольку минут и начнётся судорожный поиск где же такое происходит. Лучше весь этот биллинг-метод разбиьт на несколько явно вызывающихся процедур, то есть главное, чтобы видно было. А использование двух таблиц для вставки и удаления происходит не для увеличения производительности, а для того, чтобы иметь лог состояний строки. У меня похожая процедурка выполнялась довольно долго, но т.к. жила в бэкграунде, то для пользователя это было незаметно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2006, 15:02 |
|
||
|
большие системы
|
|||
|---|---|---|---|
|
#18+
А вообще самым эффективным решением будет держать в памяти часть наиболее часто используемых данных и таким образом уменьшать нагрузку на базу. По-моему стоит попробовать и посмотреть что получиться, а потом уже потимизировать процесс. Тюнинг параметров постгреса, отправить лог на другой винт, навернуть памятии конечно же оптимизацуия запросов. Но для этого нужно хотя бы нужно иметь query analyze. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2006, 15:13 |
|
||
|
|

start [/forum/topic.php?desktop=1&fid=53&tid=2006616]: |
0ms |
get settings: |
11ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
62ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
| others: | 271ms |
| total: | 449ms |

| 0 / 0 |
