powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Использование record в CHECK constarint
17 сообщений из 42, страница 2 из 2
Использование record в CHECK constarint
    #38557390
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk,

а каже тогда блюсти разделение мира и при этом быть уверенным что его не сломают - надо разным группам юзеров давать работать с определенными документами - наилучший способ через view с WITH(security_barrier = true), но получается что в ПЖ нельзя соединить прекрасное с полезным...(
...
Рейтинг: 0 / 0
Использование record в CHECK constarint
    #38557406
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
могли бы дать приоритет constraint_exclusion!?
может надо написать разработчикам? или на заборе? :)
...
Рейтинг: 0 / 0
Использование record в CHECK constarint
    #38557439
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
BEGIN;
CREATE VIEW documents_view  WITH (security_barrier=true) AS 
SELECT documents.id as id,
         documents.no as no
  FROM documents WHERE ( "no"::int <= 100 AND  "no"::int > 0 )
UNION ALL   
SELECT documents.id as id,
         documents.no as no
  FROM documents WHERE ( "no"::int <= 200 AND  "no"::int > 100 )
UNION ALL   
SELECT documents.id as id,
         documents.no as no
  FROM documents WHERE ( "no"::int <= 300 AND  "no"::int > 200 )
UNION ALL   
SELECT documents.id as id,
         documents.no as no
  FROM documents WHERE ( "no"::int <= 400 AND  "no"::int > 300 )
UNION ALL   
SELECT documents.id as id,
         documents.no as no
  FROM documents WHERE ( "no"::int <= 500 AND  "no"::int > 400 )
;
----------------------------------------------
explain analyze
select * from
  documents_view
where "no"::int > 100 and "no"::int < 300;
----------------------------------------------
"Append  (cost=0.00..1780.02 rows=202 width=8) (actual time=0.049..874.701 rows=39800 loops=1)"
"  ->  Append  (cost=0.00..889.00 rows=101 width=8) (actual time=0.039..274.288 rows=20000 loops=1)"
"        ->  Seq Scan on documents  (cost=0.00..0.00 rows=1 width=28) (actual time=0.004..0.004 rows=0 loops=1)"
"              Filter: (((no)::integer <= 200) AND ((no)::integer > 100) AND ((no)::integer > 100) AND ((no)::integer < 300))"
"        ->  Seq Scan on documents_2  (cost=0.00..889.00 rows=100 width=8) (actual time=0.016..114.822 rows=20000 loops=1)"
"              Filter: (((no)::integer <= 200) AND ((no)::integer > 100) AND ((no)::integer > 100) AND ((no)::integer < 300))"
"  ->  Append  (cost=0.00..889.00 rows=101 width=8) (actual time=0.041..286.421 rows=19800 loops=1)"
"        ->  Seq Scan on documents documents_1  (cost=0.00..0.00 rows=1 width=28) (actual time=0.004..0.004 rows=0 loops=1)"
"              Filter: (((no)::integer <= 300) AND ((no)::integer > 200) AND ((no)::integer > 100) AND ((no)::integer < 300))"
"        ->  Seq Scan on documents_3  (cost=0.00..889.00 rows=100 width=8) (actual time=0.019..124.719 rows=19800 loops=1)"
"              Filter: (((no)::integer <= 300) AND ((no)::integer > 200) AND ((no)::integer > 100) AND ((no)::integer < 300))"
"              Rows Removed by Filter: 200"
"Total runtime: 1038.461 ms"



как бе вот так ]:0]
...
Рейтинг: 0 / 0
Использование record в CHECK constarint
    #38557494
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,

