PostgreSQL: автоматическое разбиение таблицы - PullRequest
3 голосов
/ 14 марта 2010

У меня есть огромная база данных, которая содержит пары чисел (A, B), каждая из которых находится в диапазоне от 0 до 10000 и хранится в виде чисел с плавающей точкой.

например.,

(1, 9984.4), (2143.44, 124.243), (0.55, 0), ...

Поскольку таблица PostgreSQL, в которой хранятся эти пары, стала довольно большой, я решил разбить ее на унаследованные подтаблицы . Я намерен создать 100 таких таблиц, каждая из которых хранит диапазон 1000x1000.

Проблема в том, что эти числа имеют тенденцию приходить большими кусками соседних чисел. Это означает, что в будущем некоторые таблицы будут почти пустыми, а некоторые будут занимать очень большую часть базы данных. К сожалению, распределение будущих пар пока неизвестно.

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

Мои вопросы:

  • Возможно ли в PostgreSQL 8.3 рекурсивное разбиение и наследование? Понимают ли это индексы и планы запросов?
  • Какой лучший способ разделить подтаблицу, если она стала слишком большой? Я должен отметить, что это не живая база данных, поэтому простои в несколько часов каждую неделю вполне приемлемы.
  • ОБНОВЛЕНИЕ: Я мог бы разделить наследующие таблицы на четыре таблицы, которые заменили бы исходную (то есть наследовали непосредственно от основной таблицы). Я не буду использовать более одного уровня наследования, но буду иметь тысячи, если таблицы наследуются непосредственно из одной таблицы. Каковы плюсы и минусы этого подхода?

Заранее спасибо,

Адам

1 Ответ

2 голосов
/ 14 марта 2010

Прежде всего, если таблицы уже большие, вы уверены, что распределение не является надежным для будущих оценок? Будет ли гистограмма, сделанная сегодня, бесполезной?

Я думаю, что даже если рекурсивное наследование возможно, оно добавляет ненужную сложность модели как для обслуживания, так и для планировщика.

Когда вы разбиваете его на 100 таблиц, я ожидаю, что вы создадите разделы и автоматически вставите / обновите правила / триггеры.

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

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

...