Re: FOR EACH ROW triggers on partitioned tables
От | Alvaro Herrera |
---|---|
Тема | Re: FOR EACH ROW triggers on partitioned tables |
Дата | |
Msg-id | 20180222235212.qcdznloyxepn2be3@alvherre.pgsql обсуждение исходный текст |
Ответ на | Re: FOR EACH ROW triggers on partitioned tables (Alvaro Herrera <alvherre@alvh.no-ip.org>) |
Ответы |
Re: FOR EACH ROW triggers on partitioned tables
Re: FOR EACH ROW triggers on partitioned tables |
Список | pgsql-hackers |
Alvaro Herrera wrote: > Another option is to rethink this feature from the ground up: instead of > cloning catalog rows for each children, maybe we should have the trigger > lookup code, when running DML on the child relation (the partition), > obtain trigger entries not only for the child relation itself but also > for its parents recursively -- so triggers defined in the parent are > fired for the partitions, too. I have written this, and it seems to work fine; it's attached. Generally speaking, I like this better than my previously proposed patch: having duplicate pg_trigger rows seems lame, in hindsight. I haven't measured the performance loss, but we now scan pg_inherits each time we build a relcache entry and relhastriggers=on. Can't be good. In general, the pg_inherits stuff looks generally unnatural -- manually doing scans upwards (find parents) and downwards (find partitions). It's messy and there are no nice abstractions. Partitioning looks too much bolted-on still. We could mitigate the performance loss to some extent by adding more to RelationData. For example, a "is_partition" boolean would help: skip searching pg_inherits for a relation that is not a partition. The indexing patch already added some "has_superclass()" calls and they look somewhat out of place. Also, we could add a syscache to pg_inherits. Regarding making partitioning feel more natural, we could add some API "list all ancestors", "list all descendents". Maybe I should have used find_inheritance_children. Some cutesy: scanning multiple parents looking for potential triggers means the order of indexscan results no longer guarantees the correct ordering. I had to add a qsort() there. -- Álvaro Herrera https://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
Вложения
В списке pgsql-hackers по дате отправления: