是否有一种方法可以迫使HANA在WITH子句中实现子查询,例如MATERIALIZE和INLINE优化器提示在Oracle中的作用如下?
WITH dept_count AS (
SELECT /*+ MATERIALIZE */ deptno, COUNT(*) AS dept_count
FROM emp
GROUP BY deptno)
SELECT ...
我在汉娜中找不到这样的暗示。有帮助吗?
答案 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 );
但是,在尝试“强制”优化器执行任何操作之前,请确保了解当前正在发生的事情。提示是代码中的技术债务,应尽可能避免。