首页 > 解决方案 > postgresql 中的性能问题

问题描述

当我尝试在 oracle 中使用此查询时,它正在0.04054s使用并且在 PostgreSQL 中使用相同的查询时,49.8min我该如何更改查询以提高 PostgreSQL 中的性能?


SELECT
     "ID","IMAGE","TITLE","SERVICE_DESC"
     ,"STATUS", "ACTION","REMOVAL_TEXT","SERVICE_PROVIDER"
     , "SERVICE_PROVIDER_NAME" 
FROM ( 
        SELECT DISTINCT "ID","IMAGE"
            ,"TITLE", "SERVICE_DESC"
            , COALESCE("STATUS",'N') as "STATUS"
            ,"ACTION","REMOVAL_TEXT","CREATED_DT"
            ,"SERVICE_PROVIDER", "SERVICE_PROVIDER_NAME"

        FROM MZP_ADP.ALL_SERVICE_DETAILS 
        WHERE "ZIP_CODE"='55005' AND "MAKE_LIVE" = 'Y'
          AND "LOCATION_ID" = '2407605' 
          AND "END_DATE" > CURRENT_TIMESTAMP(0)::TIMESTAMP WITHOUT TIME ZONE 
          AND  "IS_ACTIVE" = 'Y' order by "CREATED_DT" desc
) alias;

标签: sqloraclepostgresql-9.3

解决方案


应用一些东西来提高性能

  1. VACUUM FULL 用于表(它还重建索引)。但任何混淆执行重建索引

    VACUUM (FULL, ANALYZE) table_name;

    重新索引表表名;

  2. 根据您的内存和服务器配置增加 work_mem 和 maintenance_work_mem

  3. 使用 GROUP BY 而不是 DISTINCT(不同的速度较慢)

  4. 删除子查询中的 ORDER BY。如果需要,然后在外面使用它

  5. 创建一个包含 ZIP_CODE、LOCATION_ID、END_DATE 列的复合索引,并在 WHERE 子句中使用正确的顺序(因为 MAKE_LIVE 和 IS_ACTIVE 是标志类型,因此需要在索引中添加第一个)

  6. EXPLAIN ANALYZE QUERY 用于检查执行时间并在查询中使用正确的索引

伪代码:

SELECT columns
FROM (SELECT columns
      FROM table
      WHERE searching columns as per index creation 
      GROUP BY WITHOUT aggregated COLUMNS) t
ORDER BY columns -- if needed

推荐阅读