ON CASCADE DELETE для небольших операций, но плохо работает для больших.Чтобы понять, почему мы должны смотреть на то, что происходит за кулисами: на PostgreSQL мы используем триггеры.
Так что, если мы удаляем из родительской таблицы, для каждой удаляемой строки она идет и удаляется на дочернемстол тоже.Это происходит для каждой удаленной строки.Теперь обратите внимание, что последовательные сканирования в PostgreSQL относительно дешевы, поэтому вы можете форсировать большое количество сканирований индекса, когда одно последовательное сканирование будет намного быстрее.
Итак, предположим, что в таблице 1 мы удаляем 1000 записейи это означает, что в таблице 2 мы удаляем 10000 записей.Если мы делаем это правильно, мы идем и удаляем из таблицы 2, выполняя один просмотр , чтобы сделать это.Может потребоваться несколько секунд на хорошем оборудовании.Затем мы идем и удаляем из родительской записи, и это быстро.Хорошо, верно?
Теперь предположим, что мы используем триггеры для удаления .....
Сканирование по таблице 1, для каждой из 1000 строк, которые мы удаляем, сканирование по индексу таблицы 2,удалить 10 строк, перейти к следующему.Мы полностью теряем любую помощь, которую можем получить от процедур предварительной выборки ОС, и заменяем много избыточных, случайных чтений страниц гораздо меньшим числом последовательных чтений.Сейчас мы тратим много времени на ожидание поворота дисковых дисков и движения головок.Ой ......
Триггеры ON DELETE CASCADE имеют свое место.Они отлично работают, если мы просто удаляем несколько записей.Но они очень быстро распадаются на массовые удаления.Оберните все свои удаления в транзакции и сначала удалите из дочерних таблиц, и это будет намного быстрее.