数据仓库服务 GAUSSDB(DWS)-行数估算过小,优化器选择走NestLoop导致性能下降:分析过程

时间:2024-11-02 18:44:29

分析过程

  1. 排查当前的IO、内存、CPU使用情况,没有发现资源占用高的情况。
  2. 查看慢SQL的线程等待状态。

    根据线程等待状态,并没有出现都在等待某个DN的情况,初步排除中间结果集偏斜到了同一个DN的情况。

    1
    SELECT * FROM pg_thread_wait_status WHERE query_id='149181737656737395';
    

  3. 联系运维人员登录到相应的实例节点上,打印等待状态为none的线程堆栈信息如下。

    通过反复打印堆栈信息,发现堆栈在变化,并没有hang死,所以初步判断该问题为性能慢的问题。另堆栈中有VecNestLoopRuntime,结合执行计划,初步判断是由于统计信息不准,优化器评估结果集较少,执行计划使用了NestLoop导致性能下降。

    gstack 14104

  4. 对表执行ANALYZE后性能并没有太大改善。
  5. 对SQL增加hint关闭索引,让优化器强行使用hashjoin,发现hint功能没有生效,原因是hint无法改变子查询中的计划。
  6. 通过SET enable_indexscan = off,执行计划被改变,使用了Hash Left Join,慢SQL在3秒左右返回结果,查询性能恢复。

support.huaweicloud.com/trouble-dws/dws_09_0078.html