为什么索引会增加postgres中的执行时间?

时间:2019-02-25 05:12:08

标签: postgresql indexing postgresql-9.1

我已经在 def test_login(app): app.session.login("administrator", "*******") assert app.session.is_logged_in_as("administrator") 字段上创建了索引,但是为什么在创建索引后查询执行时间却增加了?

查询:

'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

索引有可能增加时间吗?

1 个答案:

答案 0 :(得分:0)

此答案跳过了一些细节,但通常适用。

在计划查询时,Postgres将查看每个潜在相关索引。然后,它将选择似乎最适合该查询的索引,或者如果所有相关索引都根本不适合,则决定完全不使用索引。

如果查询已在使用索引,并且您创建了一个不合适的索引,或者查询未在使用索引,并且您创建了不合适的索引; Postgres将花费更长的时间来计划查询,因为它现在必须查看另一个索引文件并将其与其他潜在的查询计划进行比较。

通过使用解释/分析,您可以查看查询正在使用哪个索引(如果使用PgAdmin内置的可视化的解释/分析,您会发现输出更容易理解)。

Postgres还存储索引的统计信息(可以通过PgAdmin轻松查看其中的索引)-优良作法是查看这些索引,并从数据库中删除未使用和重复的索引。