Материализация общего табличного выражения в HANA - PullRequest
0 голосов
/ 17 сентября 2018

Есть ли способ заставить HANA материализовать подзапрос в предложении WITH, как это делают подсказки оптимизатора MATERIALIZE и INLINE, как показано ниже в Oracle?

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

Я не нахожу такого намека в хане. Любая помощь?

1 Ответ

0 голосов
/ 18 сентября 2018

Для 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 );

Однако, прежде чем пытаться «заставить» оптимизатор что-либо сделать, убедитесь, что понимаете, что происходит в данный момент. Подсказки - это технический долг в вашем коде, и его следует избегать, если это возможно.

...