медленное обновление avail в opds_catalog_book

7 years 1 month ago #1328 by tavx
tavx created the topic: медленное обновление avail в opds_catalog_book
Добрый день.

При сканировании коллекции довольно долго отрабатывает запрос
UPDATE "opds_catalog_book" SET "avail" = 1 WHERE NOT ("opds_catalog_book"."avail" = 0)
. Если смотреть EXPLAIN, то вот что видим, хотя индекс присутствует:
sopds=# EXPLAIN UPDATE "opds_catalog_book" SET "avail" = 1 WHERE NOT ("opds_catalog_book"."avail" = 0);
                                    QUERY PLAN                                    
----------------------------------------------------------------------------------
 Update on opds_catalog_book  (cost=0.00..29132.34 rows=300827 width=190)
   ->  Seq Scan on opds_catalog_book  (cost=0.00..29132.34 rows=300827 width=190)
         Filter: (avail <> 0)
(3 rows)
. А вот вариант без NOT:
sopds=# EXPLAIN UPDATE "opds_catalog_book" SET "avail" = 1 WHERE ("opds_catalog_book"."avail" = 0);
                                                 QUERY PLAN                                                 
------------------------------------------------------------------------------------------------------------
 Update on opds_catalog_book  (cost=0.42..4.44 rows=1 width=190)
   ->  Index Scan using opds_catalog_book_2a63117d on opds_catalog_book  (cost=0.42..4.44 rows=1 width=190)
         Index Cond: (avail = 0)
(3 rows)
Лог postgresql:
2017-03-01 12:51:39 MSK [18617-1594] sopds@sopds LOG:  duration: 3099356.624 ms  statement: UPDATE "opds_catalog_book" SET "avail" = 1 WHERE NOT ("opds_catalog_book"."avail" = 0)

Лог sopds-scanner:
2017-03-01 12:00:00,006 INFO      ***** Starting sopds-scan...
2017-03-01 13:46:15,638 INFO     Skip INPX file = /mnt/ceph/store/books/libs/fb2.Flibusta.Net/flibusta_fb2_local.inpx. Not changed.
2017-03-01 13:46:59,931 INFO     Books added      : 0
2017-03-01 13:46:59,931 INFO     Books skipped    : 0
2017-03-01 13:46:59,931 INFO     Bad books        : 0
2017-03-01 13:46:59,934 INFO     Books DB entries deleted : (0, {})
2017-03-01 13:46:59,934 INFO     Books in archives: 0
2017-03-01 13:46:59,934 INFO     Archives scanned : 0
2017-03-01 13:46:59,934 INFO     Archives skipped : 0
2017-03-01 13:46:59,934 INFO     Bad archives     : 0
2017-03-01 13:46:59,934 INFO     Time estimated:1 hours, 46 minutes, 59 seconds.
Как видно большую часть времени выполняется этот update

Как можно ускорить этот запрос?
Использую Postgresql 9.5 и sopds 0.41.

Please Войти or Create an account to join the conversation.

  • tavx
  • tavx's Avatar Topic Author
  • Offline
  • Новый участник
  • Новый участник
More
7 years 1 month ago - 7 years 1 month ago #1330 by mitshel
mitshel replied the topic: медленное обновление avail в opds_catalog_book
Посмотрел... Действительно есть такая проблема с Postgre. Во втором случае все быстро так как обновилось всего 3 строки а в первом более 300 000. Но в Mysql все занимает секунды...
Видимо это частично связано с транзакционностью БД PostgreSQL и частично с ее архитектурой. Попробую разобраться с этим в ближайшее время. Будут идеи пишите!
Last Edit: 7 years 1 month ago by mitshel.

Please Войти or Create an account to join the conversation.

  • mitshel
  • mitshel's Avatar
  • Offline
  • Администратор
  • Администратор
More
7 years 1 month ago - 7 years 1 month ago #1331 by mitshel
mitshel replied the topic: медленное обновление avail в opds_catalog_book
В общем приблизительно понятно в чем дело. Дейсвительно в Postgre при массовых Update нужно учитывать особенности архитектуры системы. Пока посоветую вручную выполнить следующие модификации в БД:
sopds# alter table opds_catalog_book SET ( fillfactor = 50);
sopds# VACUUM FULL opds_catalog_book;

После такой настройки таблицы opds_catalog_book выполнение найденного вами запроса будет происходить значительно быстрее.
Результат:
2017-03-09 20:28:48,471 INFO     Books added      : 0
2017-03-09 20:28:48,471 INFO     Books skipped    : 6029
2017-03-09 20:28:48,471 INFO     Bad books        : 1
2017-03-09 20:28:48,472 INFO     Books DB entries deleted : (0, {})
2017-03-09 20:28:48,472 INFO     Books in archives: 0
2017-03-09 20:28:48,472 INFO     Archives scanned : 82
2017-03-09 20:28:48,472 INFO     Archives skipped : 116
2017-03-09 20:28:48,472 INFO     Bad archives     : 0
2017-03-09 20:28:48,472 INFO     Time estimated:0 hours, 7 minutes, 51 seconds.
Last Edit: 7 years 1 month ago by mitshel.

Please Войти or Create an account to join the conversation.

  • mitshel
  • mitshel's Avatar
  • Offline
  • Администратор
  • Администратор
More
7 years 1 month ago - 7 years 1 month ago #1334 by tavx
tavx replied the topic: медленное обновление avail в opds_catalog_book
Спасибо за помощь.
2017-03-10 10:40:13 MSK [20999-3] postgres@sopds LOG:  duration: 588496.282 ms  statement: UPDATE "opds_catalog_book" SET "avail" = 1 WHERE NOT ("opds_catalog_book"."avail" = 0);
Скорость выросла больше чем в 5 раз.
Last Edit: 7 years 1 month ago by tavx.

Please Войти or Create an account to join the conversation.

  • tavx
  • tavx's Avatar Topic Author
  • Offline
  • Новый участник
  • Новый участник
More
Time to create page: 0.208 seconds