Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 [4] 5 6 7 8 9 10 .. 17   вперед  Ctrl
 Re: Российские СУБД  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
vadiminfo,

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

Что на примере с with и было показано. Другое дело, если сервер не умеет разворачивать селект из view в вариант с прокидыванием предикатов и не умеет отсеивать по невыполнимому условию без просмотра содержимого. Тут, конечно, ничем не поможешь.
24 мар 16, 18:42    [18974928]     Ответить | Цитировать Сообщить модератору
 Re: Российские СУБД  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
Alexander Ryndin
А что там с hash и композитным партицированием?

Ну в общем случае с view можно не то что по hash, можно хоть по sequence в партиции раскидывать, чтобы гарантировать равномерное размазывание, если это надо. Любая логика к твоим услугам. Да авто добавление партиций на триггерах не напишешь (ну кроме каждое утро добавим партицию на завтра :) ).
24 мар 16, 18:48    [18974943]     Ответить | Цитировать Сообщить модератору
 Re: Российские СУБД  [new]
Alexander A. Sak
Member

Откуда: Омск
Сообщений: 1228
Сергей Арсеньев
Да авто добавление партиций на триггерах не напишешь (ну кроме каждое утро добавим партицию на завтра :) ).


Есть у меня подозрение, что в Постгресе можно в триггере и таблицу создать.
24 мар 16, 18:52    [18974955]     Ответить | Цитировать Сообщить модератору
 Re: Российские СУБД  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
Alexander A. Sak,

Создать то можно, наверное, как view переопределить?
Хотя очумелые ручки могут, наверное, через рекурсивное with и без переопределения справиться. :)
24 мар 16, 18:58    [18974963]     Ответить | Цитировать Сообщить модератору
 Re: Российские СУБД  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
точнее на left join.
24 мар 16, 19:00    [18974968]     Ответить | Цитировать Сообщить модератору
 Re: Российские СУБД  [new]
vadiminfo
Member

Откуда: Обнинск
Сообщений: 4802
Сергей Арсеньев
vadiminfo,

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

Что на примере с with и было показано. Другое дело, если сервер не умеет разворачивать селект из view в вариант с прокидыванием предикатов и не умеет отсеивать по невыполнимому условию без просмотра содержимого. Тут, конечно, ничем не поможешь.

Не знаю, что скрывается там за многоточиями, но если одна таблица, то чтобы найти id=2, он проскандирует всю таблицу. Если разные: типа для каждого года своя таблица со своим именем, то это сильное влияние на логику: мне по логике нужна одна таблица, и ничего не знать при написании запроса про секции. Это физика - вопросы производительности.
24 мар 16, 19:01    [18974970]     Ответить | Цитировать Сообщить модератору
 Re: Российские СУБД  [new]
Alexander A. Sak
Member

Откуда: Омск
Сообщений: 1228
Продолжаем мучать Постгрес. Вешаем на нашу "партицированную" вьюху триггер, создающий таблицы:

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();


И ведь работает:
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=> 
24 мар 16, 19:13    [18975000]     Ответить | Цитировать Сообщить модератору
 Re: Российские СУБД  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54799

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

24 мар 16, 19:16    [18975008]     Ответить | Цитировать Сообщить модератору
 Re: Российские СУБД  [new]
Alexander A. Sak
Member

Откуда: Омск
Сообщений: 1228
Сергей Арсеньев
Alexander A. Sak,

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


Наверное, можно при создании таблицы и view пересоздать. Ужас, конечно, получается, но ведь работает. Интересно было бы у спецов узнать насколько поплохеет Постгресу от такого "партицирования".
24 мар 16, 19:18    [18975015]     Ответить | Цитировать Сообщить модератору
 Re: Российские СУБД  [new]
Alexander Ryndin
Member

Откуда:
Сообщений: 4919
Блог
Сергей Арсеньев
Alexander Ryndin
А что там с hash и композитным партицированием?

