Hi > > I understand about having to deal with a bad design. How big is the table > "select pg_size_pretty(pg_table_size(table_name)).? If the table is not > that large relative to the IOPS on your disk system, another solution is to > add a binary column IS_DELETED to the table and modify the queries that hit > the table to exclude rows where IS_DELETED=y. Also you need an index on > this column. I did this with a user table that was a parent table to 120 > data tables and users could not be dropped from the system.
On Mon, Sep 3, 2018 at 7:19 AM Mariel Cherkassky < mariel.cherkas...@gmail.com> wrote: > I'm not responsible for this design but I'm trying to improve it. Using > partition isnt an option because partitions doesnt support foreign key. > Moreover, most queries on all those tables uses the id col of the main > table. > > בתאריך יום ב׳, 3 בספט׳ 2018 ב-14:09 מאת Carrie Berlin < > berlincar...@gmail.com>: > >> This is a terribley inflexible design, why so many foreign keys? If the >> table requires removing data, rebuild with partitions. Parent keys should >> be in reference tables, not in fact table. >> >> On Mon, Sep 3, 2018 at 04:51 Mariel Cherkassky < >> mariel.cherkas...@gmail.com> wrote: >> >>> Cant drop foreign keys, there are too much. >>> >>> בתאריך יום ב׳, 3 בספט׳ 2018 ב-11:35 מאת Sergei Kornilov < >>> s...@zsrv.org>: >>> >>>> Hello >>>> >>>> > Delete on my_table (cost=0.00..65183.30 rows=1573862 width=6) >>>> (actual time=5121.344..5121.344 rows=0 loops=1) >>>> > -> Seq Scan on my_table (cost=0.00..65183.30 rows=1573862 >>>> width=6) (actual time=0.012..2244.393 rows=1572864 loops=1) >>>> > Filter: ((end_date <= to_date('12/12/2018'::text, >>>> 'DD/MM/YYYY'::text)) AND (end_date > to_date('11/12/2018'::text, >>>> 'DD/MM/YYYY'::text))) >>>> > Rows Removed by Filter: 40253 >>>> > Planning time: 0.210 ms >>>> > Trigger for constraint table1: time=14730.816 calls=1572864 >>>> > Trigger for constraint table2: time=30718.084 calls=1572864 >>>> > Trigger for constraint table3: time=28170.363 calls=1572864 >>>> > Trigger for constraint table4: time=29573.681 calls=1572864 >>>> > Trigger for constraint table5: time=29629.263 calls=1572864 >>>> > Trigger for constraint table6: time=29628.489 calls=1572864 >>>> > Trigger for constraint table7: time=29798.121 calls=1572864 >>>> > Trigger for constraint table8: time=29645.705 calls=1572864 >>>> > Trigger for constraint table9: time=29657.177 calls=1572864 >>>> > Trigger for constraint table10: time=29487.054 calls=1572864 >>>> > Trigger for constraint table11: time=30010.978 calls=1572864 >>>> > Trigger for constraint table12: time=26383.924 calls=1572864 >>>> > Execution time: 350603.047 ms >>>> >>>> As you can see in "actual time" - delete was run only 5 sec. All the >>>> other time postgresql checked foreign keys triggers. 0,02ms per row seems >>>> adequate for index lookup. >>>> It may be better drop foreign keys, delete data, and create foreign >>>> keys back. >>>> >>>> regards, Sergei >>>> >>>