powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Российские СУБД
25 сообщений из 403, страница 4 из 17
Российские СУБД
    #39200047
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfo,

Так в том то и идея добавление ограничения на в каждом подзапросе внутри union all , чтобы оно повторяло условие попадания в партицию. Таким образом, при разборе общего запроса (если сервер умеет прокидывать предикаты и не выполнять заранее невыполнимое) для той секции, которую не надо сканировать, построятся взаимоисключающие условия.

Что на примере с with и было показано. Другое дело, если сервер не умеет разворачивать селект из view в вариант с прокидыванием предикатов и не умеет отсеивать по невыполнимому условию без просмотра содержимого. Тут, конечно, ничем не поможешь.
...
Рейтинг: 0 / 0
Российские СУБД
    #39200049
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander RyndinА что там с hash и композитным партицированием?
Ну в общем случае с view можно не то что по hash, можно хоть по sequence в партиции раскидывать, чтобы гарантировать равномерное размазывание, если это надо. Любая логика к твоим услугам. Да авто добавление партиций на триггерах не напишешь (ну кроме каждое утро добавим партицию на завтра :) ).
...
Рейтинг: 0 / 0
Российские СУБД
    #39200053
Alexander A. Sak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевДа авто добавление партиций на триггерах не напишешь (ну кроме каждое утро добавим партицию на завтра :) ).

Есть у меня подозрение, что в Постгресе можно в триггере и таблицу создать.
...
Рейтинг: 0 / 0
Российские СУБД
    #39200054
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander A. Sak,

Создать то можно, наверное, как view переопределить?
Хотя очумелые ручки могут, наверное, через рекурсивное with и без переопределения справиться. :)
...
Рейтинг: 0 / 0
Российские СУБД
    #39200055
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
точнее на left join.
...
Рейтинг: 0 / 0
Российские СУБД
    #39200056
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньевvadiminfo,

Так в том то и идея добавление ограничения на в каждом подзапросе внутри union all , чтобы оно повторяло условие попадания в партицию. Таким образом, при разборе общего запроса (если сервер умеет прокидывать предикаты и не выполнять заранее невыполнимое) для той секции, которую не надо сканировать, построятся взаимоисключающие условия.

Что на примере с with и было показано. Другое дело, если сервер не умеет разворачивать селект из view в вариант с прокидыванием предикатов и не умеет отсеивать по невыполнимому условию без просмотра содержимого. Тут, конечно, ничем не поможешь.
Не знаю, что скрывается там за многоточиями, но если одна таблица, то чтобы найти id=2, он проскандирует всю таблицу. Если разные: типа для каждого года своя таблица со своим именем, то это сильное влияние на логику: мне по логике нужна одна таблица, и ничего не знать при написании запроса про секции. Это физика - вопросы производительности.
...
Рейтинг: 0 / 0
Российские СУБД
    #39200065
Alexander A. Sak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Продолжаем мучать Постгрес. Вешаем на нашу "партицированную" вьюху триггер, создающий таблицы:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
create or replace function t_part() returns trigger as $$
declare
   Cnt Integer;
begin
   select count(*) into Cnt
   from pg_catalog.pg_tables
   where tablename = 't_part_' || New.Part_Id;

   if Cnt=0 then
      execute 'create table t_part_' || New.Part_Id
         || ' (id integer not null primary key, '
         || '  part_id integer, '
         || '  val Varchar, '
         || '  constraint ch_t_part_' || New.Part_Id || ' check(part_id=' || New.Part_Id || ')) ';
   end if;

   return new;
end;
$$ language plpgsql;

create trigger tg_part instead of insert on t
    for each row execute procedure t_part();



И ведь работает:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
postgres=> \d t_part_5
Отношение "t_part_5" не найдено.
postgres=> insert into t(id, part_id, val) values (5, 5, '5');
INSERT 0 1
postgres=> \d t_part_5
           Таблица "crm.t_part_5"
 Колонка |        Тип        | Модификаторы 
---------+-------------------+--------------
 id      | integer           | NOT NULL
 part_id | integer           | 
 val     | character varying | 
Индексы:
    "t_part_5_pkey" PRIMARY KEY, btree (id)
Ограничения-проверки:
    "ch_t_part_5" CHECK (part_id = 5)

postgres=> 
...
Рейтинг: 0 / 0
Российские СУБД
    #39200067
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander A. SakИ ведь работает:

insert into t(id, part_id, val) values (5, 5, '5');
А теперь продемонстрируйте "select from t where id=5", пожалуйста.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Российские СУБД
    #39200069
Alexander A. Sak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевAlexander A. Sak,

Создать то можно, наверное, как view переопределить?
Хотя очумелые ручки могут, наверное, через рекурсивное with и без переопределения справиться. :)

