-
Notifications
You must be signed in to change notification settings - Fork 68
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Сделать возможность создания дочерних таблиц в различных tablespace #11
Comments
@socketpair, не могли бы вы поделиться своим видением реализации этой фичи? Насколько я понимаю, основной профит заключается в том, чтобы раскидать партиции по нескольким tablespace, размещенным на разных физических устройствах, не так ли? |
@funbringer, на самом деле идея не такая уж и плохая, т.к. на данный момент параметр полностью игнорируется. Я считаю было бы достаточно наследовать табличное пространство родителя. В моем случае это связано с необходимостью разместить таблицу с Простой тест показывающий что create table ptt_tblspc_test
(
p_id bigserial primary key,
p_ts timestamp not null,
p_datum text
)
tablespace tblspc_part;
select create_range_partitions
(
'ptt_tblspc_test'::regclass,
'p_ts', localtimestamp - interval '1 year',
interval '1 month',
10
);
select
pgcl.relname relnm,
coalesce(pgtblspc.spcname, 'pg_default') reltblspc
from
pg_class pgcl
left join pg_tablespace pgtblspc on pgtblspc.oid = pgcl.reltablespace
where
relkind = 'r'
and relname ilike 'ptt_tblspc_test%'; Результат:
Edit: |
@1803, приветствую еще раз! Абсолютно справедливо, текущая реализация не учитывает tablespace вообще, хотя логичнее было бы размещать именно в пространстве родителя. По поводу "возложить на пользователя": планируется вызывать колбек уже после создания партиции. Безусловно, можно создать колбек, который будет выполнять Кроме того, далеко не всем нужна такая гибкость ценой неизбежного выполнения лишних телодвижений (к примеру, создание колбеков с нетривиальной логикой для равномерного размещения в нескольких пространствах). Было бы логично предоставить отключаемый стандартный механизм, но его нужно продумать и аккуратно реализовать. Следовательно, будет возможность выбирать, что использовать. Впрочем, на этот счет можно будет еще подумать. Функционал #22 мне лично нравится, и мы приступим к реализации сразу как освободимся от текущих задач (необходимо выкатить наши наработки в master). Он позволит решить проблему с tablespace своими руками тем, кому это нужно. |
Добрый вечер! Добавил поддержку тейблспейсов в тестовой ветке
Также реализован функционал для добавления своего собственного callback-а, описанного в тикете #22. Не могли бы вы попробовать эту версию на своих кейсах? Устраивает ли такая реализация? PS: Меня не будет в городе в ближайшие две недели и скорее всего не будет связи, поэтому смогу ответить уже после того, как вернусь. |
Пытаюсь собрать под Windows через msvc. Есть ряд трудностей. Если у вас уже есть версия которая собирается под Windows или рекомендации, то я с радостью приму ее. Под linux пока не тестировал. Первая сборка отказывается работать. Пока к сожалению нет времени более глубоко разбираться в причинах. После патча возникают следующие ошибки при компиляции:
Инициализация этих переменных в
Буду разбираться дальше по мере наличия времени. |
Отказался от msvc, собрал через gcc; Полученная dll крашит сервер с тем же кодом ошибки (0xC0000005) при попытке создать range_partition. Попробую добыть стек трейс, может он поможет. UPD: Ключевое:
|
Пожалуйста гляньте на /src/tools/msvc/gendef.pl тогда ваш патч будет не нужен. |
to @1803
Что вы имеете в виду? Я правильно понимаю, что вы внесли какие-то исправления в код?
Что странно, потому что обе переменные не инициализированы только в тех случаях, когда исполнение запроса экстренно завершается вызовом #if defined(HAVE__BUILTIN_UNREACHABLE) && !defined(USE_ASSERT_CHECKING)
#define pg_unreachable() __builtin_unreachable()
#elif defined(_MSC_VER) && !defined(USE_ASSERT_CHECKING)
#define pg_unreachable() __assume(0)
#else
#define pg_unreachable() abort()
#endif Поэтому поведение компилятора мне кажется странным. Впрочем, я не очень хорошо разбираюсь в вопросах сборки PostgreSQL под Windows. Во всяком случае, ошибки в данном коде нет. Следовательно, к падению в
Этот файл лежит в исходниках самого PostgreSQL (
Собирали так же, используя ваши исправления? Если так, то вполне возможно, что ошибка в ветке. |
Забудьте про msvc. Бекэнд крашится при вызове функции hash_search() из get_pathman_relation_info() которая вывывается в invoke_on_partition_created_callback():
Последний вызов завершается с SEGFAULT.
Спасибо, обязательно изучу этот вопрос. |
Ок, как скажете.
А в остальном |
Я плохо сформулировал все. Я тестирую работоспособность pg_pathman-callbacks под Windows. Для тестов использовал 2 сборки: Сначала PostgreSQL 9.5.4 x64: сборку от EnterpriseDB (compiled by Visual C++ build 1800, 64-bit). Когда появилась ошибка, я решил собрать сборку с дебагом, чтобы посомтреть трейсы. Ошибка одинаковая проявляется в обоих версиях при попытке создать range partition (ничего другого даже не пробовал) Пример:
|
Я допускаю, что такое может быть, но это наводит меня на мысль, что либо вы как-то неправильно собираете ( К сожалению, ваш кейс у меня не воспроизводится. Советую попробовать собрать именно с MSVC соответствующей версии, хотя это и проблематично. Я готов и сам попробовать, когда будет время и возможность. Хочу уточнить еще раз: на ветке |
Да, партиции создаются. Дальше пока не смотрел. Сейчас проверю все более тщательно. Извините, не правильно понял ваш вопрос. |
@funbringer судя по всему вы были правы. В мастере у меня не создается insert-триггер для родительской таблицы и все данные попадают в родительскую, хотя дочерние таблицы созданы. Самое интересное что я не могу найти где в коде создаются эти триггеры.. Думаю нужно начать тестировать на линуксе.. |
Так и должно быть, сейчас для вставки используется кастомная нода PartitionFilter.
А вот так быть не должно, можете показать explain analyze для insert? |
|
to @1803 У вас определенно неправильно работает explain insert into p values(0, now(), NULL);
QUERY PLAN
-----------------------------------------------------------------------
Insert on p (cost=0.00..0.01 rows=1 width=0)
-> Custom Scan (PartitionFilter) (cost=0.00..0.01 rows=1 width=0)
-> Result (cost=0.00..0.01 rows=1 width=0)
(3 rows) Как вы можете заметить, мой план отличается: между Insert и Result появляется наша проксирующая кастомная нода, которая перенаправляет кортеж в нужную партицию. Попробуйте set pg_pathman.enable = t;
set pg_pathman.enable_partitionfilter = t; Если поведение не изменится, вам следует пересмотреть процедуру сборки под Windows, потому что это будет косвенно указывать на неправильную линковку символов, отвечающих за GUC. |
@funbringer Идея с GUC была верная. Ошибка была моя. Почему-то я решил что файлы расширения должны называться pathman.control и pathman--1.0.sql (а не pg_pathman..) а с ними и сам extension. Поэтому видимо гуки не подхватывались. Этим же была вызвана ошибка которая приводила к падению бэкэнда. (сейчас ветка callbacks успешно создает партиции) Спасибо большое за помощь и извините за беспорядок который я тут развел. Пойду дальше тестировать.. |
No description provided.
The text was updated successfully, but these errors were encountered: