|
|
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
Мне нужно при вставке для секционированной таблицы проверять соответствует ли запись определенным критериям - для этого я создал функцию в которой в качестве входного параметра является record. У меня возникает вопрос - как передать текущую запись в данную функцию в выражении CHECK? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2014, 17:44:39 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
или таки использование функций в выражении CHECK для секционированных таблиц - это плохо? Но тогда как разбивать по различным полям, к примеру: - хочется секционировать по номерам документов что бы все документы с номерами, начинающимися с 1 попадали в одну секцию, начинающиеся с 2 - в другую и т.д. ну и куча других примеров найдется ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2014, 18:02:57 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
секционированние это что Partitioning (патрицирование) ? если да то check на каждую таблицу + триггер BEFORE INSERT в котором и определяем в какую таблицу писать данные ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2014, 18:26:55 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
SmeL_md, с триггерами проблем нет - есть вопрос по CHECK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2014, 18:30:01 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
spSmeL_md, с триггерами проблем нет - есть вопрос по CHECKвы можете передать туда рекорд как ROW-конструктор (см RTFM) (попросту -- перечислением всех полей записи в скобках. можно даже с полседующим кастом к типу). Код: plsql 1. хотя, вас наверное интересует, как его передать не перечисляя поля [:0] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2014, 18:42:51 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
qwwq, да, вы правильно поняли - надо чтоб запись целиком без перечисления полей, но данный вопрос наверно отходит на другой план - по такому CHECK движок не сможет строить эффективные планы т.к. результат функции заранее не известен... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2014, 18:54:38 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
spМне нужно при вставке для секционированной таблицы проверять соответствует ли запись определенным критериям - для этого я создал функцию в которой в качестве входного параметра является record. У меня возникает вопрос - как передать текущую запись в данную функцию в выражении CHECK? Код: sql 1. 2. колитесь, что вы там передаёте ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 09:58:55 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ЗЫ Код: sql 1. 2. 3. PS если ф-я иммутабл - можете строить индекс. (и для выделения партиции при планировании тоже может сгодиться, если в where будет та же ф-я.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 10:09:36 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
qwwq, спасибо большое! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 11:04:46 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
возникла очередная проблема с секционированием: имеем текстовое поле ContractNo. по нему настроено секционирование и проверка в секциях выглядит так Код: plsql 1. 2. 3. 4. вставил случайные данные в разные секции от 1 до 500 Пытаюсь делать выборку Код: plsql 1. 2. в плане вижу что идет сканирование всех секций вместо 1й, 2й и 3й Почему мой where не использует constraint_exclusion? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 11:14:47 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
spвозникла очередная проблема с секционированием: имеем текстовое поле ContractNo. по нему настроено секционирование и проверка в секциях выглядит так Код: plsql 1. 2. 3. 4. вставил случайные данные в разные секции от 1 до 500 Пытаюсь делать выборку Код: plsql 1. 2. в плане вижу что идет сканирование всех секций вместо 1й, 2й и 3й Почему мой where не использует constraint_exclusion? а вы дайте ему эту возможность, тогда и спрашивайте ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 11:57:08 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
qwwq, по вашему настоянию - дал :) но результат прежний ( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 12:20:47 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 12:33:45 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
sp Код: 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. у вас условие по (((documents.no)::integer > 100) AND ((documents.no)::integer < 300)) а партиционирование по: partition1 - CHECK ( ContractNo::int <= 100 AND ContractNo::int > 0 ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 12:53:08 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk, в данном случае названия полей не играют роли - в начале я назвал ContractNo но потом переименовал в no - вы же понимаете что ПЖ не дал бы создать CHECK если указать неверное поле ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 13:01:44 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
spMaxim Boguk, в данном случае названия полей не играют роли - в начале я назвал ContractNo но потом переименовал в no - вы же понимаете что ПЖ не дал бы создать CHECK если указать неверное поле ) не знаю, что у вас не играет делаем полный тест-кейс: Код: 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. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. ЧЯДНТ ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 13:06:43 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
qwwq, спасибо - разобрался - секционирование работает на запросах к таблице, не работает view на секционированной таблице Чтоб не перегружать пост не писал. что выборку делаю из view: Код: plsql 1. 2. 3. 4. 5. 6. 7. как сделать чтоб view учитывало constraint_exclusion - не пойму ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 13:20:54 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
spqwwq, спасибо - разобрался - секционирование работает на запросах к таблице, не работает view на секционированной таблице Чтоб не перегружать пост не писал. что выборку делаю из view: Код: plsql 1. 2. 3. 4. 5. 6. 7. как сделать чтоб view учитывало constraint_exclusion - не пойму а что будет если написать? Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. вообще очень странно все это... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 13:49:28 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 13:52:16 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 13:55:51 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
qwwqMaxim Boguk, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. у меня что для view что для таблицы план одинаковый Код: plaintext 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 14:11:52 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk<> у меня что для view что для таблицы план одинаковый <> "аналогично"(сс) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 14:38:52 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
qwwqMaxim Boguk<> у меня что для view что для таблицы план одинаковый <> "аналогично"(сс) опять автор топика какую то критичную инфу не выдал "Чтоб не перегружать пост" (к этому бы еще понимание что критично а что нет :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 15:07:04 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk, :) вы правы - утаил WITH(security_barrier = true) с ним и не работает...а надо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 16:38:36 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
spMaxim Boguk, :) вы правы - утаил WITH(security_barrier = true) с ним и не работает...а надо и не будет... никакие условия не вносятся под security barrier... такой view скорее всего будет вычислять всегда полный запрос внутри а потом уже накладывать все остальные условия поверх... на то он и barrier ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 16:47:06 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk, а каже тогда блюсти разделение мира и при этом быть уверенным что его не сломают - надо разным группам юзеров давать работать с определенными документами - наилучший способ через view с WITH(security_barrier = true), но получается что в ПЖ нельзя соединить прекрасное с полезным...( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 16:51:12 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
могли бы дать приоритет constraint_exclusion!? может надо написать разработчикам? или на заборе? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 17:00:19 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
Код: 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. как бе вот так ]:0] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 17:20:08 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
qwwq, Спасибо за код! Насколько я понимаю план у такого view будет совсем не оптимальный - у меня на тестовых данных разница во времени выполнения запросов к view и таблице - 8 раз, хотя индексы у всех секций по полю no созданы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 17:46:08 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
вопрос к практике применения - поделитесь пожалуйста опытом реального боевого применения секционирования: насколько оправдано, производительность, впечатления, а то я уже сильно сомневаюсь использовать ли ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 18:20:43 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
столкнулся с еще одной неприятностью - невозможно контролировать уникальность поля no - я создал уникальный индекс для каждой секции, но уникальность проверяется только на уровне секции а не на уровне всех секций - необходимо в триггерах производить дополнительную проверку на уникальность полей во всех секциях!? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 19:14:57 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
опечатка - вместо уникальность поля no читаем любое другое поле, требующее уникальности во всей таблице ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 19:23:31 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
как обновить план для вью? после добавления и удаления секций план запроса показывает обращение к несуществующим секциям ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.02.2014, 19:50:37 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
spопечатка - вместо уникальность поля no читаем любое другое поле, требующее уникальности во всей таблице это известное ограничение партиционирования в postgresql с ним надо мириться и как то жить пока... вообще если вам требуется жесткий uniq не на serial primary key - скорее всего эту таблицу партиционировать не надо :). обычно партиционирование это для всяких архивно-накопительных данных с партиционированнием по дате... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 01:21:31 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk, У нас активно растущая база договоров - ежедневно по 200-500 шт Это самая быстрорастущая таблица. Ее секционирование разумно по дате, но должен соблюдаться и принцип уникальности номеров договоров в совокупности с серией ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 15:42:10 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
spMaxim Boguk, У нас активно растущая база договоров - ежедневно по 200-500 шт Это самая быстрорастущая таблица. Ее секционирование разумно по дате, но должен соблюдаться и принцип уникальности номеров договоров в совокупности с сериейсекционирование имеет смысл в postgresql в основном, если вам нужно делать DROP старых данных секциями. (а равносильный delete выполняется часами или сутками ) договора, очевидно, дропаться за разумное время жизни проги не будут. человек, придумывающий на свою 5-ю точку приключения в виде партицирования (в пг) там, где нужно всего-то продумать правильное индексирование - ССЗБ. при 1000-х накладных в день и 10-х (20-50) позиций в них нет (по моему опыту) никакой необходимости партицировать таблицу строк накладных (не говоря о шапках). всё равно, вы её чистить не будете никогда (за время жизни программы -- т.к. в бумаге что-то найти ещё сложнее, чем в программе. а хранить бумагу, и находить что-то в ней надо долго). а доступаться - индексно. Единственно - со временем можете сделать партицирование по годам. (при этом уникью нумерации док-тов вам нужно внутри года, согласно законодательства). Ну , это если делать вам будет нечего. ессно. на худой -- сделайте секционирование по части вашего уникью. (год это у вас, или серия - вам лучше знать). но я б не стал вообще . (а вот про индексы бы подумал, так чтобы никогда поиск не проходил фулсканом) поскольку гемора вы с партицированием получаете вагон и тележку (если не собираетесь писать говнокод без ссылочной целостности и прочих признаков приличной учётной БД). а выгод [в вашем случае - точно] - никаких. От слова вообще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 16:11:03 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
qwwq, спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 16:27:34 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
qwwq, Тут возник еще один вопрос не очень освещенный в документации - при создании секций надо ли и какие (партиции на другие таблицы или других тадиц на партицию) создавать связи с другими таблицами? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 19:46:00 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
sp, с FK при партицировании (мастер таблиц) всё нехорошо если только ссылающиеся (slave|detail) таблицы не отпартицированы так же (по тому же признаку) что и ссылаемые (master|header). Тогда появляется возможность сделать аккуратные FK-еи между одинаково нарезанными партициями мастеров|шапок и подчинёнок|деталировок если же партицируется только ссылающаяся сторона - проблем нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 20:18:23 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
йццй, както вы сложно изъяснились - читал кучу раз :) понятно только последнее предложение... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2014, 00:14:52 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
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. как бе вот так ]:0] Большая проблема с таким способом, что нельзя оперативно изменить вью при создании секции если мы вставляем данные используя запрос к этому вью!!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2014, 21:06:21 |
|
||
|
Использование record в CHECK constarint
|
|||
|---|---|---|---|
|
#18+
spqwwq Код: sql 1. как бе вот так ]:0] Большая проблема с таким способом, что нельзя оперативно изменить вью при создании секции если мы вставляем данные используя запрос к этому вью!!! а кто-то обещал другоэ ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.02.2014, 08:11:28 |
|
||
|
|

start [/forum/topic.php?all=1&fid=53&tid=1998846]: |
0ms |
get settings: |
8ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
150ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 208ms |
| total: | 433ms |

| 0 / 0 |