Спасибо за код!
Насколько я понимаю план у такого view будет совсем не оптимальный - у меня на тестовых данных разница во времени выполнения запросов к view и таблице - 8 раз, хотя индексы у всех секций по полю no созданы...
...
Рейтинг: 0 / 0
Использование record в CHECK constarint
    #38557540
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вопрос к практике применения - поделитесь пожалуйста опытом реального боевого применения секционирования: насколько оправдано, производительность, впечатления, а то я уже сильно сомневаюсь использовать ли
...
Рейтинг: 0 / 0
Использование record в CHECK constarint
    #38557617
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
столкнулся с еще одной неприятностью - невозможно контролировать уникальность поля no - я создал уникальный индекс для каждой секции, но уникальность проверяется только на уровне секции а не на уровне всех секций - необходимо в триггерах производить дополнительную проверку на уникальность полей во всех секциях!?
...
Рейтинг: 0 / 0
Использование record в CHECK constarint
    #38557626
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
опечатка - вместо уникальность поля no читаем любое другое поле, требующее уникальности во всей таблице
...
Рейтинг: 0 / 0
Использование record в CHECK constarint
    #38557654
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как обновить план для вью?
после добавления и удаления секций план запроса показывает обращение к несуществующим секциям
...
Рейтинг: 0 / 0
Использование record в CHECK constarint
    #38557941
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spопечатка - вместо уникальность поля no читаем любое другое поле, требующее уникальности во всей таблице

это известное ограничение партиционирования в postgresql с ним надо мириться и как то жить пока...
вообще если вам требуется жесткий uniq не на serial primary key - скорее всего эту таблицу партиционировать не надо :).

обычно партиционирование это для всяких архивно-накопительных данных с партиционированнием по дате...
...
Рейтинг: 0 / 0
Использование record в CHECK constarint
    #38558631
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk,

У нас активно растущая база договоров - ежедневно по 200-500 шт
Это самая быстрорастущая таблица. Ее секционирование разумно по дате, но должен соблюдаться и принцип уникальности номеров договоров в совокупности с серией
...
Рейтинг: 0 / 0
Использование record в CHECK constarint
    #38558685
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spMaxim Boguk,

У нас активно растущая база договоров - ежедневно по 200-500 шт
Это самая быстрорастущая таблица. Ее секционирование разумно по дате, но должен соблюдаться и принцип уникальности номеров договоров в совокупности с сериейсекционирование имеет смысл в postgresql в основном, если вам нужно делать DROP старых данных секциями.

(а равносильный delete выполняется часами или сутками )

договора, очевидно, дропаться за разумное время жизни проги не будут.

человек, придумывающий на свою 5-ю точку приключения в виде партицирования (в пг) там, где нужно всего-то продумать правильное индексирование - ССЗБ.

при 1000-х накладных в день и 10-х (20-50) позиций в них нет (по моему опыту) никакой необходимости партицировать таблицу строк накладных (не говоря о шапках).
всё равно, вы её чистить не будете никогда (за время жизни программы -- т.к. в бумаге что-то найти ещё сложнее, чем в программе. а хранить бумагу, и находить что-то в ней надо долго).
а доступаться - индексно.
Единственно - со временем можете сделать партицирование по годам. (при этом уникью нумерации док-тов вам нужно внутри года, согласно законодательства). Ну , это если делать вам будет нечего. ессно.



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

поскольку гемора вы с партицированием получаете вагон и тележку (если не собираетесь писать говнокод без ссылочной целостности и прочих признаков приличной учётной БД). а выгод [в вашем случае - точно] - никаких. От слова вообще.
...
Рейтинг: 0 / 0
Использование record в CHECK constarint
    #38558733
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,

спасибо!
...
Рейтинг: 0 / 0
Использование record в CHECK constarint
    #38558981
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,

Тут возник еще один вопрос не очень освещенный в документации - при создании секций надо ли и какие (партиции на другие таблицы или других тадиц на партицию) создавать связи с другими таблицами?
...
Рейтинг: 0 / 0
Использование record в CHECK constarint
    #38559017
йццй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sp,
с FK при партицировании (мастер таблиц) всё нехорошо

