优化以下 postgreSQL 代码的可能方法是啥?

Posted

技术标签:

【中文标题】优化以下 postgreSQL 代码的可能方法是啥?【英文标题】:What are the possible ways to optimize the below postgreSQL code?优化以下 postgreSQL 代码的可能方法是什么? 【发布时间】:2019-05-22 13:54:52 【问题描述】:

我编写了这个 SQL 查询来从 greenplum datalake 中获取数据。主表有 800,000 行,我正在与其他表连接。下面的查询花费了大量的时间来给出结果。查询时间较长的可能原因是什么?如何解决?

select    
          a.pole,
          t.country_name,
          a.service_area,  
          a.park_name,

          t.turbine_platform_name,
          a.turbine_subtype,
          a.pad as "turbine_name",
          t.system_number as "turbine_id",
          a.customer,
          a.service_contract,   

          a.component,
          c.vendor_mfg as "component_manufacturer",

          a.case_number,
          a.description as "case_description",
          a.rmd_diagnosis as "case_rmd_diagnostic_description",
          a.priority as "case_priority",
          a.status as "case_status",
          a.actual_rootcause as "case_actual_rootcause",
          a.site_trends_feedback as "case_site_feedback",
          a.added as "date_case_added",
          a.start as "date_case_started",
          a.last_flagged as "date_case_flagged_by_algorithm_latest",
          a.communicated as "date_case_communicated_to_field",
          a.field_visible_date as "date_case_field_visbile_date",
          a.fixed as "date_anamoly_fixed",
          a.expected_clse as "date_expected_closure",
          a.request_closure_date as "date_case_request_closure",
          a.validation_date as "date_case_closure",
          a.production_related,
          a.estimated_value as "estimated_cost_avoidance",
          a.cms,
          a.anomaly_category,
          a.additional_information as "case_additional_information",
          a.model,
          a.full_model,
          a.sent_to_field as "case_sent_to_field"

      from app_pul.anomaly_stage a
 left join ge_cfg.turbine_detail t on a.scada_number = t.system_number and a.added > '2017-12-31'
 left join tbwgr_v.pmt_wmf_tur_component_master_t c on a.component = c.component_name

【问题讨论】:

你看解释计划了吗?你有什么索引?表是如何分区的?请至少使用其中一些信息更新您的问题 在 Greenplum 上进行慢查询时要考虑的事项:A) 表是否正确分布?请使用表格上的倾斜信息更新您的帖子。 B) 连接键的数据类型是否完全相同?如果没有,greenplum 的表现就不好。 C)你使用什么优化器? D)那个过滤器在 varchar 列上? E) 你检查过笛卡尔吗? F) 所有段都向上了吗?缺少一些信息,因此我们可以为您提供适当的帮助。 【参考方案1】:

您的查询基本上是:

 select . . .
 from app_pul.anomaly_stage a left join
      ge_cfg.turbine_detail t 
      on a.scada_number = t.system_number and
         a.added > '2017-12-31' left join
         tbwgr_v.pmt_wmf_tur_component_master_t c
         on a.component = c.component_name

首先,a 上的条件被忽略,因为它是left join 中的第一个表,并且是on 子句。因此,我假设您实际上打算对其进行过滤,因此将查询编写为:

 select . . .
 from app_pul.anomaly_stage a left join
      ge_cfg.turbine_detail t 
      on a.scada_number = t.system_number left join
      tbwgr_v.pmt_wmf_tur_component_master_t c
      on a.component = c.component_name
 where a.added > '2017-12-31'

这可能有助于提高性能。然后在 Postgres 中,您需要在 turbine_detail(system_number)pmt_wmf_tur_component_master_t(component_name) 上建立索引。索引是否会对第一个表有所帮助是值得怀疑的,因为您已经在选择大量数据。

我不确定索引在 Greenplum 中是否合适。

【讨论】:

由于 greenplum 的架构 (gpdb.docs.pivotal.io/570/admin_guide/ddl/ddl-index.html),我建议您仔细考虑是否需要索引。 索引在 Greenplum 中可能会有所帮助,就像它们在 PostgreSQL 中的帮助一样:如果您从大表中选择少量数据。此外,Greenplum 还支持某些 OLAP 查询的位图索引。【参考方案2】:
    验证连接是否使用各自的主键和外键。 尝试执行删除一个又一个左连接的查询,这样您就可以看到问题的焦点。 尝试使用计划执行。

【讨论】:

以上是关于优化以下 postgreSQL 代码的可能方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

为大型 Postgresql 表优化嵌套连接窗口函数

在 postgresql 中水平分片的好方法是啥

在 PostgreSQL 中提取拆分字符串的最后一部分的最有效方法是啥?

PostgreSQL代码分析,查询优化部分,process_duplicate_ors

PostgreSQL 查询性能和可能的优化

PL/Python 和 postgreSQL:返回多列表的最佳方法是啥?