Size: a a a

pgsql – PostgreSQL

2020 July 17

YS

Yaroslav Schekin in pgsql – PostgreSQL
A V
всем привет, как быть - медленно отрабатывает запрос COPY. Прямо очень долго (внутри достаточно большой запрос на извлечение данных из 5 таблиц)
в итоге может висеть по несколько часов
Так Вы разберитесь, в какой части дело — в запросе внутри, или в выводе, или в записи (передаче по сети), для начала.
источник

AS

Alexey Smirnov in pgsql – PostgreSQL
Не тот же индекс...
источник

AS

Alexey Smirnov in pgsql – PostgreSQL
->  Index Scan using "IX_Message_Subject" on "Message" m  (cost=0.55..295415.15 rows=200 width=51)
источник

AS

Alexey Smirnov in pgsql – PostgreSQL
Ощущение, что подставляет какие-то магические 200 туда, нет?
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Alexey Smirnov
Не тот же индекс...
Не имеет значения. А если поднять stats.target по полю Subject до максимума (просто чтоб "не думать"), сделать ANALYZE, потом посмотреть план — что-то изменится?
источник

AS

Alexey Smirnov in pgsql – PostgreSQL
Уже 10000
источник

AS

Alexey Smirnov in pgsql – PostgreSQL
Было rows=201 до этого
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Alexey Smirnov
Уже 10000
И после того, как изменили, ANALYZE был выполнен?
источник

AS

Alexey Smirnov in pgsql – PostgreSQL
Да
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Alexey Smirnov
"Bitmap Heap Scan on "Message" m  (cost=165.55..935.56 rows=200 width=254)"
"  Recheck Cond: (("Subject")::text * '%55681%'::text)"
"  ->  Bitmap Index Scan on trgm_idx_message_subject  (cost=0.00..165.50 rows=200 width=0)"
"        Index Cond: (("Subject")::text * '%55681%'::text)"
vs
60
в каунте
Подождите. У Вас в показанных ранее планах оценка стоимости для той же структуры выше:
                    ->  Bitmap Heap Scan on "Message" m  (cost=2053.55..2823.56 rows=200 width=51) (actual time=4.596..4.717 rows=60 loops=1)
                         Recheck Cond: (("Subject")::text ~~* '%55681%'::text)
                         Rows Removed by Index Recheck: 3
                         Heap Blocks: exact=62
                         Buffers: shared hit=583 read=10
                         I/O Timings: read=0.845
                         ->  Bitmap Index Scan on trgm_idx_message_subject  (cost=0.00..2053.50 rows=200 width=0) (actual time=4.581..4.581 rows=63 loops=1)
                               Index Cond: (("Subject")::text ~~* '%55681%'::text)
                               Buffers: shared hit=521 read=10
                               I/O Timings: read=0.845

Вы ничего не меняли после того, как сделали эти EXPLAIN-ы?
источник

AS

Alexey Smirnov in pgsql – PostgreSQL
Данные-то могли поменяться незначительно. Там сейчас тесты идут Больше ничего
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Alexey Smirnov
Данные-то могли поменяться незначительно. Там сейчас тесты идут Больше ничего
А оценка стоимости поменялась очень сильно — настолько, что просто нельзя сравнивать.
Интересно, почему. Покажите всё же \d+ messages."Message" (а не эту пургу с CREATE TABLE из неведомого клиента, а то мало ли...). ;)
источник

AS

Alexey Smirnov in pgsql – PostgreSQL
Yaroslav Schekin
А оценка стоимости поменялась очень сильно — настолько, что просто нельзя сравнивать.
Интересно, почему. Покажите всё же \d+ messages."Message" (а не эту пургу с CREATE TABLE из неведомого клиента, а то мало ли...). ;)
Table "messages.Message"
    Column     |            Type             | Collation | Nullable |                      Default
----------------+-----------------------------+-----------+----------+----------------------------------------------------
Id             | uuid                        |           | not null |
Content        | text                        |           |          |
ThreadId       | uuid                        |           | not null |
CreatedOn      | timestamp without time zone |           | not null | '0001-01-01 00:00:00'::timestamp without time zone
UpdatedOn      | timestamp without time zone |           | not null | '0001-01-01 00:00:00'::timestamp without time zone
Subject        | character varying(256)      |           |          |
ContentHistory | text                        |           |          |
ThreadEventId  | uuid                        |           | not null | '00000000-0000-0000-0000-000000000000'::uuid
MessageBodyId  | uuid                        |           |          |
Indexes:
   "PK_Message" PRIMARY KEY, btree ("Id")
   "IX_Message_MessageBodyId" UNIQUE, btree ("MessageBodyId")
   "IX_Message_ThreadEventId" UNIQUE, btree ("ThreadEventId")
   "IX_Message_Subject" btree ("Subject")
   "IX_Message_ThreadId" btree ("ThreadId")
   "trgm_idx_message_subject" gin ("Subject" gin_trgm_ops)