если только ссылающиеся (slave|detail) таблицы не отпартицированы так же (по тому же признаку) что и ссылаемые (master|header). Тогда появляется возможность сделать аккуратные FK-еи между одинаково нарезанными партициями мастеров|шапок и подчинёнок|деталировок

если же партицируется только ссылающаяся сторона - проблем нет.
...
Рейтинг: 0 / 0
Использование record в CHECK constarint
    #38559190
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
йццй,

както вы сложно изъяснились - читал кучу раз :)
понятно только последнее предложение...
...
Рейтинг: 0 / 0
Использование record в CHECK constarint
    #38560402
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq
Код: sql
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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
BEGIN;
CREATE VIEW documents_view  WITH (security_barrier=true) AS 
SELECT documents.id as id,
         documents.no as no
  FROM documents WHERE ( "no"::int <= 100 AND  "no"::int > 0 )
UNION ALL   
SELECT documents.id as id,
         documents.no as no
  FROM documents WHERE ( "no"::int <= 200 AND  "no"::int > 100 )
UNION ALL   
SELECT documents.id as id,
         documents.no as no
  FROM documents WHERE ( "no"::int <= 300 AND  "no"::int > 200 )
UNION ALL   
SELECT documents.id as id,
         documents.no as no
  FROM documents WHERE ( "no"::int <= 400 AND  "no"::int > 300 )
UNION ALL   
SELECT documents.id as id,
         documents.no as no
  FROM documents WHERE ( "no"::int <= 500 AND  "no"::int > 400 )
;
----------------------------------------------
explain analyze
select * from
  documents_view
where "no"::int > 100 and "no"::int < 300;
----------------------------------------------
"Append  (cost=0.00..1780.02 rows=202 width=8) (actual time=0.049..874.701 rows=39800 loops=1)"
"  ->  Append  (cost=0.00..889.00 rows=101 width=8) (actual time=0.039..274.288 rows=20000 loops=1)"
"        ->  Seq Scan on documents  (cost=0.00..0.00 rows=1 width=28) (actual time=0.004..0.004 rows=0 loops=1)"
"              Filter: (((no)::integer <= 200) AND ((no)::integer > 100) AND ((no)::integer > 100) AND ((no)::integer < 300))"
"        ->  Seq Scan on documents_2  (cost=0.00..889.00 rows=100 width=8) (actual time=0.016..114.822 rows=20000 loops=1)"
"              Filter: (((no)::integer <= 200) AND ((no)::integer > 100) AND ((no)::integer > 100) AND ((no)::integer < 300))"
"  ->  Append  (cost=0.00..889.00 rows=101 width=8) (actual time=0.041..286.421 rows=19800 loops=1)"
"        ->  Seq Scan on documents documents_1  (cost=0.00..0.00 rows=1 width=28) (actual time=0.004..0.004 rows=0 loops=1)"
"              Filter: (((no)::integer <= 300) AND ((no)::integer > 200) AND ((no)::integer > 100) AND ((no)::integer < 300))"
"        ->  Seq Scan on documents_3  (cost=0.00..889.00 rows=100 width=8) (actual time=0.019..124.719 rows=19800 loops=1)"
"              Filter: (((no)::integer <= 300) AND ((no)::integer > 200) AND ((no)::integer > 100) AND ((no)::integer < 300))"
"              Rows Removed by Filter: 200"
"Total runtime: 1038.461 ms"



как бе вот так ]:0]

Большая проблема с таким способом, что нельзя оперативно изменить вью при создании секции если мы вставляем данные используя запрос к этому вью!!!
...
Рейтинг: 0 / 0
Использование record в CHECK constarint
    #38560618
йццй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
spqwwq
Код: sql
1.
<>



как бе вот так ]:0]

Большая проблема с таким способом, что нельзя оперативно изменить вью при создании секции если мы вставляем данные используя запрос к этому вью!!!
а кто-то обещал другоэ ?
...
Рейтинг: 0 / 0
17 сообщений из 42, страница 2 из 2
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Использование record в CHECK constarint
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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