Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Work on batch insertion of data into the database #43

Open
dmitry-weirdo opened this issue Dec 31, 2020 · 2 comments
Open

Work on batch insertion of data into the database #43

dmitry-weirdo opened this issue Dec 31, 2020 · 2 comments

Comments

@dmitry-weirdo
Copy link
Collaborator

dmitry-weirdo commented Dec 31, 2020

Для #19 вроде бы установлен батчевый insert согласно https://www.baeldung.com/spring-data-jpa-batch-inserts, все строки статистики одного игрока вставляются через CrudRepository#saveAll.

Тем не менее, всё равно вставка данных 628000 пользователей занимает значительное время (много часов). Если бы инсёрт был полностью батчевым (как при восстановлении батча базы, будто мы сгенерировали все insert into, а потом запустили их. Можно вручную создавать id или вообще использовать playerId и gametype.info.id в качестве айдишников), он был бы точно намного быстрей.

@dmitry-weirdo
Copy link
Collaborator Author

dmitry-weirdo commented Dec 31, 2020

похоже, что решение было найдено вот здесь — https://stackoverflow.com/a/3420303/8534088. Батчевая предвыборка из sequence позволила феерически снизить количество запросов к sequence (инсёрты уже честно батчились согласно настройке и до этого):

Следующие сводки на 1000 юзерах + 2492 voc_stats для этих юзеров.
До фикса:

    45523700 nanoseconds spent acquiring 3493 JDBC connections;
    54511500 nanoseconds spent releasing 3492 JDBC connections;
    408933300 nanoseconds spent preparing 6987 JDBC statements;
    11319122000 nanoseconds spent executing 6984 JDBC statements;
    612402400 nanoseconds spent executing 3 JDBC batches;
    0 nanoseconds spent performing 0 L2C puts;
    0 nanoseconds spent performing 0 L2C hits;
    0 nanoseconds spent performing 0 L2C misses;
    2214156200 nanoseconds spent executing 1 flushes (flushing a total of 3492 entities and 1000 collections);
    0 nanoseconds spent executing 0 partial-flushes (flushing a total of 0 entities and 0 collections)

После фикса:

    2458000 nanoseconds spent acquiring 7 JDBC connections;
    184700 nanoseconds spent releasing 6 JDBC connections;
    10366500 nanoseconds spent preparing 15 JDBC statements;
    41106000 nanoseconds spent executing 12 JDBC statements;
    648041200 nanoseconds spent executing 3 JDBC batches;
    0 nanoseconds spent performing 0 L2C puts;
    0 nanoseconds spent performing 0 L2C hits;
    0 nanoseconds spent performing 0 L2C misses;
    2216762100 nanoseconds spent executing 1 flushes (flushing a total of 3492 entities and 1000 collections);

Показ этой статистики включается настройкой

spring.jpa.properties.hibernate.generate_statistics=true

@dmitry-weirdo
Copy link
Collaborator Author

Вроде бы уже давно данные вставляюся батчами (по 100? записей).

Мне кажется, эта задача сделана, и её можно закрывать.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant