Postgresql запросов на несколько идентичных таблиц - PullRequest
2 голосов
/ 02 декабря 2009

Здравствуйте. У меня есть несколько баз данных, например, mytable_2009_11_19_03, где последние 2 числа указывают час (таблица на 03:00), теперь я хочу запросить что-то от _00 до _23. Это можно сделать таким образом, но это действительно неуклюже

select * from mytable_2009_11_19_00 where type = 15
UNION
select * from mytable_2009_11_19_01 where type = 15
UNION
...........
select * from mytable_2009_11_19_23 where type = 15

Как я мог сделать это проще? С уважением

Ответы [ 3 ]

4 голосов
/ 22 декабря 2009

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

Такие данные, основанные на времени, всегда добавляются впереди и сбрасываются сзади по истечении срока действия. Использование одной огромной таблицы приведет к большой фрагментации индекса при обновлении данных и к очень большому времени обслуживания для таких операций, как VACUUM.

Если вы перейдете по ссылке, которую я включил в первый абзац, и прочитаете все о разбиении, вы сможете использовать ограничения CHECK для очень быстрого поиска по дате. Любой SELECT, который включает метку времени WHERE> x И метку времени

Теперь, если в этих таблицах нет временных отметок, разбиение с ограничениями CHECK не будет работать, и вам просто нужно будет написать сценарии для написания неуклюжих запросов UNION для вас.

3 голосов
/ 22 декабря 2009

Если вы знаете, что все сгенерированные таблицы всегда идентичны в схеме, в PostgreSQL вы можете создать родительскую таблицу и установить для вновь создаваемых таблиц значение INHERIT от родительского.

CREATE TABLE mytable_2009_11_19 (LIKE mytable_2009_11_19_00);
ALTER TABLE mytable_2009_11_19_00 INHERIT mytable_2009_11_19;
ALTER TABLE mytable_2009_11_19_01 INHERIT mytable_2009_11_19;
.
.
.
ALTER TABLE mytable_2009_11_19_23 INHERIT mytable_2009_11_19;

SELECT * FROM mytable_2009_11_19 where type = 15;

Это похоже на использование представления, но есть различия (перечисление CONs в первую очередь):

  • (CON) Этот метод требует от вас ИЗМЕНЕНИЯ отдельных таблиц, на которые у вас может не быть прав. ПРОСМОТР не требует этого уровня доступа.
  • (CON) Этот метод требует, чтобы все таблицы имели одинаковую структуру или, по крайней мере, родитель должен иметь ТОЛЬКО общие элементы между всеми дочерними элементами.
  • (PRO) Чтобы добавить таблицы в VIEW, вы должны удалить и переопределить VIEW (и его разрешения, если это необходимо). С родительской таблицей легко добавлять или удалять таблицы, изменяя каждую из них с помощью INHERIT / NOINHERIT.
  • (PRO) Если ваша схема содержит поля, такие как дата и отметка времени, и структура редко изменяется, вы можете построить одну родительскую таблицу и использовать INHERIT / NOINHERIT по мере поступления, чтобы обеспечить временное «окно», к которому можно обращаться без необходимо запросить всю историю.
1 голос
/ 02 декабря 2009

Самым простым решением, вероятно, будет построение представления всех таблиц, тогда вы сможете легко запросить их. Вы можете легко написать процедуру для генерации представления. Кроме того, если вы используете «объединение всех», это будет быстрее, если вы хотите получить все строки (в отличие от отдельных строк), и вы все равно можете захватывать отдельные строки, выбирая отличные от представления, если вам иногда .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...