Наскільки велика є занадто великою для таблиці PostgreSQL?


127

Я працюю над розробкою проекту RoR для своєї компанії, і наша команда розробників вже вступила в дебати щодо дизайну, зокрема бази даних.

У нас є названа модель, Messageяку потрібно зберігати. Це дуже-дуже маленька модель із лише трьома db колонками, крім id, однак, ймовірно, буде багато цих моделей, коли ми перейдемо до виробництва. Ми переглядаємо цілих 1 000 000 вставок на день. Моделі завжди будуть шукати лише два зовнішні ключі на них, які можна індексувати. Крім того, моделі ніколи не потрібно видаляти, але ми також не повинні їх зберігати, коли їм близько трьох місяців.

Отже, що нам цікаво, чи реалізація цієї таблиці в Postgres поставить значну проблему з ефективністю? Хтось має досвід роботи з дуже великими базами даних SQL, щоб сказати нам, чи це буде проблема? І якщо так, то з якою альтернативою ми повинні піти?


3
з хорошим шаром кешування і невеликою кількістю конфігурації в PG, ви повинні добре. Ви повинні вирішувати проблеми продуктивності залежно від конкретного випадку і уникати попередніх налаштувань. Однак, розділення та реплікація - це завжди чудові варіанти, якими ви можете скористатися, потрапивши у вузькі місця.
Сем

1
Пов'язане питання тут і тут .
Ервін Брандштеттер

5
Ми обробляємо близько 30 мільйонів повідомлень на день в одній базі даних 5+ TB PostgreSQL, працює чудово.
Френк Хайкенс


1
FYI, я випадково сьогодні читав postgresql.org/about і помітив, що в ньому сказано, що (в принципі) кількість рядків у таблиці необмежена.
Al Chou

Відповіді:


115

Рядки за таблицею самостійно не будуть проблемою.

Отже, приблизно кажучи, 1 мільйон рядків на день протягом 90 днів - це 90 мільйонів рядків. Я не бачу причин, що Postgres не може з цим впоратися, не знаючи всіх подробиць того, що ти робиш.

Залежно від вашого розповсюдження даних, ви можете використовувати суміш індексів, відфільтрованих індексів та розділів таблиці, щоб прискорити роботу, як тільки ви побачите, які проблеми з продуктивністю у вас можуть бути, а можуть і не бути. Ваша проблема буде однаковою для будь-яких інших RDMS, про які я знаю. Якщо вам потрібно лише 3 місяці на розробку даних, щоб обрізати дані, вам більше не потрібно. Таким чином ви матимете послідовний обсяг даних у таблиці. Ваш щасливець, ви знаєте, скільки даних буде існувати, протестуйте їх на обсяг і побачите, що ви отримаєте. Тестування однієї таблиці на 90 мільйонів рядків може бути таким же простим, як:

select x,1 as c2,2 as c3
from generate_series(1,90000000) x;

https://wiki.postgresql.org/wiki/FAQ

Limit   Value
Maximum Database Size       Unlimited
Maximum Table Size          32 TB
Maximum Row Size            1.6 TB
Maximum Field Size          1 GB
Maximum Rows per Table      Unlimited
Maximum Columns per Table   250 - 1600 depending on column types
Maximum Indexes per Table   Unlimited

19
Я згоден, що 90 мільйонів рядків не будуть проблемою для PostgreSQL. Але це може бути проблемою для ORM з PostgreSQL. (ORM з будь-якими dbms, насправді.)
Майк Шеррілл 'Cat Recall'

@ MikeSherrill'Catcall "Добре, я просто зосередився на" Наскільки великий за розміром таблиці PostgreSQL? "
Куберчаун

2
@yeyo: Оскільки ORM зазвичай використовують багато запитів, щоб отримати дані, які можна повернути лише одним або двома. ОП використовує Ruby on Rails.
Майк Шеррілл 'Cat Cat Recall'

39
Це трохи пізно, але я думаю, що у багатьох випадках (особливо з рейками / активним записом) зазвичай повністю видалити ORM з рівняння та написати необмежену рядок sql для запиту з міркувань продуктивності. Не дозволяйте ORM приймати рішення для вас! Це аксесуар не є істотним.
Стефан Теард

2
Наведена в URL-адресі приблизно не містить цих обмежень - хтось знає, куди вона переміщена?
Шорн

58

Ще одним способом значно прискорити запити на таблиці з> 100 мільйонами рядків - це в неробочий час кластеризувати таблицю за індексом, який найчастіше використовується у ваших запитах. Ми маємо таблицю з> 218 мільйонами рядків і знайшли вдосконалення в 30 разів.

Також для дуже великої таблиці непогано створити індекс на своїх зовнішніх ключах.


> в неробочий час кластеризуйте таблицю з індексом, яка найчастіше використовується у ваших запитах .... чи можете ви пояснити, як це робиться?
шпигун

6
Так, крок за кроком ПРИКЛАД: 1) Таблиця, яку я маю на увазі, в цьому прикладі називається інвестицією. 2) Індекс, який найчастіше використовується в запитах, є (bankid, record_date). Отже, ось ваш крок за кроком: 1) psql -c "індекс падіння invest_bankid_rec_dt_idx;" dbname 2) psql -c "створити індекс Investment_bankid_rec_dt_idx на інвестиції (bankid, record_date);" 3) psql -c "кластер інвестицій_bankid_rec_dt_idx про інвестиції;" 4) вакуумний -d ccbank -z -v -t інвестиції Отже, на кроці один і другий ми опускаємо індекс і відтворюємо його.
Джеймс Догерті

3
Крок 3 ми створюємо кластер, це в основному ставить таблицю БД у фізичний порядок індексу, тому коли postgresql виконує запит, він кешує найбільш ймовірні наступні рядки. Крок 4 ми
James Doherty
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.