Ну в общем случае с view можно не то что по hash, можно хоть по sequence в партиции раскидывать, чтобы гарантировать равномерное размазывание, если это надо. Любая логика к твоим услугам. Да авто добавление партиций на триггерах не напишешь (ну кроме каждое утро добавим партицию на завтра :) ).
И что будет в результате с pruning?
24 мар 16, 19:28    [18975042]     Ответить | Цитировать Сообщить модератору
 Re: Российские СУБД  [new]
Alexander A. Sak
Member

Откуда: Омск
Сообщений: 1228
Облом-с. Пересоздание вью в триггере на вью не дают:
ОШИБКА:  нельзя выполнить CREATE OR REPLACE VIEW "t", так как этот объект используется активными запросами в данном сеансе


Вы же понимаете, что это не препятствие :D. Сейчас еще что-нибудь придумаем.
24 мар 16, 19:29    [18975044]     Ответить | Цитировать Сообщить модератору
 Re: Российские СУБД  [new]
Alexander A. Sak
Member

Откуда: Омск
Сообщений: 1228
Ну вот вариант. Для вставки используем одно view, для чтения - другое.
Вью для вставки:

create or replace view t_ins as
select id, part_id, val from t_part_1 where 0=1;


Модифицированная триггерная функция:
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;


Ну и триггер:
create trigger tg_ins instead of insert on t_ins
    for each row execute procedure t_part();


В результате получаем:
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=> 
24 мар 16, 19:39    [18975067]     Ответить | Цитировать Сообщить модератору
 Re: Российские СУБД  [new]
зрить надо в корень
Guest
Симонов Денис
Alexander Ryndin,

это говорил не Путин, а Мариничев.

И не это он вообще говорил.
Но некоторые слышат то, что хотят слышать им из разных ящиков журнашлюхи вещают...
25 мар 16, 09:15    [18976229]     Ответить | Цитировать Сообщить модератору
 Re: Российские СУБД  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
Alexander A. Sak
Ну вот вариант. Для вставки используем одно view, для чтения - другое.

Создай свой словарь. В котором будут имена партиций. Ну и во view динамический джоин с таблицами чьи имена совпадают. Тогда view вообще менять не надо. :)
25 мар 16, 09:33    [18976323]     Ответить | Цитировать Сообщить модератору
 Re: Российские СУБД  [new]
Alexander A. Sak
Member

Откуда: Омск
Сообщений: 1228
Сергей Арсеньев
Alexander A. Sak
Ну вот вариант. Для вставки используем одно view, для чтения - другое.

Создай свой словарь. В котором будут имена партиций. Ну и во view динамический джоин с таблицами чьи имена совпадают. Тогда view вообще менять не надо. :)


Можно пример?
На самом деле мне это "партицирование" не нужно, но чисто для развития. Вдруг пригодится.
25 мар 16, 09:50    [18976384]     Ответить | Цитировать Сообщить модератору
 Re: Российские СУБД  [new]
roden
Member

Откуда:
Сообщений: 741
Alexander Ryndin
roden

По-моему уже давно выяснили, что работают с тем, с чем умеют лучше всего.
Будет человек уметь работать с Линтер - будет работать с Линтер.
Допустим, я знаю хорошо MS Access или dbase, но я их точно не буду использовать.

Я всё же не имел ввиду крайности
25 мар 16, 10:46    [18976732]     Ответить | Цитировать Сообщить модератору
 Re: Российские СУБД  [new]
этта
Guest
Сергей Арсеньев
Да авто добавление партиций на триггерах не напишешь

а поцчему, собсна ?
ddl то в поцгрессе транзакционный. в отличь от ара--кала.
да, очередь из-за лока головной. + по сейвпойнту блока обработки ошибки (как вставки так и создания).
да, в автономии, чтобы не откатывать ddl при факапе транзакции.
долго, но можно, если смена суток ночью, и ночью низкая нагрузка.

основная засада -- при наличии данных в самой головной можно в долгую очередь за автовакуумом влететь. ну так в головной не надо ничего держать.
Сергей Арсеньев
(ну кроме каждое утро добавим партицию на завтра :) ).
а это -- если не хочется проблем с очередями. разумная комбинация этого с предыдущим -- всё что нужно старому человеку. ну и павлины, ага.
25 мар 16, 11:31    [18976944]     Ответить | Цитировать Сообщить модератору
 Re: Российские СУБД  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9891
