Greenplum查询成本与查询分析不符

时间:2018-07-23 12:21:43

标签: database relational-database distributed-system greenplum

greenplum查询的实际成本在哪里? 我有一个简单的sql查询,在SQL Server上返回80毫秒,在greenplum上返回1500毫秒!!!

“解释分析”显示“总执行时间:55ms”,但是事实并非如此,我尝试使用odbc dirver或psql客户端连接到(greenplum)数据库,查询成本稳定在1500ms。

每个表上的数据不超过10K,已分区且没有歪斜(无索引)。所有节点(主节点/分段)的CPU / IO /内存/元组平均低于10%。

问题:

  • 实际费用在哪里
  • 我在哪里可以找到它
  • 我是否缺少一些重点

SQL:

@bot.command(pass_context=True)
@commands.check(user_is_me)
async def hello(cxt):
   await bot.say('Hello')

执行计划(无索引):

    SELECT CoreHR_EmploymentRecord.ChangeTypeOID AS CoreHR_EmploymentRecord_ChangeTypeOID,
       MAX(CoreHR_EmploymentRecord.ChangeTypeAlias) AS CoreHR_EmploymentRecord_ChangeTypeAlias,
       COUNT(DISTINCT CoreHR_EmployeeInformation.UserID) AS CoreHR_EmployeeInformation_Count_UserID
FROM CoreHR_EmployeeInformation WITH (NOLOCK)
    LEFT JOIN CoreHR_EmploymentRecord WITH (NOLOCK)
        ON CoreHR_EmployeeInformation.TenantId = CoreHR_EmploymentRecord.TenantId
           AND CoreHR_EmployeeInformation.UserID = CoreHR_EmploymentRecord.UserID
           AND CoreHR_EmploymentRecord.TenantId = 106996
WHERE CoreHR_EmployeeInformation.TenantId = 106996
      AND (CoreHR_EmploymentRecord.IsCurrentRecord = 1)
      AND (CoreHR_EmploymentRecord.StartDate
      BETWEEN '2018-05-24 00:00:00' AND '2018-06-22 23:59:59.998'
          )
      AND CoreHR_EmployeeInformation.ApprovalStatus IN
          (
              SELECT * FROM dbo.f_SplitToVarchar(4, ',')
          )
GROUP BY CoreHR_EmploymentRecord.ChangeTypeOID
ORDER BY CoreHR_EmploymentRecord.ChangeTypeOID ASC;

1 个答案:

答案 0 :(得分:1)

Greenplum数据库执行非常快速的顺序扫描;索引使用随机查找模式在磁盘上定位记录。

Greenplum数据分布在各个段中,因此每个段扫描总数据的一小部分以获得结果。使用表分区,要扫描的总数据可能会更小。

由于商业智能查询工作负载通常返回非常大的数据集,因此使用索引效率不高。

首先尝试不添加索引的查询工作量。

您使用的是ORCA还是LEGACY PLANNER?

关于时间问题-

您是从哪里产生时间的?远程客户端?还是从PSQL控制台? EXPLAIN ANALYZE显示飞行中查询的实际处理时间。

您需要发布EXPLAIN ANALYZE才能对计划进行任何真正的分析。