Foreign-key constraints:
   "FK_Message_MessageBody_MessageBodyId" FOREIGN KEY ("MessageBodyId") REFERENCES messages."MessageBody"("Id") ON DELETE RESTRICT
   "FK_Message_ThreadEvent_ThreadEventId" FOREIGN KEY ("ThreadEventId") REFERENCES messages."ThreadEvent"("Id") ON DELETE CASCADE
   "FK_Message_Thread_ThreadId" FOREIGN KEY ("ThreadId") REFERENCES messages."Thread"("Id") ON DELETE CASCADE
Referenced by:
   TABLE "messages."Attachment"" CONSTRAINT "FK_Attachment_Message_MessageId" FOREIGN KEY ("MessageId") REFERENCES messages."Message"("Id") ON DELETE CASCADE
   TABLE "messages."MessageContact"" CONSTRAINT "FK_MessageContact_Message_MessageId" FOREIGN KEY ("MessageId") REFERENCES messages."Message"("Id") ON DELETE CASCADE
   TABLE "messages."MessageEmail"" CONSTRAINT "FK_MessageEmail_Message_Id" FOREIGN KEY ("Id") REFERENCES messages."Message"("Id") ON DELETE CASCADE
   TABLE "messages."ThreadLastAddedMessage"" CONSTRAINT "FK_ThreadLastAddedMessage_Message_LastMessageId" FOREIGN KEY ("LastMessageId") REFERENCES messages."Message"("Id") ON DELETE CASCADE
   TABLE "messages."ThreadReadByUser"" CONSTRAINT "FK_ThreadReadByUser_Message_LastReadMessageId" FOREIGN KEY ("LastReadMessageId") REFERENCES messages."Message"("Id") ON DELETE CASCADE
   TABLE "messages."UnsupportedAttachment"" CONSTRAINT "FK_UnsupportedAttachment_Message_MessageId" FOREIGN KEY ("MessageId") REFERENCES messages."Message"("Id") ON DELETE CASCADE
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Alexey Smirnov
Table "messages.Message"
    Column     |            Type             | Collation | Nullable |                      Default
----------------+-----------------------------+-----------+----------+----------------------------------------------------
Id             | uuid                        |           | not null |
Content        | text                        |           |          |
ThreadId       | uuid                        |           | not null |
CreatedOn      | timestamp without time zone |           | not null | '0001-01-01 00:00:00'::timestamp without time zone
UpdatedOn      | timestamp without time zone |           | not null | '0001-01-01 00:00:00'::timestamp without time zone
Subject        | character varying(256)      |           |          |
ContentHistory | text                        |           |          |
ThreadEventId  | uuid                        |           | not null | '00000000-0000-0000-0000-000000000000'::uuid
MessageBodyId  | uuid                        |           |          |
Indexes:
   "PK_Message" PRIMARY KEY, btree ("Id")
   "IX_Message_MessageBodyId" UNIQUE, btree ("MessageBodyId")
   "IX_Message_ThreadEventId" UNIQUE, btree ("ThreadEventId")
   "IX_Message_Subject" btree ("Subject")
   "IX_Message_ThreadId" btree ("ThreadId")
   "trgm_idx_message_subject" gin ("Subject" gin_trgm_ops)
Foreign-key constraints:
   "FK_Message_MessageBody_MessageBodyId" FOREIGN KEY ("MessageBodyId") REFERENCES messages."MessageBody"("Id") ON DELETE RESTRICT
   "FK_Message_ThreadEvent_ThreadEventId" FOREIGN KEY ("ThreadEventId") REFERENCES messages."ThreadEvent"("Id") ON DELETE CASCADE
   "FK_Message_Thread_ThreadId" FOREIGN KEY ("ThreadId") REFERENCES messages."Thread"("Id") ON DELETE CASCADE
