programing

MariaDB는 정말 "WITH" 중간 결과를 캐싱하거나 재사용하고 있습니까?

bestprogram 2023. 8. 25. 23:51

MariaDB는 정말 "WITH" 중간 결과를 캐싱하거나 재사용하고 있습니까?

다음과 같은 체인 WITH 문을 사용하여 MariaDB SQL 쿼리(실제로 매우 큼)를 가지고 있습니다.

WITH tbl_base AS (

    -- Base level sub-query on a table containing about 22000 rows, using LEFT JOIN on 5 other tables, details not relevant here
    SELECT ……… FROM <many things>

), tbl_middle AS (

    -- Intermediate level sub-query #1 for intermediate computing, details not relevant here
    SELECT ……… FROM tbl_middle …

), tbl_states AS (

    -- Intermediate level sub-query #2 for intermediate computing, details not relevant here
    SELECT
        ……… AS state,
        ……… AS `elec`
    FROM    tbl_states …

), tbl_sums AS (

    -- Final grouping query
    SELECT
        `state`,
        SUM(NOT `elec`) AS `vls`,
        SUM(`elec`) AS `vae`,
        count(`state`) AS `all`
    FROM tbl_states
    GROUP BY `state`
    ORDER BY `state`

)

-- Additional query which could be avoided if left as simple as this but it will not stay as simple as this
SELECT `state`, `vae`, `vls`, `all` FROM tbl_sums

이 쿼리는 각각 8개의 서로 다른 상태(bad, longrun, lost, maint, ok, removed, run 또는 warning)를 가질 수 있는 두 가지 종류의 개체에 대한 통계를 작성하므로 결과는 8개 행과 3개 열(vls, vae 및 둘 다)만 볼 수 있습니다.

제 서버에서 실행하려면 약 500 mS가 필요한데, 이는 허용 가능합니다.

이제 몇 개의 결합된 상태를 만들기 위한 행을 추가하고 싶어서 마지막 선택을 이 유니언으로 대체했습니다.

SELECT `state`, `vae`, `vls`, `all` FROM tbl_sums
UNION
SELECT 'all_sta',SUM(`vls`),SUM(`vae`),SUM(`all`) FROM tbl_sums WHERE `state` IN ('ok','warn','bad','maint')
UNION
SELECT 'all_run',SUM(`vls`),SUM(`vae`),SUM(`all`) FROM tbl_sums WHERE `state` IN ('run','longrun')
UNION
SELECT 'operative',SUM(`vls`),SUM(`vae`),SUM(`all`) FROM tbl_sums WHERE `state` IN ('ok','warn','run','longrun')
UNION
SELECT 'unusable',SUM(`vls`),SUM(`vae`),SUM(`all`) FROM tbl_sums WHERE `state` IN ('bad','maint')
UNION
SELECT 'present',SUM(`vls`),SUM(`vae`),SUM(`all`) FROM tbl_sums WHERE `state` IN ('ok','warn','bad','maint','run','longrun')
UNION
SELECT 'missing',SUM(`vls`),SUM(`vae`),SUM(`all`) FROM tbl_sums WHERE `state` IN ('removed','lost')
UNION
SELECT 'total',SUM(`vls`),SUM(`vae`),SUM(`all`) FROM tbl_sums

잘 작동하지만 쿼리를 실행하는 데 약 4초, 즉 초기 500mS8배가 필요하다는 사실에 매우 놀랐습니다. 마지막 WITH 요소를 8번 재사용하고 있기 때문일 수 있습니다.

MariaDB는 마지막 쿼리 체인을 임시로 저장하고 8번 재사용하는 대신 전체 하위 쿼리 체인의 8배를 계산하여 이를 실행합니다. 반면 저는 마지막 작은 결과를 1밀리초도 안 되는 시간에 재사용할 수 있을 것으로 예상했습니다.

마지막 쿼리에서 EXPLE을 사용하면 다음과 같은 결과가 나타납니다.

EXPLAIN on the above SQL query

전체 하위 범주가 8번이나 효과적으로 탐색된다는 것을 명확하게 알 수 있는 곳입니다.

그래서 저는 제가 무언가를 잘못 만든 것인지, 아니면 더 잘 작동하도록 하기 위해 몇 가지 설정을 변경해야 하는지, 아니면 단순히 마리아DB(이 경우 버전 10.3.29)의 버그인지 알고 싶습니다. WITH는 마리아DB의 상당히 새로운 기능이기 때문입니다.

임시 테이블을 만들 수 있다는 것은 알지만, 애플리케이션에서 하나의 결과에 대해 여러 개의 문을 실행하는 것이 매우 복잡하기 때문에, 저는 그것을 피하기 위해 정확히 사용하기를 기대했습니다.

이것은 관련이 없을 수 있지만 서버가 Linux Debian 10에서 실행되고 있습니다.

언급URL : https://stackoverflow.com/questions/68924691/is-mariadb-really-caching-or-reusing-with-intermediary-results