实现HANA中的公用表表达

问题描述 投票:0回答:1

有没有办法强制HANA在WITH子句中实现子查询,例如MATERIALIZE和INLINE优化器提示在Oracle中如下所示?

WITH dept_count AS (
  SELECT /*+ MATERIALIZE */ deptno, COUNT(*) AS dept_count
  FROM   emp
  GROUP BY deptno)
SELECT ...

我发现哈纳没有这样的暗示。有帮助吗?

hana
1个回答
0
投票

对于SAP HANA实现,中间结果集通常不会提高性能;相反,SAP HANA努力尽可能地实现,以便它可以在更紧凑的内部表示中处理数据。

您可能希望看到的是,在查询的多个位置使用的公用表表达式不会为每个引用重新执行。

此优化在SAP HANA中称为“子计划共享”,默认情况下处于活动状态。

查看EXPLAIN PLAN输出可以验证查询是否使用“子计划共享”:

OPERATOR_NAME                       OPERATOR_DETAILS
                                                       ...
ROW SEARCH                          KF_MED.MKF1, KF_MED.MKF2, KF_DAT.MKF1, 

[...]
      COLUMN SEARCH                 KF_MED.MKF1, KF_MED.MKF2, FACT.KF1, FACT.KF2                               ...
        FILTER                      FACT.KF2 <> KF_MED.MKF2 OR KF_MED.MKF2 IS NULL OR FACT.KF2 IS NULL         ...
          JOIN                      JOIN CONDITION: (INNER many-to-one) FACT.KF1 = KF_MED.MKF1                 ...
            COLUMN TABLE                                                                                       ...
            ROW SEARCH              KF_MED.MKF1, KF_MED.MKF2                                                   ...
              VIEW                  PROJECT COLS: KF_MED.MKF1, KF_MED.MKF2,                                    ...
   ===>        (SHARED SUBPLAN)     SUBPLAN OPERATOR_ID : 9                                                     ...
    VIEW                            PROJECT COLS: KF_MED.MKF1, KF_MED.MKF2,                                    ...
   ===>  (SHARED SUBPLAN)           SUBPLAN OPERATOR_ID : 9                                                    

请参阅上面标有===>的两行。

如果优化器不选择使用“子计划共享”,您可以尝试使用提示来指示这是所需的行为:

 SELECT * FROM T1 WITH HINT( SUBPLAN_SHARING );

但是,在尝试“强制”优化器执行任何操作之前,请确保了解当前正在发生的事情。提示是代码中的技术债务,如果可能应该避免。

© www.soinside.com 2019 - 2024. All rights reserved.