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초, 즉 초기 500mS의 8배가 필요하다는 사실에 매우 놀랐습니다. 마지막 WITH 요소를 8번 재사용하고 있기 때문일 수 있습니다.
MariaDB는 마지막 쿼리 체인을 임시로 저장하고 8번 재사용하는 대신 전체 하위 쿼리 체인의 8배를 계산하여 이를 실행합니다. 반면 저는 마지막 작은 결과를 1밀리초도 안 되는 시간에 재사용할 수 있을 것으로 예상했습니다.
마지막 쿼리에서 EXPLE을 사용하면 다음과 같은 결과가 나타납니다.
전체 하위 범주가 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
'programing' 카테고리의 다른 글
파일에 대한 모든 Pylint 경고 사용 안 함 (0) | 2023.08.25 |
---|---|
Angular4 IE11의 응용 프로그램 실행 문제 (0) | 2023.08.25 |
선두에 있는 .../을(를) 사용하여 상위 디렉터리 위를 종료할 수 없습니다. (0) | 2023.08.25 |
Maria에서 기본 저장 프로시저를 만들 수 없습니다.DB (0) | 2023.08.25 |
SQL Server 2008에서 스칼라 함수를 호출하는 방법 (0) | 2023.08.25 |