Referenced by:
   TABLE "messages."Attachment"" CONSTRAINT "FK_Attachment_Message_MessageId" FOREIGN KEY ("MessageId") REFERENCES messages."Message"("Id") ON DELETE CASCADE
   TABLE "messages."MessageContact"" CONSTRAINT "FK_MessageContact_Message_MessageId" FOREIGN KEY ("MessageId") REFERENCES messages."Message"("Id") ON DELETE CASCADE
   TABLE "messages."MessageEmail"" CONSTRAINT "FK_MessageEmail_Message_Id" FOREIGN KEY ("Id") REFERENCES messages."Message"("Id") ON DELETE CASCADE
   TABLE "messages."ThreadLastAddedMessage"" CONSTRAINT "FK_ThreadLastAddedMessage_Message_LastMessageId" FOREIGN KEY ("LastMessageId") REFERENCES messages."Message"("Id") ON DELETE CASCADE
   TABLE "messages."ThreadReadByUser"" CONSTRAINT "FK_ThreadReadByUser_Message_LastReadMessageId" FOREIGN KEY ("LastReadMessageId") REFERENCES messages."Message"("Id") ON DELETE CASCADE
   TABLE "messages."UnsupportedAttachment"" CONSTRAINT "FK_UnsupportedAttachment_Message_MessageId" FOREIGN KEY ("MessageId") REFERENCES messages."Message"("Id") ON DELETE CASCADE
\d+
источник

AS

Alexey Smirnov in pgsql – PostgreSQL
Yaroslav Schekin
\d+
Сори
                                                                    Table "messages.Message"
    Column     |            Type             | Collation | Nullable |                      Default                       | Storage  | Stats target | Description
----------------+-----------------------------+-----------+----------+----------------------------------------------------+----------+--------------+-------------
Id             | uuid                        |           | not null |                                                    | plain    |              |
Content        | text                        |           |          |                                                    | extended |              |
ThreadId       | uuid                        |           | not null |                                                    | plain    |              |
CreatedOn      | timestamp without time zone |           | not null | '0001-01-01 00:00:00'::timestamp without time zone | plain    |              |
UpdatedOn      | timestamp without time zone |           | not null | '0001-01-01 00:00:00'::timestamp without time zone | plain    |              |
Subject        | character varying(256)      |           |          |                                                    | extended | 10000        |
ContentHistory | text                        |           |          |                                                    | extended |              |
ThreadEventId  | uuid                        |           | not null | '00000000-0000-0000-0000-000000000000'::uuid       | plain    |              |
MessageBodyId  | uuid                        |           |          |                                                    | plain    |              |
Indexes:
   "PK_Message" PRIMARY KEY, btree ("Id")
   "IX_Message_MessageBodyId" UNIQUE, btree ("MessageBodyId")
   "IX_Message_ThreadEventId" UNIQUE, btree ("ThreadEventId")
   "IX_Message_Subject" btree ("Subject")
   "IX_Message_ThreadId" btree ("ThreadId")
   "trgm_idx_message_subject" gin ("Subject" gin_trgm_ops)
Foreign-key constraints:
   "FK_Message_MessageBody_MessageBodyId" FOREIGN KEY ("MessageBodyId") REFERENCES messages."MessageBody"("Id") ON DELETE RESTRICT
   "FK_Message_ThreadEvent_ThreadEventId" FOREIGN KEY ("ThreadEventId") REFERENCES messages."ThreadEvent"("Id") ON DELETE CASCADE
   "FK_Message_Thread_ThreadId" FOREIGN KEY ("ThreadId") REFERENCES messages."Thread"("Id") ON DELETE CASCADE
Referenced by:
   TABLE "messages."Attachment"" CONSTRAINT "FK_Attachment_Message_MessageId" FOREIGN KEY ("MessageId") REFERENCES messages."Message"("Id") ON DELETE CASCADE
   TABLE "messages."MessageContact"" CONSTRAINT "FK_MessageContact_Message_MessageId" FOREIGN KEY ("MessageId") REFERENCES messages."Message"("Id") ON DELETE CASCADE
   TABLE "messages."MessageEmail"" CONSTRAINT "FK_MessageEmail_Message_Id" FOREIGN KEY ("Id") REFERENCES messages."Message"("Id") ON DELETE CASCADE
   TABLE "messages."ThreadLastAddedMessage"" CONSTRAINT "FK_ThreadLastAddedMessage_Message_LastMessageId" FOREIGN KEY ("LastMessageId") REFERENCES messages."Message"("Id") ON DELETE CASCADE
   TABLE "messages."ThreadReadByUser"" CONSTRAINT "FK_ThreadReadByUser_Message_LastReadMessageId" FOREIGN KEY ("LastReadMessageId") REFERENCES messages."Message"("Id") ON DELETE CASCADE
   TABLE "messages."UnsupportedAttachment"" CONSTRAINT "FK_UnsupportedAttachment_Message_MessageId" FOREIGN KEY ("MessageId") REFERENCES messages."Message"("Id") ON DELETE CASCADE
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Alexey Smirnov
Сори
                                                                    Table "messages.Message"
    Column     |            Type             | Collation | Nullable |                      Default                       | Storage  | Stats target | Description
