BigQuery의 분할 영역 열 사이의 using 문장을 사용하여 full outer join을 진행할 때 스캔량을 줄일 수 없는 함정

10062 단어 GCPSQLBigQuerytech

전제 조건


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과 마찬가지로 각 표에 대해 먼저 조건이 있는 다음에 결합한다.
(최종 추출된 열 자체도 줄어들었고 스캐닝도 더 줄어들었다.)

끝말


투덜거려도 이 근처 방법을 이해할 만한 자료를 찾지 못하니 아는 사람이 있으면 댓글로 알려주면 기쁠 것 같다.

좋은 웹페이지 즐겨찾기