Производительность SQL CTE зависит от порядка декларирования? - PullRequest
0 голосов
/ 22 апреля 2020

Давайте представим два проекта кода.

Рис. 1:

WITH
cte1 AS (
    SELECT a1, a2
    FROM A
    WHERE a_condition
),
cte2 AS (
    SELECT b1, b2
    FROM B
    WHERE b_condition
)
SELECT
    a1, a2, b1, b2
FROM
    cte1, cte2
WHERE
    cross_condtion

Рис. 2:

WITH
cte_a AS (
    SELECT a1, a2
    FROM A
),
cte_b AS (
    SELECT b1, b2
    FROM B
)
SELECT
    a1, a2, b1, b2
FROM
    cte_a, cte_b
WHERE
    a_condition AND
    b_condition AND
    cross_condtion

Будут ли планы выполнения одинаковыми для таких запросов? Или во втором случае система получит все данные из A, все данные из B и только затем применит фильтры?

1 Ответ

1 голос
/ 22 апреля 2020

Порядок предложений CTE обычно не важен. Также CTE не всегда материализуются, и фактический план запроса не должен следовать логическому порядку обработки, подразумеваемому CTE. В частности, критерии предложения WHERE, указанные во внешнем запросе, могут быть помещены в подзапросы CTE. Объединения могут быть переупорядочены, и т. Д. c.

не гарантируется , что вы получите точно такие же планы для логически идентичных запросов, но вы не должны ожидать какого-либо влияния на планы запросов.

...