在HANA中实现通用表表达式

时间:2018-09-17 08:04:10

标签: hana

是否有一种方法可以迫使HANA在WITH子句中实现子查询,例如MATERIALIZE和INLINE优化器提示在Oracle中的作用如下?

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

我在汉娜中找不到这样的暗示。有帮助吗?

1 个答案:

答案 0 :(得分: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 );

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