Наверное, можно при создании таблицы и view пересоздать. Ужас, конечно, получается, но ведь работает. Интересно было бы у спецов узнать насколько поплохеет Постгресу от такого "партицирования".
...
Рейтинг: 0 / 0
Российские СУБД
    #39200073
Alexander Ryndin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевAlexander RyndinА что там с hash и композитным партицированием?
Ну в общем случае с view можно не то что по hash, можно хоть по sequence в партиции раскидывать, чтобы гарантировать равномерное размазывание, если это надо. Любая логика к твоим услугам. Да авто добавление партиций на триггерах не напишешь (ну кроме каждое утро добавим партицию на завтра :) ).И что будет в результате с pruning?
...
Рейтинг: 0 / 0
Российские СУБД
    #39200074
Alexander A. Sak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Облом-с. Пересоздание вью в триггере на вью не дают:
Код: plsql
1.
ОШИБКА:  нельзя выполнить CREATE OR REPLACE VIEW "t", так как этот объект используется активными запросами в данном сеансе



Вы же понимаете, что это не препятствие :D. Сейчас еще что-нибудь придумаем.
...
Рейтинг: 0 / 0
Российские СУБД
    #39200078
Alexander A. Sak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот вариант. Для вставки используем одно view, для чтения - другое.
Вью для вставки:

Код: plsql
1.
2.
create or replace view t_ins as
select id, part_id, val from t_part_1 where 0=1;



Модифицированная триггерная функция:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
create or replace function t_part() returns trigger as $$
declare
   Cnt Integer;
   v_Sql Varchar := '';
   v_TblName Varchar;
begin
   select count(*) into Cnt
   from pg_catalog.pg_tables
   where tablename = 't_part_' || New.Part_Id;

   if Cnt=0 then
      execute 'create table t_part_' || New.Part_Id
         || ' (id integer not null primary key, '
         || '  part_id integer, '
         || '  val Varchar, '
         || '  constraint ch_t_part_' || New.Part_Id || ' check(part_id=' || New.Part_Id || ')) ';

      for v_TblName in (select tablename from pg_catalog.pg_tables
                        where tablename like 't|_part|_%' escape '|') 
      loop
         if (v_Sql<>'') then
            v_Sql := v_Sql || ' union all ';
         end if;
         v_Sql := v_Sql || 'select id, part_id, val from ' || v_TblName;
      end loop;

      execute 'create or replace view t as ' || v_Sql;
   end if;

   return new;
end;
$$ language plpgsql;



Ну и триггер:
Код: plsql
1.
2.
create trigger tg_ins instead of insert on t_ins
    for each row execute procedure t_part();



В результате получаем:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
postgres=> explain select * from t where part_id=7;
                QUERY PLAN                
------------------------------------------
 Result  (cost=0.00..0.01 rows=1 width=0)
   One-Time Filter: false
(2 строки)

postgres=> insert into t_ins(id, part_id, val) values (7, 7, '7');
INSERT 0 1
postgres=> explain select * from t where part_id=7;
                           QUERY PLAN                           
----------------------------------------------------------------
 Append  (cost=0.00..24.50 rows=6 width=40)
   ->  Seq Scan on t_part_7  (cost=0.00..24.50 rows=6 width=40)
         Filter: (part_id = 7)
(3 строки)

postgres=> 
...
Рейтинг: 0 / 0
Российские СУБД
    #39200309
Симонов ДенисAlexander Ryndin,

это говорил не Путин, а Мариничев.
И не это он вообще говорил.
Но некоторые слышат то, что хотят слышать им из разных ящиков журнашлюхи вещают...
...
Рейтинг: 0 / 0
Российские СУБД
    #39200341
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander A. SakНу вот вариант. Для вставки используем одно view, для чтения - другое.
Создай свой словарь. В котором будут имена партиций. Ну и во view динамический джоин с таблицами чьи имена совпадают. Тогда view вообще менять не надо. :)
...
Рейтинг: 0 / 0
Российские СУБД
    #39200350
Alexander A. Sak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевAlexander A. SakНу вот вариант. Для вставки используем одно view, для чтения - другое.
Создай свой словарь. В котором будут имена партиций. Ну и во view динамический джоин с таблицами чьи имена совпадают. Тогда view вообще менять не надо. :)

Можно пример?
На самом деле мне это "партицирование" не нужно, но чисто для развития. Вдруг пригодится.
...
Рейтинг: 0 / 0
Российские СУБД
    #39200403
Фотография roden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander Ryndinroden
По-моему уже давно выяснили, что работают с тем, с чем умеют лучше всего.
Будет человек уметь работать с Линтер - будет работать с Линтер.Допустим, я знаю хорошо MS Access или dbase, но я их точно не буду использовать.
Я всё же не имел ввиду крайности
...
Рейтинг: 0 / 0
Российские СУБД
    #39200431
