有没有办法强制HANA在WITH子句中实现子查询,例如MATERIALIZE和INLINE优化器提示在Oracle中如下所示?
WITH dept_count AS (
SELECT /*+ MATERIALIZE */ deptno, COUNT(*) AS dept_count
FROM emp
GROUP BY deptno)
SELECT ...
我发现哈纳没有这样的暗示。有帮助吗?
对于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 );
但是,在尝试“强制”优化器执行任何操作之前,请确保了解当前正在发生的事情。提示是代码中的技术债务,如果可能应该避免。