|
|
|
Организация работы с очень большой базой
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, Опишу проблему. Предполагается работать с базой данных, куда записываются данные с испытаний. Испытаний, в теории могут быть десятки, сотни и даже тысячи (хотя это довольно редко). В базе (на данный момент) хранятся вспомогательные объекты и 3 таблицы, куда будут стекаться испытания. Продолжительность каждого испытания не ограничена, но как правило не более 3-х суток (более частый случай - 4-6 часов). Таким образом в эти три таблицы могут с каждого испытания попадать данные в кол-ве от нескольких десятков тысяч до нескольких миллиардов записей (последнее конечно экстремуум, но возможный). Данные с испытаний, конечно же не меняются, но их нужно анализировать. Целиком их загонять на клиента нет смысла, мы хотим выбирать случайную выборку значимого размера и уже потом работать с ней. Каждый раз выбирать из огромной таблицы нельзя с точки зрения человекалюбия с пользователям, посему было принято решение сохранять эти выборки в виде материальных видов (Постгресс 9.4), всё бы ничего, но создание этих выборок зависит от того, захочет ли пользователь анализировать то или иное испытание. Поэтому они будут создаваться по запросу. Так как комбинаций данных очень много, то и таких выборок может быть (от нескольких десятков, до многих сотен, вряд ли до тысячи). Не хотелось бы пользователя заставлять ждать очень долго пока мы там насоздаём этих выборок. Возникла идея, разделять данные в этих трёх больших таблицах по каждому испытанию, в таком случае выборки можно будет строить намного быстрее. Пока что видится три варианта. 1) Разбиение средствами Постгреса. Не совсем понятно, справится ли он с таким кол-вом под-таблиц и насколько он хорошо работает в таком режиме. Как организовать работу внешних ключей в мастер-таблице тоже не ясно. Есть сильное подозрение, что экспорт / импорт в таком случаее будет делом трудоёмким. 2) Тоже самое, что 1) , но реализация разбиения берётся на свои плечи (и свою голову). Не факт, что сильно лучше, но потенциально сильно труднее. 3) Иметь одну мета-базу, где хранятся общие данные и общая логика на фунциях (хранимках), на каждое испытание создавать отдельную базу. Это позволит решить (мы так надеемся) вопрос с производительностью + экспорт и импорт намного проще должны быть. Насколько это легко с точки зрения реализации - совершенно неясно пока что. Опять же непонятно, можно ли работать с таблицами из разных баз для своего анализа (сравнение испытаний). Что скажите, товарищи? PS: если бы у нас большинство сценариев работы были связаны именно с огромным кол-вом испытаний и комбинаций параметров в испытаниях, то мы бы сразу бы ушли в NoSQL, но так как это не более 10% всех случаев, то мы решили сделать на реалиционной базе данных (Пострегрессе). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2015, 18:36 |
|
||
|
Организация работы с очень большой базой
|
|||
|---|---|---|---|
|
#18+
Watakusi, под "разбиением средствами PostgreSQL" подразумевается секционирование (partition) или что-то иное? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2015, 18:47 |
|
||
|
Организация работы с очень большой базой
|
|||
|---|---|---|---|
|
#18+
Добрый Э - Эх, Да, именно это. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2015, 18:51 |
|
||
|
Организация работы с очень большой базой
|
|||
|---|---|---|---|
|
#18+
Watakusi, 1. Проведите эксперимент на на модельных данных и реальном железе. Это можно сделать за 20-30 минут 2. Если не удовлетворены результатами, пишите скрипты вашего эксперимента сюда планы запросов Вот тут человек тоже фантазировал про партиции, потому что индекс сделать не догадался. http://www.sql.ru/forum/1140779/razbienie-sekcionirovanie-v-postgresql ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2015, 18:54 |
|
||
|
Организация работы с очень большой базой
|
|||
|---|---|---|---|
|
#18+
tadmin, Что бы провести испытания, мне нужно это сперва реализовать, причём во всех трёх вариантах. Как вы понимаете, если бы это я сделал (потратив гораздо больше 20-30 минут), то и вопроса бы не стояло. Базы и данных, как таковых пока нет (они есть в иной, не совместимой с Постгрессом форме), всё пока только разрабатывается. PS: Про индексы я в курсе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2015, 18:57 |
|
||
|
Организация работы с очень большой базой
|
|||
|---|---|---|---|
|
#18+
Ну вообще-то набросать схему описанной вами базы - это 20-30 минут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2015, 19:54 |
|
||
|
Организация работы с очень большой базой
|
|||
|---|---|---|---|
|
#18+
Warstone, Автор уже поставил диагноз: PostgreSQL не справится. Обработка трех таблиц с экстремально большим количеством (до МЛН строк) абсолютно нереальная задача. Для облегчения нужно всенепременно использовать материализованные представления. Для полной ясности еще применить и партиционирование. Но так как все равно не наступает полной ясности, то разложить это все по своим базам. Для полного комплекта не хватает только индексов полнотекстового поиска (прости-господи). Те самые, что GIST/GIN. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.02.2015, 20:02 |
|
||
|
Организация работы с очень большой базой
|
|||
|---|---|---|---|
|
#18+
Warstone, Я наверное не совсем точно описал, что требуется. Набросать схему можно (она набросана частично), вопрос в том, какой вариант выбрать или возможно есть что-то другое более подходящее для данной задачи? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2015, 15:56 |
|
||
|
Организация работы с очень большой базой
|
|||
|---|---|---|---|
|
#18+
/\/\/\/\/\/\, Т.е. мы неверно выбрали СУБД? Вы это имеете ввиду? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2015, 15:57 |
|
||
|
Организация работы с очень большой базой
|
|||
|---|---|---|---|
|
#18+
Watakusi, По Вашему посту создается впечатление, что нет четкого понимания проблемы и путей ее решения. То есть без осмысления концепции и общего плана действий делаются какие-то технические действия, причем на основе не вполне выверенных действий делаются далеко идущие выводы. Проблема не сколько в БД, сколько в методической организации работы. Подозреваю, что любая вменяемая БД (в том числе и PostgreSQL) справится с Вашими задачами. Основная проблема - на стороне постановки задачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2015, 16:17 |
|
||
|
Организация работы с очень большой базой
|
|||
|---|---|---|---|
|
#18+
/\/\/\/\/\/\, Частично согласен, полного понимания как это сделать - нет, собственно посему и вопрос. Что именно нужно сделать - понятно процентов на 90-95% (см. выше). Проблема усугубляется, что опыта работы с Постгрессом особо нет (хотя есть с MS SQL), но он выбран исходя из его бесплатности и репутации. Какой подход бы вы рекомендовали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2015, 18:15 |
|
||
|
Организация работы с очень большой базой
|
|||
|---|---|---|---|
|
#18+
Любая реализация базы, должна начинаться с реализации ORM модели архитектуры. Берем редактор и начинаем чертить. таблички, ключики, колоночки. Начинаем с варианта который знаете лучше всего. Правильно тут сказали. Нечего лезть в партиции и создавать отдельные базы если не понимаете принцип работы индексов. От вас нету конкретики по поводу количества записей в таблице, интенсивности их добавлению, и количеству выборки. А ваше понятие "огромные" как видно, не соответствуют реальности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2015, 19:16 |
|
||
|
Организация работы с очень большой базой
|
|||
|---|---|---|---|
|
#18+
Electric200, Такой дядька как C.J.Date утверждает, что начинать нужно с Модели Данных, поскольку данные — первичны. И такой подход облегчит жизнь не только программисту (ORM и все такое), но и всем тем, кто потом будет “это” поддерживать, желательно долгие годы. Моделирование данных, хоть и похоже на ER, таковым не является. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2015, 20:47 |
|
||
|
Организация работы с очень большой базой
|
|||
|---|---|---|---|
|
#18+
Electric200, Схема и частично архитектура есть, я писал уже. Затык возник после осознания, что на предполагаемых объёмах данных (я прооводил испытания на 170 миллионах строк в таблице, 18 Г размер, 6 Г размер индексов - случайная выборка для одной комбинации занимает несколько минут. Это неприемлимо). Про индексы, это смешно, оценил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2015, 16:56 |
|
||
|
Организация работы с очень большой базой
|
|||
|---|---|---|---|
|
#18+
WatakusiElectric200, Схема и частично архитектура есть, я писал уже. Затык возник после осознания, что на предполагаемых объёмах данных (я прооводил испытания на 170 миллионах строк в таблице, 18 Г размер, 6 Г размер индексов - случайная выборка для одной комбинации занимает несколько минут. Это неприемлимо). Про индексы, это смешно, оценил. осторожно интересуюсь: "одной комбинации" чего, афтар случайную выборку хотеть был ? [йода мода офф есть] надеюсь -- не 3- х пальцев ? боюсь, даже если все 18 гб сунуть в память, при поиске мимо индексов, или по битмапам от неудачных -- вы не будете иметь выборку быстрее секунд. но первый раз сунуть в память -- это тоже надо прочитать с дисков. Потратить те самые "несколько минут". осторожно намекаю -- без конкертного запроса и его плана -- разговор непредметен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2015, 17:05 |
|
||
|
Организация работы с очень большой базой
|
|||
|---|---|---|---|
|
#18+
WatakusiElectric200, Схема и частично архитектура есть, я писал уже. Затык возник после осознания, что на предполагаемых объёмах данных (я прооводил испытания на 170 миллионах строк в таблице, 18 Г размер, 6 Г размер индексов - случайная выборка для одной комбинации занимает несколько минут. Это неприемлимо). Про индексы, это смешно, оценил. Приведите пример запроса и explain analyze. Теперь замечания: Eсли данные в момент запроса находятся не в памяти то совершенно безразлично есть у вас партиционирование в том или ином виде или нет... т.е. все всеравно будет упираться в скорость доступа к дискам. Тоесть партиционирование вполне может не дать выйгрыша. Так что сначала всетаки покажите какие запросы вы собираетесь гонять (оптимизация это всегда оптимизация конкретного случая а не вообще). Кстати вполне вероятно что использование SSD под данные снимет у вас кучу вопросов о производительности. --Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2015, 02:14 |
|
||
|
Организация работы с очень большой базой
|
|||
|---|---|---|---|
|
#18+
Watakusi, Так же надо учитывать что количество партиций больше 100 не рекомендуется (там линейный поиск подходящих идет), тем более больше 1000. Я бы посмотрел в вариант гибрида 2+3 - а именно не отдельные базы а отдельную схему под каждое испытание + общая метаинформация... заодно проблемы с запросами между базами не будет возникать. --Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2015, 02:45 |
|
||
|
Организация работы с очень большой базой
|
|||
|---|---|---|---|
|
#18+
[quot Maxim Boguk]WatakusiElectric200, Теперь замечания: Eсли данные в момент запроса находятся не в памяти то совершенно безразлично есть у вас партиционирование в том или ином виде или нет... --Maxim Boguk www.postgresql-consulting.ru Я конечно извиняюсь. Но вынужден не согласится. На практике, запрос к таблице с 5 млн записей, и запрос к мастеру где (1 млн = 1 партиция) разные вещи. Это и по плану видно. За счет уменьшения, как бы это сказать. Изначального диапазона записей, возможно соответствующим определенному условию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2015, 10:01 |
|
||
|
Организация работы с очень большой базой
|
|||
|---|---|---|---|
|
#18+
Electric200, похабеньникам лучше жевать иди, куй, короче ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2015, 10:13 |
|
||
|
Организация работы с очень большой базой
|
|||
|---|---|---|---|
|
#18+
[quot Electric200]Maxim Bogukпропущено... Я конечно извиняюсь. Но вынужден не согласится. На практике, запрос к таблице с 5 млн записей, и запрос к мастеру где (1 млн = 1 партиция) разные вещи. Это и по плану видно. За счет уменьшения, как бы это сказать. Изначального диапазона записей, возможно соответствующим определенному условию. Если вы выбирает все строки из таблицы - тогда да. А если надо случайно считать с диска 1000 страниц совершенно безразлично считывываете вы их из общей таблицы или из партиции... скорость будет одинакова. Единственный вариант когда вам нужные вам строки компактно лежат внутри партиции в одном месте а в общей таблице раскиданы по разным местам (но это маловероятно если вы выбираете меньше 1% строк). Партиции обычно помогают когда есть горячая часть (условно текущий месяц) и есть архивная часть, в таком случае горячая часть будет находится в памяти. А когда все холодное и на диске - принципиальной разницы не будет. Если вы приведете мне примеры планов где это не так (с explain (analyze, costs, buffers, timing) результатами по холодным таблицам - я с удоволствием пересмотрю свою точку зрения ;). --Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2015, 13:36 |
|
||
|
Организация работы с очень большой базой
|
|||
|---|---|---|---|
|
#18+
[quot Maxim Boguk]Electric200пропущено... Если вы выбирает все строки из таблицы - тогда да. А если надо случайно считать с диска 1000 страниц --Maxim Boguk www.postgresql-consulting.ru Ну по поводу "случайно" - абсолютно согласен. Нет разницы. По крайней мере "положительной". Возможно для "случайно" лучшим будет отсутствие партиций. Все таки с одного "большого" считать будет проще, чем с нескольких "маленьких". А там я без понятия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2015, 18:54 |
|
||
|
Организация работы с очень большой базой
|
|||
|---|---|---|---|
|
#18+
Господа, позволю внести свои пять копеек. Прежде всего, топикстартеру следует выкинуть из заглавного поста весь менеджерский бла-бла-бла, и перевести на технический язык, если он хочет технической помощи. 1. "с базой данных, куда записываются данные с испытаний. Испытаний, в теории могут быть десятки, сотни и даже тысячи (хотя это довольно редко). В базе (на данный момент) хранятся вспомогательные объекты и 3 таблицы, куда будут стекаться испытания. Продолжительность каждого испытания не ограничена, но как правило не более 3-х суток (более частый случай - 4-6 часов). Таким образом в эти три таблицы могут с каждого испытания попадать данные в кол-ве от нескольких десятков тысяч до нескольких миллиардов записей " Уникальный случай словоблудия на клиент-сайде, ровным счетом НИЧЕГО не сказав о технических параметрах задачи (с точки зрения СУБД). Испытание - что это? Одна запись в соотв. таблице? Одна запись в трех таблицах? Одна запись в одной таблице, и несколько в двух еще? Извините, пока вы не ответили на эти вопросы, вас будут посылать в сад, и правильно делать. Потому что вы описали сферического коня в вакууме, и имеете спросить, на какой частоте он будет ржать. Тут философов-идеалистов нету. Но пока нету структуры данных, вам - в сад. Ну нахрена нам знать про длительность в каких-то там ЧАСАХ, когда оптимизатора интересует: 1. Размер тупла таблицы 2. Количество туплов по таблицам для одной единицы "бизнес-логики" (у вас - испытания) 3. Структура связи между таблицами По технической стороне вопроса вы инфы не дали. ни о чем. И выше идет битва экстрасенсов. Конкретику в студию. 2. "Затык возник после осознания, что на предполагаемых объёмах данных (я прооводил испытания на 170 миллионах строк в таблице, 18 Г размер, 6 Г размер индексов - случайная выборка для одной комбинации занимает несколько минут. Это неприемлимо). Про индексы, это смешно, оценил." после того, как вы предоставили: 0. как испытания соотносятся с таблицами 1. DDL таблиц 2. Индексы и ПК 3. запрос на вашу случайную выборку 4. железо, на котором гоняли вашу случайную выборку вот ТОГДА, и только ТОГДА, пациент обездвижен, обезболен, и готов к хирургическим мероприятиям можно с вами работать. Возможно, потребуется еще и postgres.conf вытащить на белый свет по запросу (Максим Богук это любит). 3. А по поводу индексов - да, быгыгы. Никто не представляет ваш уровень подготовки. 99% задач решаются методами: 1. заданием индекса более чем по одной колонке (1 минута без индексов -> 1 секунда с индексами -> 0.1 сек с ПРАВИЛЬНЫМИ индексами) 2. выбора типа индекса 3. что-нибудь про индексы по функциям слышали? А они, представьте, есть. 4. А про теорию нормализации что-нибудь слышали? А то 99% идиотов программистов даже и не думали о ней почитать - а уже вперде, быдлокодим что-то. Что вы решили там накодить, неизвестно. Выбрана ли нормальная нормальная форма - неизвестно. Короче, быдлоцирк в чистом виде. Пока что я представляю, что вы под "индексом" имеете в лучшем случае ввиду ПК и ФК. ну и читается у вас все фуллсканом из таблиц. ну и идете вы как та мартышка с очками, на йух, попутно говоря реляционные базы говно мимо нас, потому что даже не удосужились набить важную для нас инфу. Полазьте, что ли, по форуму. Посмотрите, какую люди предоставляют инфу для ускорения запросов. Пока что вы - типичный пример "у меня есть гениальная идея, но я ее никому не покажу" быдла говностартапера, который знает только задачу, но ни бум-бум в инструментарии. И да, спасибо, с утра поржал и ручки поразмял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2015, 12:25 |
|
||
|
Организация работы с очень большой базой
|
|||
|---|---|---|---|
|
#18+
Hawkmoon, Все верно. 1) Определите размер оперативки, которую можно отдать серваку 2) Прикинте количественно средний объем данных (в строках и в мегабайтах) на одно испытания. Без этой оценки (хотя бы порядка) никто ничего не ответит. Например, так Код: plsql 1. 2. 3. 4. 5. 6. 7. 3) Исходя из реальной оценки активности пользователей разбейте таблицы на партиции, что бы вся партиция влезала в память со всеми зависимыми данными и индексами. Лучше, что бы влезало не менее 3-4 таких партиций. Важно - подумайте над принципом разбиения по партициям. Обычно (в бизнесе, особенно в торговле) для этого используются временные промежутки (месяц, квартал, год). Это притащено из OLAP. Для научных применений это не всегда работает, возможно, будет логично разбиение по сериям экспериментов 4) Поправить postgresql.conf, в первую очередь shared_buffer 5) Если оперативки не хватает на это, то заказчик жмот и не стесняйтесь ему об этом сказать, возможности оптимизации не безграничны. 6) Крайний случай - балансирование нагрузки между серверами, создание кластера и т.п. Но без опытной эксплуатации это возможно пустая трата денег. Больших денег. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2015, 17:15 |
|
||
|
Организация работы с очень большой базой
|
|||
|---|---|---|---|
|
#18+
Watakusi, Что-то я не понял, зачем вам вообще постгрес нужен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2015, 17:31 |
|
||
|
Организация работы с очень большой базой
|
|||
|---|---|---|---|
|
#18+
У меня такое чувство, что у топик-стартера ДВЕ РАЗНЫЕ задачи: 1. Сбор и хранение данных - т.е. OLTP 2. Анализ данных - OLAP (DWH) Предположу, что и структуру данных нужно проектировать исходя из двух РАЗНЫХ потребностей. Возможно, даже, дублировать информацию при необходимости. IMHO & AFAIK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2015, 17:35 |
|
||
|
|

start [/forum/topic.php?fid=53&fpage=114&tid=1998143]: |
0ms |
get settings: |
9ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
77ms |
get topic data: |
14ms |
get forum data: |
4ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 212ms |
| total: | 400ms |

| 0 / 0 |