этта
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей АрсеньевДа авто добавление партиций на триггерах не напишешь
а поцчему, собсна ?
ddl то в поцгрессе транзакционный. в отличь от ара--кала.
да, очередь из-за лока головной. + по сейвпойнту блока обработки ошибки (как вставки так и создания).
да, в автономии, чтобы не откатывать ddl при факапе транзакции.
долго, но можно, если смена суток ночью, и ночью низкая нагрузка.

основная засада -- при наличии данных в самой головной можно в долгую очередь за автовакуумом влететь. ну так в головной не надо ничего держать.
Сергей Арсеньев(ну кроме каждое утро добавим партицию на завтра :) ). а это -- если не хочется проблем с очередями. разумная комбинация этого с предыдущим -- всё что нужно старому человеку. ну и павлины, ага.
...
Рейтинг: 0 / 0
Российские СУБД
    #39200443
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
топик "Российские СУБД" плавно перешло к обсуждению Oracle vs PostgreSQL

Что замечательно показывает, какое состояние с Subj на сегодняшний день.
...
Рейтинг: 0 / 0
Российские СУБД
    #39200590
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander A. SakНу вот вариант. Для вставки используем одно view, для чтения - другое.а потом вспоминаем, что в системе не одна сессия одного человека работает...
...
Рейтинг: 0 / 0
Российские СУБД
    #39200631
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender,

Да ладно тебе, для извращений типа
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create or replace function test.get_part(id numeric) returns setof test.part_null as $$
 begin
  return query execute 'select * from test.part_'||coalesce(id::character varying,'null') using id;
 end; 
 $$ LANGUAGE plpgsql
;

create view test.part_table as 
 select pd.part_id,tt.val
   from test.part_dict pd
   join test.get_part(pd.part_id) tt on (0=0)
;   


Можно ничего не переопределять на лету. Просто добавляешь таблицу и запись про нее в part_dict.
Забавно, что постгрес понимает, в случае view, что предикат надо спускать для фильтрации записей в part_dict. И не понимает, если это же выражение запихнуть в with. Хотя у меня старая версия поди.
...
Рейтинг: 0 / 0
Российские СУБД
    #39200636
Alexander A. Sak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtenderAlexander A. SakНу вот вариант. Для вставки используем одно view, для чтения - другое.а потом вспоминаем, что в системе не одна сессия одного человека работает...

Действительно.
Посмотрим что там с другими сессиями. Удалил уже все, но можно скопировать из своих постов :)

Сессия 1:
Код: plsql
1.
2.
3.
4.
5.
6.
postgres=> begin transaction ;
BEGIN
postgres=> select * from t;
 id | part_id | val 
----+---------+-----
(0 строк)



Сессия 2:
Код: plsql
1.
postgres=> insert into t_ins(id, part_id, val) values (9, 9, '9');



и висим-ждем.

Потом в Сессии 1 делаем commit, и в Сессия 2 скрипт завершается.
Это если приходится создавать новую таблицу при вставке записи. Если таблица не создается, то скрипт в Сессии 2 ничего не ждет.

Все логично я считаю. Насколько это применимо в реальности - надо смотреть на реальность. Я сейчас как теоретик тут.
...
Рейтинг: 0 / 0
Российские СУБД
    #39200638
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньев,
Вы так и не пояснили что у вас там. Одна таблица во всех UNION? Тогда отбор id=2 просканирует все. Или разные одна на секцию. Тогда страдает логика: нужно в запросах учитывать секционность.
...
Рейтинг: 0 / 0
Российские СУБД
    #39200648
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfoСергей Арсеньев,
Вы так и не пояснили что у вас там.
обычный union all разных секций с check constraint или намеренным where ы условии выборки из секции.
В этом случае, как выше показали, оптимизатор может не смотреть в секции, для которых сформируется недопустимое условие.
...
Рейтинг: 0 / 0
Российские СУБД
    #39200663
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевvadiminfoСергей Арсеньев,
Вы так и не пояснили что у вас там.
обычный union all разных секций с check constraint или намеренным where ы условии выборки из секции.
В этом случае, как выше показали, оптимизатор может не смотреть в секции, для которых сформируется недопустимое условие.
У вас в обычном union all стоит обычный select, который отбирает id=2. Про него вопрос. Там же отбор из всей таблицы, из всех "секций"? Или что? Нуно было не многоточия писать, а пример запроса.
...
Рейтинг: 0 / 0
Российские СУБД
    #39200826
Фотография roden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsevтопик "Российские СУБД" плавно перешло к обсуждению Oracle vs PostgreSQL

Что замечательно показывает, какое состояние с Subj на сегодняшний день.

На самом деле в данном форуме это показывает только количество специалистов, знакомых с той или иной СУБД.
Правда, пожалуй, на рынок такое количество работающих с Постгрес тоже влияет :)
...
Рейтинг: 0 / 0
25 сообщений из 403, страница 4 из 17
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Российские СУБД
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]