Как сократить время выполнения запроса, так как время планирования меньше времени выполнения? - PullRequest
0 голосов
/ 14 июня 2019
EXPLAIN ANALYSE
SELECT  "conversations".*
FROM "conversations"
   INNER JOIN "messages"
      ON "messages"."conversation_identifier" = "conversations"."conversation_identifier"
WHERE "conversations"."project_id" = 2
  AND (person_messages_count > 0 and deleted IS NULL)
  AND (conversations.status = 'closed')
  AND ((messages.tsv_message_content)
      @@ (to_tsquery('simple', ''' ' || 'help' || ' ''' || ':*')))
ORDER BY conversations.updated_at DESC LIMIT 30;
                                                                                  QUERY PLAN                                                                                   
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=6895.78..6895.85 rows=30 width=398) (actual time=197364.691..197364.730 rows=30 loops=1)
   ->  Sort  (cost=6895.78..6895.86 rows=34 width=398) (actual time=197364.688..197364.702 rows=30 loops=1)
         Sort Key: conversations.updated_at DESC
         Sort Method: top-N heapsort  Memory: 32kB
         ->  Nested Loop  (cost=1.12..6894.91 rows=34 width=398) (actual time=9.625..197314.491 rows=24971 loops=1)
               ->  Index Scan using indexing_by_conversations_status on conversations  (cost=0.56..704.27 rows=64 width=398) (actual time=2.832..14181.496 rows=25362 loops=1)
                     Index Cond: ((project_id = 2) AND (person_messages_count > 0) AND (deleted IS NULL) AND ((status)::text = 'closed'::text))
               ->  Index Scan using index_messages_on_conversation_identifier on messages  (cost=0.56..96.63 rows=10 width=46) (actual time=3.709..7.217 rows=1 loops=25362)
                     Index Cond: ((conversation_identifier)::text = (conversations.conversation_identifier)::text)
                     Filter: (tsv_message_content @@ '''help'':*'::tsquery)
                     Rows Removed by Filter: 15
 Planning time: 46.814 ms
 Execution time: 197366.064 ms

Кажется, что время планирования меньше фактического времени выполнения.Есть ли способ сократить время выполнения?

1 Ответ

1 голос
/ 14 июня 2019

У вас есть две проблемы:

  1. Оценки по conversations крайне неверны:

    ANALYZE conversations;
    
  2. Вы должны проиндексировать условие выборочного полнотекстового поиска:

    CREATE INDEX ON messages USING gin (tsv_message_content);
    

Если ANALYZE (даже с поднятым default_statistics_target) не улучшает неправильную оценку, это, вероятно, вызвано корреляцией между столбцами. Попробуйте расширенную статистику, чтобы улучшить это:

CREATE STATISTICS conversations_stats (dependencies)
   ON project_id, deleted, status FROM conversations;

Последующее ANALYZE должно улучшить оценку.

...