首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么索引会增加postgres中的执行时间?

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

Stack Overflow用户
提问于 2019-02-25 05:12:07
回答 1查看 317关注 0票数 0

我已经在'workflow.status'字段上创建了索引,但是为什么在创建索引之后查询执行时间会增加呢?

查询:

代码语言:javascript
复制
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

索引创建语句:

代码语言:javascript
复制
CREATE INDEX idx_workflow_status
  ON testdb.workflow
  USING btree
  (status COLLATE pg_catalog."default");

指数增长的时间有可能吗?

EN

回答 1

Stack Overflow用户

发布于 2019-02-25 13:23:00

这个答案跳过了一些细节,但通常是适用的。

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

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

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

Postgres还存储索引的统计信息(通过PgAdmin非常容易查看)--检查这些数据并从数据库中删除未使用的和重复的索引是很好的做法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54859842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档