Некоторое время назад у меня была проблема с производительностью базы данных для вставки/обновления нескольких миллионов записей с использованием jdbc
. Чтобы повысить производительность, я изменил код, чтобы использовать batch
. Тогда я решил помониторить код с помощью jprofiler
, чтобы узнать, насколько увеличилась производительность... а между тем при мониторинге я обнаружил странную вещь!
Как видно из приведенного выше снимка экрана, создание нового идентификатора из последовательности происходит очень медленно. Скриншот настолько нагляден, что я должен сказать, что вторая строка — это запрос inner join
к таблице с ~8 миллионами записей с самим собой и некоторыми вычислениями (сравните его время со временем третьего запроса!).
Я спросил о проблеме у нашего администратора баз данных, и он сказал что-то о рекомендации оракула для кэширования последовательностей, но когда я проверил последовательность, я увидел, что она уже кэширована.
CREATE SEQUENCE "XXXXXXXXXXXX_ID_SEQ" MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE;
Любая мысль?
p.s. Я думаю, что Hibenate
использует последовательности для вставки записей аналогичным образом, и на самом деле я ищу лучшие практики использования последовательностей для повышения производительности нашего проекта, использующего спящий режим. Вышеупомянутая задача jdbc завершена.
insert
вместо того, чтобы извлекать ее в отдельной операции (например, вызывать процедуру, которая выполняет всю обработку базы данных и возвращает сгенерированный идентификатор). Начиная с Oracle 12c, вы можете начать использовать столбцы идентификаторов и забыть обо всем этом микроуправлении последовательностями. - person William Robertson   schedule 06.01.2019String +=
вместо использованияStringBuilder
илиStringBuffer
! Если да, то вы знаете, что происходит. - person faghani   schedule 06.01.2019@GeneratedValue
+@SequenceGenerator
. Если да, то несложно ускорить этот код в 50 раз. - person krokodilko   schedule 06.01.2019CACHE
с 20 до, скажем, 1000. Если вы можете легко попробовать это и сообщить о результатах, я уверен, что многие мы сочтем, что это полезная информация. - person mathguy   schedule 06.01.2019