2015-11-20 3 views
1

Я проектирую 2 таблицы.Предложение по разбиению таблиц в POSTGRES

user_table (userid username)100K записей ожидается

transaction_table(transactionid, date, description, userid)5 миллиардов записей ожидаемых. Ожидается почти 50 тыс. Транзакций на одного пользователя.

transaction_table магазины совершают сделки. В этой таблице редко имеются операции UPDATE или DELETE. Существуют значительные операции SELECT и INSERT, но все они основаны на userid. Таким образом, либо я вставляю транзакцию пользователя в таблицу, либо возвращаю транзакции, сделанные определенным пользователем.

Имеет ли смысл разбиение на разделы transaction_table?

Это потому, что будут 100 тыс. Таблиц разделов, для каждого пользователя. Это хорошо в каком-то смысле?

Какие еще варианты у меня есть, чтобы сделать INSERT и SELECT операциями быстро на transaction_table?

+1

Какие запросы вы ожидаете на transaction_table? Разделение по идентификатору пользователя имеет смысл, если вам нужно получить ВСЕ транзакции для определенного пользователя. Для запросов, таких как «100 последних транзакций пользователя», достаточно индекса (userid, date). –

+0

Я ожидаю таких запросов, как - (1). «top X (скажем, 100) транзакций пользователя». (2) «следующие X транзакций пользователя» (3) «все транзакции с 1-JAN-2015 до 1-MAY-2015 пользователя» и т. Д. – Ani

ответ

0

Postgresql не рекомендует создавать many partitions:

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

На мой взгляд, разделы, созданные date (ежемесячно, например), могут быть намного лучше.

Другим вариантом является создание разделов на userid%100, но не на каждого пользователя.

+0

Разделы на основе даты не то, что я хотел бы посетить первое место, это потому, что у меня есть запросы, которые говорят «верните мне последние 100 транзакций, сделанных конкретным пользователем». В любом случае спасибо за помощь. – Ani

+0

Это нормально, если у вас есть индекс '(userid, date)' на каждом разделе. –

+0

спасибо Stas. Но разве вы не думаете, что производительность вложений значительно снизится, если я индексирую (userid, date). – Ani