топик "Российские СУБД" плавно перешло к обсуждению Oracle vs PostgreSQL

Что замечательно показывает, какое состояние с Subj на сегодняшний день.
25 мар 16, 11:45    [18977045]     Ответить | Цитировать Сообщить модератору
 Re: Российские СУБД  [new]
Sayan Malakshinov
Member

Откуда: Мск
Сообщений: 5956
Alexander A. Sak
Ну вот вариант. Для вставки используем одно view, для чтения - другое.
а потом вспоминаем, что в системе не одна сессия одного человека работает...
25 мар 16, 13:56    [18977765]     Ответить | Цитировать Сообщить модератору
 Re: Российские СУБД  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
xtender,

Да ладно тебе, для извращений типа
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. Хотя у меня старая версия поди.
25 мар 16, 14:18    [18977927]     Ответить | Цитировать Сообщить модератору
 Re: Российские СУБД  [new]
Alexander A. Sak
Member

Откуда: Омск
Сообщений: 1228
xtender
Alexander A. Sak
Ну вот вариант. Для вставки используем одно view, для чтения - другое.
а потом вспоминаем, что в системе не одна сессия одного человека работает...


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

Сессия 1:
postgres=> begin transaction ;
BEGIN
postgres=> select * from t;
 id | part_id | val 
----+---------+-----
(0 строк)


Сессия 2:
postgres=> insert into t_ins(id, part_id, val) values (9, 9, '9');


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

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

Все логично я считаю. Насколько это применимо в реальности - надо смотреть на реальность. Я сейчас как теоретик тут.
25 мар 16, 14:21    [18977946]     Ответить | Цитировать Сообщить модератору
 Re: Российские СУБД  [new]
vadiminfo
Member

Откуда: Обнинск
Сообщений: 4802
Сергей Арсеньев,
Вы так и не пояснили что у вас там. Одна таблица во всех UNION? Тогда отбор id=2 просканирует все. Или разные одна на секцию. Тогда страдает логика: нужно в запросах учитывать секционность.
25 мар 16, 14:23    [18977955]     Ответить | Цитировать Сообщить модератору
 Re: Российские СУБД  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
vadiminfo
Сергей Арсеньев,
Вы так и не пояснили что у вас там.

обычный union all разных секций с check constraint или намеренным where ы условии выборки из секции.
В этом случае, как выше показали, оптимизатор может не смотреть в секции, для которых сформируется недопустимое условие.
25 мар 16, 14:29    [18978000]     Ответить | Цитировать Сообщить модератору
 Re: Российские СУБД  [new]
vadiminfo
Member

Откуда: Обнинск
Сообщений: 4802
Сергей Арсеньев
vadiminfo
Сергей Арсеньев,
Вы так и не пояснили что у вас там.

обычный union all разных секций с check constraint или намеренным where ы условии выборки из секции.
В этом случае, как выше показали, оптимизатор может не смотреть в секции, для которых сформируется недопустимое условие.

У вас в обычном union all стоит обычный select, который отбирает id=2. Про него вопрос. Там же отбор из всей таблицы, из всех "секций"? Или что? Нуно было не многоточия писать, а пример запроса.
25 мар 16, 14:43    [18978113]     Ответить | Цитировать Сообщить модератору
 Re: Российские СУБД  [new]
roden
Member

Откуда:
Сообщений: 741
Leonid Kudryavtsev
топик "Российские СУБД" плавно перешло к обсуждению Oracle vs PostgreSQL

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


На самом деле в данном форуме это показывает только количество специалистов, знакомых с той или иной СУБД.
Правда, пожалуй, на рынок такое количество работающих с Постгрес тоже влияет :)
25 мар 16, 17:01    [18978990]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 [4] 5 6 7 8 9 10 .. 17   вперед  Ctrl
Все форумы / Сравнение СУБД Ответить