Почему индекс увеличивает время выполнения в postgres? - PullRequest
0 голосов
/ 25 февраля 2019

Я создал индекс для поля 'workflow.status', но почему после создания индекса время выполнения запроса увеличивается?

Запрос:

select workflow.* from 
    ( 
        SELECT  CASE 
    WHEN cert.value = 'true' THEN 0 
    ELSE 1 END lawAndOrder, workflow.*  
    FROM testdb.statuschanges hist, testdb.usercerts cert, testdb.workflow 
    WHERE workflow.taskid = hist.taskid AND hist.username = cert.username  AND cert.projectname = 'Core_EECA_RUS_2018_shp_UPDGeo_LL'  AND cert.key = 'DISABLECOMMIT' 
    AND hist.statuschangeid =workflow.proposedstatuschangeid AND workflow.status in ('Check')and workflow.projectname = 'Core_EECA_RUS_2018_shp_UPDGeo_LL'  AND workflow.claimedby IS NULL
    UNION 
    SELECT CASE
    WHEN workflow.status = 'INProgress' THEN 1
    WHEN workflow.status = 'Feedback' THEN 2 
    WHEN workflow.status not     in ('Check', 'INProgress', 'Feedback') THEN 3 
    END lawAndOrder,workflow.*  
    FROM testdb.workflow  
    WHERE       workflow.status != 'Check' AND       workflow.claimedby IS NULL  AND workflow.projectname = 'Core_EECA_RUS_2018_shp_UPDGeo_LL'  order by lawAndOrder ASC, TaskId
    ) 
    workflow WHERE ProjectName = 'Core_EECA_RUS_2018_shp_UPDGeo_LL'  AND
    Status IN  ('SourcedFromGuidedCommunity', 'NeedsWorkInTIF', 'NeedsFieldCollection', 'INProgress', 'Completed', 'Check', 'New', 'Reject', 'In Testing', 'Check Reject', 'Check Accept with minor remark', 'InQA', 'Rework', 'Feedback') 
    AND ClaimedBy IS NULL

Индексоператор создания:

CREATE INDEX idx_workflow_status
  ON testdb.workflow
  USING btree
  (status COLLATE pg_catalog."default");

Возможно ли увеличение индекса времени?

1 Ответ

0 голосов
/ 25 февраля 2019

В этом ответе пропущены некоторые особенности, но он в целом применим.

При планировании запроса Postgres будет рассматривать каждый потенциально соответствующий индекс.Затем он либо выберет то, что кажется наиболее подходящим индексом для запроса, либо решит вообще не использовать индекс, если ни один из релевантных индексов не окажется подходящим вообще.

Если запрос уже используетиндекс, и вы создаете менее подходящий индекс, или если запрос не использует индекс, и вы создаете неподходящий индекс;Postgres потребуется больше времени для планирования запроса, поскольку теперь у него есть другой индексный файл, который он должен просмотреть и сравнить с другими потенциальными планами запросов.

Вы можете увидеть, какой индекс (если он есть) используется запросомиспользование объяснения / анализа (может оказаться, что вывод будет легче понять, если вы используете визуальное объяснение / анализ, встроенный в PgAdmin).

Postgres также хранит статистику для индексов (которые очень легко просматривать через PgAdmin) - этоРекомендуется проверять их и удалять неиспользуемые и повторяющиеся индексы из вашей базы данных.

...