----------------+-----------------------------+-----------+----------+----------------------------------------------------+----------+--------------+-------------
Id             | uuid                        |           | not null |                                                    | plain    |              |
Content        | text                        |           |          |                                                    | extended |              |
ThreadId       | uuid                        |           | not null |                                                    | plain    |              |
CreatedOn      | timestamp without time zone |           | not null | '0001-01-01 00:00:00'::timestamp without time zone | plain    |              |
UpdatedOn      | timestamp without time zone |           | not null | '0001-01-01 00:00:00'::timestamp without time zone | plain    |              |
Subject        | character varying(256)      |           |          |                                                    | extended | 10000        |
ContentHistory | text                        |           |          |                                                    | extended |              |
ThreadEventId  | uuid                        |           | not null | '00000000-0000-0000-0000-000000000000'::uuid       | plain    |              |
MessageBodyId  | uuid                        |           |          |                                                    | plain    |              |
Indexes:
   "PK_Message" PRIMARY KEY, btree ("Id")
   "IX_Message_MessageBodyId" UNIQUE, btree ("MessageBodyId")
   "IX_Message_ThreadEventId" UNIQUE, btree ("ThreadEventId")
   "IX_Message_Subject" btree ("Subject")
   "IX_Message_ThreadId" btree ("ThreadId")
   "trgm_idx_message_subject" gin ("Subject" gin_trgm_ops)
Foreign-key constraints:
   "FK_Message_MessageBody_MessageBodyId" FOREIGN KEY ("MessageBodyId") REFERENCES messages."MessageBody"("Id") ON DELETE RESTRICT
   "FK_Message_ThreadEvent_ThreadEventId" FOREIGN KEY ("ThreadEventId") REFERENCES messages."ThreadEvent"("Id") ON DELETE CASCADE
   "FK_Message_Thread_ThreadId" FOREIGN KEY ("ThreadId") REFERENCES messages."Thread"("Id") ON DELETE CASCADE
Referenced by:
   TABLE "messages."Attachment"" CONSTRAINT "FK_Attachment_Message_MessageId" FOREIGN KEY ("MessageId") REFERENCES messages."Message"("Id") ON DELETE CASCADE
   TABLE "messages."MessageContact"" CONSTRAINT "FK_MessageContact_Message_MessageId" FOREIGN KEY ("MessageId") REFERENCES messages."Message"("Id") ON DELETE CASCADE
   TABLE "messages."MessageEmail"" CONSTRAINT "FK_MessageEmail_Message_Id" FOREIGN KEY ("Id") REFERENCES messages."Message"("Id") ON DELETE CASCADE
   TABLE "messages."ThreadLastAddedMessage"" CONSTRAINT "FK_ThreadLastAddedMessage_Message_LastMessageId" FOREIGN KEY ("LastMessageId") REFERENCES messages."Message"("Id") ON DELETE CASCADE
   TABLE "messages."ThreadReadByUser"" CONSTRAINT "FK_ThreadReadByUser_Message_LastReadMessageId" FOREIGN KEY ("LastReadMessageId") REFERENCES messages."Message"("Id") ON DELETE CASCADE
   TABLE "messages."UnsupportedAttachment"" CONSTRAINT "FK_UnsupportedAttachment_Message_MessageId" FOREIGN KEY ("MessageId") REFERENCES messages."Message"("Id") ON DELETE CASCADE
И да, всё соответствует, вроде, Stats target установлен...
Ну а если просто повторить EXPLAIN-ы (без ANALYZE)... и кстати, а без LIMIT вообще они какие будут?
Я имею в виду оригинальный запрос с LIMIT 4, LIMIT 50 и без LIMIT вообще; и вот этот https://t.me/pgsql/238884
источник

N

Nikita in pgsql – PostgreSQL
🐨 Всем дратути!
источник

AS

Alexey Smirnov in pgsql – PostgreSQL
Yaroslav Schekin
И да, всё соответствует, вроде, Stats target установлен...
Ну а если просто повторить EXPLAIN-ы (без ANALYZE)... и кстати, а без LIMIT вообще они какие будут?
Я имею в виду оригинальный запрос с LIMIT 4, LIMIT 50 и без LIMIT вообще; и вот этот https://t.me/pgsql/238884
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Спасибо, сейчас посмотрю.
источник

AS

Alexey Smirnov in pgsql – PostgreSQL
Yaroslav Schekin
И да, всё соответствует, вроде, Stats target установлен...
Ну а если просто повторить EXPLAIN-ы (без ANALYZE)... и кстати, а без LIMIT вообще они какие будут?
Я имею в виду оригинальный запрос с LIMIT 4, LIMIT 50 и без LIMIT вообще; и вот этот https://t.me/pgsql/238884
И эстимейт
https://explain.depesz.com/s/8RKo
Каунт все так же 60
источник