BigQuery의 분할 영역 열 사이의 using 문장을 사용하여 full outer join을 진행할 때 스캔량을 줄일 수 없는 함정
전제 조건
BigQuery에서는 데이터의 스캔 양에 따라 요금이 부과됩니다.
따라서 불필요한 열은 조회에서 삭제하거나 참조원을 구분 분할표로 삼아 비용을 억제할 수 있다.
(또한 쿼리에서 전혀 사용되지 않는 열에 대해 BigQuery 측에서 판별을 하고 스캔을 하지 않기 때문에 중도의 하위 쿼리에서도
select * from ...
처럼 진행할 수 있다.)BigQuery로 비용 제어
메시지
이번에 나는 두 개의 구역 분할표 사이에 완전히 외부로 결합된 조회가 스캔량을 줄일 수 없다는 것을 알아차렸다.
수행된 질의에는 다음과 같은 느낌이 있습니다.
select
*
from
`project.dataset.tbl1` as tbl1
full outer join
`project.dataset.tbl2` as tbl2
using (dt, id)
where 1 = 1
and dt between "2021-04-01" and "2021-04-30"
어느 테이블에나 섹션 열dt
이 있고 이 섹션 조건을 사용하여 스캔량을 지정하지만 컨트롤러에 표시된 스캔량의 예측은 두 테이블을 모두 스캔할 때의 수치이다.using 문장에서 구분열을 사용하면 사용 방법에 약간의 변화가 있을 수 있습니다.
스캔량을 억제하기 위해서 나는 몇 가지 조회의 회수 방안을 고려했다.
방안1:where 문장은 두 표에 각각 조건을 지정한다
select
*
from
`project.dataset.tbl1` as tbl1
full outer join
`project.dataset.tbl2` as tbl2
using (dt, id)
where 1 = 1
and tbl1.dt between "2021-04-01" and "2021-04-30"
and tbl2.dt between "2021-04-01" and "2021-04-30"
우선 각 표의 dt
열을 명확하게 수정하여 조건을 지정했다.하지만 조회 결과를 자세히 보면 기록 수가 많이 줄어든다.
원래 검색어는full outer join이기 때문에 어느 것이든 결핍된 키가 남아 있지만 위의 검색어처럼 두 테이블에 대한 조건을 명확하게 지정하면 그 중 하나가 결핍된 키가 떨어진다.
시나리오 2: 조건 간 or 소통
select
*
from
`project.dataset.tbl1` as tbl1
full outer join
`project.dataset.tbl2` as tbl2
using (dt, id)
where 1 != 1
or tbl1.dt between "2021-04-01" and "2021-04-30"
or tbl2.dt between "2021-04-01" and "2021-04-30"
그래서 다음에 조건 사이를 or로 연결해 봅시다.그러나 이번 스캔량은 원래 검색어와 마찬가지로 전체 스캔할 때의 수치다.
시나리오 3: 하위 질의에 기준을 지정한 다음 병합
select
*
from
(select * from `project.dataset.tbl1` where dt between "2021-04-01" and "2021-04-30")
full outer join
(select * from `project.dataset.tbl2` where dt between "2021-04-01" and "2021-04-30")
using (dt, id)
또는 솔직한 방법은 처음에 각 표에 조건을 지정하고 필요한 데이터만 명확하게 읽고 결합 처리 등을 한 후에 하는 것이다.이렇게 하면 스캔량을 억제할 수도 있고 조회 결과를 기대할 수도 있다.
경품 시나리오: 원래 풀 아웃 존을 사용하지 않습니다.
select
dt, id
from
`project.dataset.tbl1`
where 1 = 1
and dt between "2021-04-01" and "2021-04-30"
union distinct
select
dt, id
from
`project.dataset.tbl2`
where 1 = 1
and dt between "2021-04-01" and "2021-04-30"
예전에는 간단하게 select *
라고 쓰여 있었지만, 실제로는 결합용dt, id
만 추출하여 메인 테이블 같은 것을 만들었다.따라서 이번 검색에서 하고 싶은 일을 꼼꼼히 고려해 보면 유니언 디스턴트 검색만으로도 충분하다는 것을 알 수 있다.
이것도 방안 3과 마찬가지로 각 표에 대해 먼저 조건이 있는 다음에 결합한다.
(최종 추출된 열 자체도 줄어들었고 스캐닝도 더 줄어들었다.)
끝말
투덜거려도 이 근처 방법을 이해할 만한 자료를 찾지 못하니 아는 사람이 있으면 댓글로 알려주면 기쁠 것 같다.
Reference
이 문제에 관하여(BigQuery의 분할 영역 열 사이의 using 문장을 사용하여 full outer join을 진행할 때 스캔량을 줄일 수 없는 함정), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/justice_vsbr/articles/bb90f6376b6fef텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)