【问题标题】:Why index increase execution time in postgres?为什么索引会增加 postgres 中的执行时间?
【发布时间】:2019-02-25 05:12:07
【问题描述】:

我已经在'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");

是否有可能索引增加时间?

【问题讨论】:

  • 是的,这是可能的。添加EXPLAIN (ANALYZE, BUFFERS) 输出以获取更多信息。
  • 在您收集信息的同时,this 可能会带来有趣的阅读。
  • status 上的索引对于以 != 开头的查询没有帮助。该查询的更好索引是create index on workflow (projectname, claimedby) where status <> 'Check'
  • 不相关,但是:在表达式 FROM testdb.workflow 中,标识符 testdb 指的是模式,而不是“数据库”。将模式命名为“db”非常令人困惑

标签: postgresql indexing postgresql-9.1


【解决方案1】:

这个答案跳过了一些细节,但普遍适用。

在规划查询时,Postgres 将查看每个可能相关的索引。然后,它会选择看起来最适合查询的索引,或者如果相关索引根本不适合,则决定不使用任何索引。

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

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

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

【讨论】:

    猜你喜欢
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-17
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多