Падение производительности каскадного удаления на больших наборах данных, может ли это быть вызвано отсутствием индексации?

Я пишу код, который должен каскадно удалять записи в определенной базе данных, и я заметил падение производительности, поскольку в базе данных больше записей. Когда я просто заполняю базу данных, не кажется, что есть большое падение производительности между началом заполнения и прямо в конце, но когда я выполняю каскадное удаление, производительность снижается с большей базой данных. Я предполагаю, что для каскада потребуется выполнить множество соединений, чтобы найти все связанные записи в других таблицах, что замедляет работу с большими наборами данных. Но когда я просто добавляю запись, не нужно ли также проверять уже существующие первичные ключи и другие уникальные ограничения, и не должно ли это также быть медленнее в больших наборах данных, или это так невероятно быстро по сравнению с процессом удаления что трудно заметить падение производительности, когда вы просто заполняете базу данных? Или каскады просто медленные, потому что я специально не индексировал таблицы, на которые он каскадируется?

Итак, во-вторых, будет ли индексация каскадных таблиц ускорять каскадирование, если эти таблицы уже имеют сгенерированный идентификатор в качестве первичного ключа? В более общем смысле: автоматически ли индексируются первичные ключи?


person Erik Stens    schedule 01.11.2010    source источник
comment
Как вы каскадно удаляете? Используя Hibernate .delete(), какой-нибудь HQL? Прямой SQL через JDBC?   -  person Martijn Verburg    schedule 01.11.2010
comment
Hibernate .delete(), используя cascade = CascadeType.ALL в аннотациях hibernate для полей в модели домена, которые я удаляю каскадно.   -  person Erik Stens    schedule 01.11.2010


Ответы (1)


Я предполагаю, что для каскада потребуется выполнить множество соединений, чтобы найти все связанные записи в других таблицах, что замедляет работу с большими наборами данных.

Не предполагай. Включите журналирование Hibernate (в частности, регистратор для org.hibernate.SQL), чтобы увидеть точно, какие операторы SQL выполняет Hibernate. Затем принимайте решения и действуйте на основе фактов, а не предположений.

В более общем смысле: автоматически ли индексируются первичные ключи?

да.

person matt b    schedule 01.11.2010
comment
Хорошо, вы совершенно правы, извините за предположение :$ Наверное, я просто был ленив. Я проверил журналы гибернации, и действительно, он показывает много-много соединений, чтобы сначала восстановить связанные объекты домена, а затем один за другим удалить их. И ко второму ответу: спасибо, у меня уже были подозрения, потому что замедление, казалось, имело отношение примерно к log(n), но это подтверждает его. (Я знаю, что это не черно-белое, но, как я уже сказал: примерно) - person Erik Stens; 01.11.2010