MariaDB: WITH 문과 함께 "INSERT ... SELECT"를 사용하는 방법
참고: 여기에는 ColumnStore가 포함됩니다.
회사에서는 prod에서 실행하기에 너무 많은 메모리가 소요되는 대규모 SQL 문이 있습니다.저는 현재 쿼리가 소비하는 크기를 줄이는 작업을 하고 있습니다.여러 가지 접근법을 사용해 보았지만 지금까지 문제가 해결된 것은 없습니다.WITH ... AS (...)
,웬일인지 그래.하지만 저는 이것을 결합해야 합니다.INSERT INTO ...
.
이것이 제가 작업하려는 코드입니다.
TRUNCATE db1.myTable;
INSERT INTO db1.myTable(`all`, `needed`, `columns`)
(WITH everything AS (
SELECT all, needed, columns
FROM db1.mainTable T1
JOIN db1.secondTable T2
ON (T1.someCol = T2.someCol)
JOIN db2.thirdTable T3
ON (T1.anotherCol = T3.anotherCol)
LEFT JOIN db1.fourthTable T4
ON (T4.anotherCol = T1.anotherCol)
WHERE T2.yetAnotherCol >= (some_SELECT_subquery)
AND T1.valid = 1
) SELECT * FROM everything);
EXPLAIN (WITH everything AS ...
돌아온다
+------+-------------+-----------------------+------+---------------+------+---------+------+------+-------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+-----------------------+------+---------------+------+---------+------+------+-------------------------------------------------+
| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 16000000000000 | |
| 2 | PRIMARY | T1 | ALL | NULL | NULL | NULL | NULL | 2000 | Using where with pushed condition |
| 2 | PRIMARY | T2 | ALL | NULL | NULL | NULL | NULL | 2000 | Using where; Using join buffer (flat, BNL join) |
| 2 | PRIMARY | T3 | ALL | NULL | NULL | NULL | NULL | 2000 | Using where; Using join buffer (flat, BNL join) |
| 2 | PRIMARY | T4 | ALL | NULL | NULL | NULL | NULL | 2000 | Using where |
| 3 | SUBQUERY | some_SELECT_subquery | ALL | NULL | NULL | NULL | NULL | 2000 | Using where with pushed condition |
+------+-------------+-----------------------+------+---------------+------+---------+------+------+-------------------------------------------------+
5 rows in set (0,21 sec)
사용만 하면.WITH
-진술서, 작동시킬 수 있습니다.와 마찬가지로, 저는 사용하지 않습니다.INSERT INTO
. 전혀 문제가 없으며, 이렇게 하면 질의가 더욱 빨라집니다.또한 쿼리를 여러 개로 나누려고 시도하면서 빠른 테스트를 했습니다.WITH
s, 하지만 제가 구문을 망쳤다고 생각하기 때문에 포기했습니다.저는 SQL에 대해 별로 능숙하지 않으며, 훨씬 더 덜합니다.JOIN
s(광학 현상기).
내가 합칠 때.WITH
-가 있는 진술.INSER INTO ...
, MariaDB는 다음과 같이 응답합니다.ERROR 1064 (42000) at line 3: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ') SELECT * FROM everything)' at line 1
. 다음에 세미콜론을 추가해 보았습니다.... valid = 1
, 두 개의 마지막 선 병합, 열린 괄호 위치 지정 다음... AS
새로운 라인으로, 그리고 제가 생각할 수 있는 다른 문제들은 구문과 관련된 것일 수도 있습니다.운이 없습니다.
지금 제 생각은 당신이 결합할 수 없다는 것입니다.INSERT INTO ... SELECT ...
와 함께WITH ...
. 적어도 그 일은 없습니다.WITH
처음에 SELECT가 있어야 할 위치입니다.이것이 제가 문서에서 수집할 수 있는 것입니다.
그래서, 간단히 말해서, 제 질문은: 제가 합칠 수 있을까요?INSERT INTO ... SELECT
와 함께WITH
- 진술은?그렇지 않다면 다른 기술로 비슷한 것을 할 수 있습니까?
쿼리의 메모리 활용도를 높일 수 있는 다른 방법이 있습니까?MariaDB나 Docker에 대한 구성 옵션을 엉망으로 만들고 싶지는 않지만, 가능성이 있다면 고려해 보겠습니다.
이거 먹어봤어요?
TRUNCATE db1.myTable;
WITH everything AS (
SELECT all, needed, columns
FROM db1.mainTable T1
JOIN db1.secondTable T2
ON (T1.someCol = T2.someCol)
JOIN db2.thirdTable T3
ON (T1.anotherCol = T3.anotherCol)
LEFT JOIN db1.fourthTable T4
ON (T4.anotherCol = T1.anotherCol)
WHERE T2.yetAnotherCol >= (some_SELECT_subquery)
AND T1.valid = 1
) INSERT INTO db1.myTable SELECT * FROM everything;
원래 질문에 대한 답을 찾지는 못했지만 하위 쿼리에 수집된 데이터의 양을 줄여 문제를 해결하기로 했습니다.원래 질문에서 제가 질문을 올릴 때 알고 있던 해결책이 아니었기 때문에 공개하지 않았습니다.Python 스크립트에서 SQL을 호출하여 가져올 주별 번호를 순환할 수 있습니다.
WHERE T2.ID >= (SELECT ID - {week_number} FROM db1.secondTable WHERE NOW() BETWEEN monday AND sunday) AND T1.valid = 1);
언급URL : https://stackoverflow.com/questions/56495394/mariadb-how-to-using-insert-select-with-with-statement
'programing' 카테고리의 다른 글
스프링 부트에서 json 개체(변수) 이름을 변경하는 방법 (0) | 2023.09.17 |
---|---|
읽기 전용 모드에서 OpenPyXL이 있는 Excel 워크시트의 열 이름 가져오기 (0) | 2023.09.12 |
ODBC와 ADO.NET의 차이점은 무엇입니까? (0) | 2023.09.12 |
클래스 접두사별 CSS 셀렉터가 있습니까? (0) | 2023.09.12 |
XML 문서에서 탈출하려면 어떤 문자가 필요합니까? (0) | 2023.09.12 |