Skip to content
isdnetworks
Go back

한 단계 더 거쳐 조인한다

실패한 연동 작업들이 이관된 상품에 걸린 것인지를 판별해야 했다. 이관 로그 테이블이 있으니 그것과 조인하면 되는 간단한 일로 보였다.

Table of contents

Open Table of contents

계속 나온 0건

조인해서 세니 0건이 나왔고 조건을 바꾸거나 날짜를 넓혀도 계속 0이었다. 이관된 상품이 하나도 없다고 결론 내려던 참에 정말 없는지 컬럼 구조를 확인했느냐는 지적을 받았다.

그 확인을 하지 않은 상태였다. 컬럼 이름이 둘 다 상품 식별자를 뜻하니 그대로 조인되겠거니 하고 넘어간 것이다.

두 단계였던 구조

상품 테이블의 컬럼 목록을 확인하니 부모를 가리키는 컬럼이 따로 있었다. 그것을 넣어 구조를 정리하니 신규 자식 상품이 부모 컬럼으로 마스터를 가리키고 이관 로그가 그 마스터 식별자를 담고 있었다.

그런데 작업 테이블의 상품 식별자는 마스터가 아니라 자식 상품을 가리키고 있었다. 자식 식별자를 마스터 식별자 컬럼에 조인했으니 0건이 나오는 것이 당연했다.

정반대가 된 결과

그래서 중간에 상품 테이블을 끼워 한 단계를 더 거쳐 조인하도록 고쳤다. 다시 세니 대상 작업이 3천 건이 넘었고 그중 대부분이 이관 대상이었다.

이관된 것이 없는 것이 아니라 거의 전부가 이관된 것이었고 결론이 정반대로 뒤집혔다.

0건이 주는 느낌

이 일이 보여 주는 것은 조회 결과 0건이 두 가지를 뜻한다는 점이다. 정말 없는 경우와 조회가 틀린 경우인데 결과만 놓고 보면 둘이 구분되지 않는다.

그리고 0건이라는 결과는 무언가를 확인했다는 느낌을 준다. 쿼리가 정상으로 돌았고 결과까지 나왔기 때문이다. 오류가 났으면 다시 봤을 텐데 0건은 그대로 넘어가게 되므로 더 위험하다.

0건일 때의 절차와 순서

그래서 0건이 나오면 조인 조건을 하나씩 떼어 보기로 했다. 조인 없이 세면 수천 건인데 조인 하나를 붙이자마자 0이 되면 그 조인 조건이 틀린 것이다.

근본 원인은 두 컬럼이 다 상품 식별자인데 가리키는 계층이 다르다는 것이었고 이름이 계층을 알려 주지 않는다. 계층 구조가 있는 스키마에서는 그 식별자가 어느 층인지를 항상 확인해야 하며 조인 전에 스키마를 보는 조회 하나면 되는 일을 이름으로 추측한 것이 이 조사의 실수였다.

정리


Share this post on:

Previous Post
그대로 둔 기본값의 비용
Next Post
코드 추정보다 앞선 DB 사실