|
|
|
Merge в postgres
|
|||
|---|---|---|---|
|
#18+
в 2008 году merge приняли в состав стандарта. Почему его нет в postgres, который всегда соответствовал стандартам? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 14:58 |
|
||
|
Merge в postgres
|
|||
|---|---|---|---|
|
#18+
PCContraв 2008 году merge приняли в состав стандарта. Почему его нет в postgres, который всегда соответствовал стандартам? Соответствие стандартам это не тоже самое что полная реализация стандарта. Полный даже ANSI SQL 1992 - он настолько обьемен и местами настолько дурной что целиком его не сделать (одни nchar/nvachar чего стоят... это я скажу как человек который в in-house разработке пытался это впилить в Postgresql для внутренних целей). А вообще на счет совместимости смотрите тут: http://www.postgresql.org/docs/9.4/interactive/features.html -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 15:14 |
|
||
|
Merge в postgres
|
|||
|---|---|---|---|
|
#18+
Максим, у меня такой задачи использовать merge не было. Он вообще нужен? И да, я согласен, что в стандарте 92 года много того, что сейчас кажется абсурдным и в реализации ни мне, ни кому бы то ни было, не нужно и вряд ли будет нужно когда-нибудь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 15:17 |
|
||
|
Merge в postgres
|
|||
|---|---|---|---|
|
#18+
PCContraМаксим, у меня такой задачи использовать merge не было. Он вообще нужен? И да, я согласен, что в стандарте 92 года много того, что сейчас кажется абсурдным и в реализации ни мне, ни кому бы то ни было, не нужно и вряд ли будет нужно когда-нибудь Да merge бывает очень удобен. Но поскольку обычно это легко решалось костыльным триггером то особо никто не заморачивался (ибо очень геморойная реализация). Насколько я понимаю в 9.5 он уже будет (судя по всему). -- Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 15:21 |
|
||
|
Merge в postgres
|
|||
|---|---|---|---|
|
#18+
PCContraне нужно и вряд ли будет нужно когда-нибудьОдин оператор заменяет блок по проверке существования записи, вставке или обновления, обработки коллизии, если этот же блок с тем же ключом идет в другой сессии, и повтор операции. Подобный блок операторов корректно реализуют только процентов 10% разработчиков с опытом более года. Неплохой вопрос для собеседований по применению различных уровней изоляции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 16:15 |
|
||
|
Merge в postgres
|
|||
|---|---|---|---|
|
#18+
Есть один способ: https://pgolub.wordpress.com/2015/02/26/merge-in-postgresql/ Но нужно понимать, что он не атомарен. Как, впрочем, и мерж в оракле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 16:34 |
|
||
|
Merge в postgres
|
|||
|---|---|---|---|
|
#18+
нифига себе не нужен. Людей спросили? http://postgresql.uservoice.com/forums/21853-general топовый запрос!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 17:26 |
|
||
|
Merge в postgres
|
|||
|---|---|---|---|
|
#18+
Ivan Durakнифига себе не нужен. Людей спросили? http://postgresql.uservoice.com/forums/21853-general топовый запрос!! дык "у дураков мысли сходятся" , евпочя ах да, невольная рифма, простите , если обидел вот чего действительно сложно на коленке собрать -- того бакланы и не просят http://postgresql.uservoice.com/forums/21853-general/suggestions/1378161-insert-nowait-update-nowait#comments без апдейта можно обойтись, эмулируется захватом записи. а вот с инсертом -- оно интереснее. есть таки такие задачки ( ну или я люблю их себе придумывать -- захват ресурсов без ожидания) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.04.2015, 21:36 |
|
||
|
Merge в postgres
|
|||
|---|---|---|---|
|
#18+
qwwqвот чего действительно сложно на коленке собратьдля целок - pg_try_advisory_lock ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2015, 18:57 |
|
||
|
Merge в postgres
|
|||
|---|---|---|---|
|
#18+
Flash GordonНо нужно понимать, что он не атомарен. Как, впрочем, и мерж в оракле.А как это проявляется в оракле? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2015, 19:11 |
|
||
|
Merge в postgres
|
|||
|---|---|---|---|
|
#18+
p2.qwwqвот чего действительно сложно на коленке собратьдля целок - pg_try_advisory_lockк сожалению, адвайзори локов в некотором смысле мало или мало гладких отображений заранее открытого [под]мн-ва, пусть и весьма конечного , разных диапазонов разных лонгов на тот же лонг (или пару интов). в некотором смысле -- таких отображений -- пустое множество. если не обрезать изначально множество, предназначаемое к отображению. (или не строить его динамически -- табличкой) <...><...><...>, мр p2 [оценочное суждение] хехе извиняюсь за резкость ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.04.2015, 20:56 |
|
||
|
Merge в postgres
|
|||
|---|---|---|---|
|
#18+
p2., Это важно, я объясню на примере: Код: plsql 1. 2. 3. Сессия 1: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Сессия 2: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Сессия 1: Код: plsql 1. Сессия 2: Код: plsql 1. 2. 3. 4. 5. 6. Хотя из запроса понятно, что мы хотели бы другого — чтобы сессия 2 подождала, но обновила запись, созданную в сессии 1. Приведенный мной трюк с постгресом обладает таким же «приколом», просто в нем он более очевиден, а в оракле люди, не читавшие доку, потом задают вопросы . По сути, чтобы добиться требуемого поведения, нам нужно обрабатывать ошибку нарушения констрейнта, а это то, от чего мы хотим уйти. Так как мерж уже стандартизован, а фичу просят регулярно, то на постгресовой вики есть страничка с парой десятков ссылок на тему: https://wiki.postgresql.org/wiki/SQL_MERGE . Например, там есть http://www.postgresql.org/message-id/CAM3SWZRP0c3g6+aJ=YYDGYAcTZg0xA8-1_FCVo5Xm7hrEL34kw@mail.gmail.com]такая . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2015, 00:35 |
|
||
|
Merge в postgres
|
|||
|---|---|---|---|
|
#18+
Flash GordonХотя из запроса понятно, что мы хотели бы другого Это не Атомарность, а Iзоляция из букв ACID. Да, не удовлетворяет похоти разработчика, хотя, в принципе, соответствует послаблению уровня repeatable read. Причем, доделать теоретически не сложно - сделать statement restart на изменение ключа (выполняя двойную, тройную,... работу), который сейчас приходится реализовывать вручную, если от проверки записи до ее insert/update произошли изменения. Но на множестве строк можно совсем запутаться... Может потому и медлили в postgres, что хотят учесть эти недостатки... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2015, 11:59 |
|
||
|
Merge в postgres
|
|||
|---|---|---|---|
|
#18+
Flash Gordon<> Хотя из запроса понятно, что мы хотели бы другого — чтобы сессия 2 подождала, но обновила запись, созданную в сессии 1. Приведенный мной трюк с постгресом обладает таким же «приколом», просто в нем он более очевиден, а в оракле люди, не читавшие доку, потом задают вопросы . По сути, чтобы добиться требуемого поведения, нам нужно обрабатывать ошибку нарушения констрейнта, а это то, от чего мы хотим уйти. дык, типовая реализация с обработкой ексепшена на коленке валяется в пжшной доке с 8.0 http://www.postgresql.org/docs/8.0/static/plpgsql-control-structures.html#PLPGSQL-UPSERT-EXAMPLE а триггерные вариации скорее всего с 7.x, где x<3 (вариант не без проблем , ессно, т.к. во многия уникъю -- многия печали) но в большинстве случаев -- достаточно. и не только для целок, но и для весьма разработанных pi-рдаков ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2015, 12:28 |
|
||
|
Merge в postgres
|
|||
|---|---|---|---|
|
#18+
p2., ну да, все это неразрывно связано с изоляцией и тем фактом, что в пг, как и в оракле, используется MVCC. Может потому и медлили в postgres, что хотят учесть эти недостатки.. Я недаром там ссылку дал. Там как раз автор, который пишет/писал патч для пг рассуждает о проблемах. И становится понятно почему мержа до сих пор нету. Он прекрасно понимает, что в случае, который описал я, хотелось бы обойтись без эксепшенов, но это очень частный случай мержа — фактически это банальный UPSERT. Оператор же MERGE куда более развесист и изначально несет в себе много всяких краевых случаев, которые всплывают в ходе реализации. При этом эти случаи принципиально неустранимы и чем-то придется жертвовать, идти на компромисс. Поиск этих компромиссов и есть та самая сложность, которая отделяет нас от наличия апсерта/мержа в постгресе. дык, типовая реализация с обработкой ексепшена на коленке валяется в пжшной доке с 8.0 Если она такая типовая, то пусть будет оператор, не так ли? Сразу отвечу: нет, потому что все сложно (см. выше). Мне абсолютно понятно, что если руки не из задницы, то проблем не возникнет. Просто иногда хочется писать меньше шаблонного кода, если это возможно и уместно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2015, 18:55 |
|
||
|
Merge в postgres
|
|||
|---|---|---|---|
|
#18+
PCContraМаксим, у меня такой задачи использовать merge не было. Он вообще нужен? нет, не нужен. полно СУБД, где его нет, и ничего. вообще, в стандарте есть три части. entry level, basic and extended. (кажется не напутал) все субд поддерживают entry level, он обязательный. basic можно реализовывать частично, все СУБД так и делают. extended вообще не обязателен. Как правило его не делает никто. Например, там описан язык процедурного расширения SQL, который у каждой СУБД просто свой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2015, 07:23 |
|
||
|
Merge в postgres
|
|||
|---|---|---|---|
|
#18+
Вы не поверите http://www.postgresql.org/docs/devel/static/sql-insert.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.05.2015, 11:54 |
|
||
|
Merge в postgres
|
|||
|---|---|---|---|
|
#18+
Flash GordonВы не поверите http://www.postgresql.org/docs/devel/static/sql-insert.html автор Код: sql 1. ON CONFLICT Clause The optional ON CONFLICT clause specifies an alternative action to raising a unique violation or exclusion constraint violation error. For each individual row proposed for insertion, either the insertion proceeds, or, if a constraint specified by the conflict_target is violated, the alternative conflict_action is taken. conflict_target describes which conflicts are handled by the ON CONFLICT clause. Either a unique index inference clause or an explicitly named constraint can be used. For ON CONFLICT DO NOTHING, it is optional to specify a conflict_target; when omitted, conflicts with all usable constraints (and unique indexes) are handled. For ON CONFLICT DO UPDATE, a conflict target must be specified. Every time an insertion without ON CONFLICT would ordinarily raise an error due to violating one of the inferred (or explicitly named) constraints, a conflict (as in ON CONFLICT) occurs, and the alternative action, as specified by conflict_action is taken. This happens on a row-by-row basis. A unique index inference clause consists of one or more column_name_index columns and/or expression_index expressions, and a optional index_predicate. -- почти идеально. "я почему раньше злой был? -- потомучтаа у меня веласипеда не было" вот только один из вариантов хотелось бы в стиле Код: sql 1. -- [т.е. конфликт с "dirty" блокировками ресурса, а не с за-commit-ченными ONLY] вот тогда б это не лисапед был, а самое что ни на есть востребуемое. (конкурентная блокировка ресурсов без ожиданий) но, навскидку, не нашёл ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.05.2015, 13:17 |
|
||
|
Merge в postgres
|
|||
|---|---|---|---|
|
#18+
Еще хотелось-бы ON CONFLICT несколько раз. Если юник констреинтов больше одного, то конфликты могут быть разные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.05.2015, 17:06 |
|
||
|
Merge в postgres
|
|||
|---|---|---|---|
|
#18+
Во ребята замороченные))) Подавай им MERGE, да ещё чтоб на конкурентных операциях не требовал Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2015, 15:09 |
|
||
|
Merge в postgres
|
|||
|---|---|---|---|
|
#18+
ОКТОГЕНВо ребята замороченные))) Подавай им MERGE, да ещё чтоб на конкурентных операциях не требовал Код: sql 1. ты, дядя, с кем сейчас разговаривал ? -- мне то мерж в принципе не упал, а вот insert no wait [unique|key-fields] без каких либо лишних локов -- был бы желателен. и именно такое расширение этого велосипедика (мерде) -- я бы приветствовал. А вот это всё я и руками могу, хотя и муторно немного. но направление мысли радует. а на случай варстоуна оно ещё и естественно напрашивается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2015, 15:24 |
|
||
|
Merge в postgres
|
|||
|---|---|---|---|
|
#18+
Flash GordonВы не поверите http://www.postgresql.org/docs/devel/static/sql-insert.html для кейсов без констрейнтов не подходит же ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2015, 17:35 |
|
||
|
Merge в postgres
|
|||
|---|---|---|---|
|
#18+
Ivan Durak, ну тут причина в особенностях реализации. А можно привести такой кейс? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2015, 22:48 |
|
||
|
Merge в postgres
|
|||
|---|---|---|---|
|
#18+
Flash GordonIvan Durak, ну тут причина в особенностях реализации. А можно привести такой кейс? легко - мерж в таблицу без констрейнтов. Мерджем можно, инсертом с конфликтом нельзя - конфликтов нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2015, 09:55 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=38955158&tid=1997996]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
194ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
84ms |
get tp. blocked users: |
1ms |
| others: | 247ms |
| total: | 578ms |

| 0 / 0 |
