혹시 쿼리를 빨리 읽는 방법이 있을까요?
제가 실무에서 프로시저와 함수들을 주로 사용하고 있습니다.
그런데 제가 SQL 에 익숙하지 않아서 인것도 있지만
주석이 없는 프로시저와 함수들을 보고 의도를 파악하고 분석하는데 시간이 너무 오래 걸리고 있어요.
혹시 서브쿼리 join , union 등이 무분별하게 쓰여진 복잡한 쿼리에서 쿼리의 의도만을 빠르게 파악할 수 있는 방법이 있을까요?
제 나름대로 생각을 해서 SELECT 절은 일단 보지 않고
FROM 절을 먼저 보고 어떤 테이블에서 값을 가지고 오는지 판단한후 WHERE 절을 보고 마지막으로 SELECT 절을 보고 있어요
그런데 SELECT 절에서도 CASE WHEN 문이나 단일행 서브쿼리들이 있어서 실행을 시켜보아도 이게 무슨의미인지 파악하지 못할때가 많아요,, 방법이 있을까요?
안녕하십니까,
복잡한 SQL이나, 언급하신 프로시저, 함수들을 보고 작성자의 의도를 단번에 파악하는 것은 요령 보다는 노력과 시간이 필요한 일이라고 생각합니다.
단번에 길러지는 능력이 아니라, 꾸준히 복잡한 SQL을 스스로 해석해보는 시도를 계속 해보면서 쌓아야 하는 능력입니다.
이런 능력을 키우는데 요령은 없다고 말씀드렸지만, 어느정도 방향성을 말씀드리자면,
일단 본 강의에서 언급하는 Join, 집합의 레벨, 서브쿼리 등에 대해서 명확하게 이해를 하셔야 합니다. 왜 조인이나 서브쿼리를 사용했는지, 조인이나 서브쿼리로 테이블을 연결하면 집합의 레벨은 어떻게 변하는지, 조인/서브쿼리 연결 고리와 PK는 어떻게 이어지는지등 확실히 아실 수 있도록 본 강의를 반복해서 다시 들어보실 것을 권장 드립니다.
Join, 서브쿼리, Union 을 왜 사용했는지 스스로 많이 고민해 봐야 합니다. 작성자가 데이터 모델을 잘못 이해해서, 조인이나 서브쿼리의 연결시 집합 레벨의 변화를 잘못 이해해서 불필요하게 사용했을 수도 있습니다. 잘못 이해하고, 이걸 바로 잡는 과정에서 무의미한 조인, 서브쿼리, Union을 사용했을 수 있습니다. 하지만, 왜 잘못 사용하였을까도 함께 고민해 봐야 합니다. 그리고 본인이라면 어떻게 수정할 지도 생각해보는 노력의 시간이 필요합니다.
SQL 이해도 필요하지만, 데이터 모델에 대한 이해가 높으면 큰 도움이 됩니다. 단순히 PK-FK의 관계가 아니라, 핵심 테이블을 무엇이고, 이 핵심 테이블을 기반으로 어떤 액션이 발생하는지, 그리고 이 테이블의 상태 변화가 어떻게 되는지, 이들 액션과 상태 변화를 담기 위해 어떤 테이블들이 만들어지고, 이들을 관계화 하고 있는지 모델을 보고 이해할 수 있는 능력이 필요합니다. 예를 들어 고객, 상품, 조직 등은 핵심 마스터 테이블 입니다. 이와 더불어 계약, 청구, 주문 역시 핵심 마스터 입니다. 고객 상품구입은 고객이 상품을 구매한 액션 테이블 입니다. 고객 상품 구매 이력은 액션을 한 이력 테이블 입니다. 이렇게 개별 테이블 들을 카테고리화 하고, 이들이 어떻게 연결되어 업무를 구성하는지 파악하는 노력을 해봐야 합니다.
4. 좀 더 업무적인 이해도를 높이는 것도 도움이 됩니다. SQL이나 데이터 모델은 업무 요건 사항을 IT로 구현하기 위해서 만들어지는 것입니다. 결국은 업무에 대한 다양하고 높은 이해도가 필요할 수 있습니다. 특히나 프로시저나 함수는 일반 SQL보다 특성상 로직이 복잡하고, 소스 코드도 깁니다. 단일 SQL로 만들기에는 If, elif 등의 조건이 여러가지로 분기되며, 더욱이 이들 분기조건마다 서로 다른 테이블에 접근하여 원하는 결과를 가져와야 하는 경우가 많습니다. 하나씩 분기 조건을 따져 가면서 마음속으로 업무 로직을 정리하는 것도 도움이 됩니다.
5. 프로시저는 일반적으로 기준 대상을 먼저 추출한 다음에 Cursor loop로 기준 대상을 하나씩 fetch해 가면서 여러 테이블에 연결하면서 조건을 비교하고, 원하는 값을 추출하는 형태로 되어 있습니다. 실제로 기준이 되는 대상 id를 하나 샘플로 입력하면서 데이터가 어떻게 흘러가는지 파악해 보는 것도 좋습니다.
직접 분석한 결과를 주석이나 문서로 바로 정리하는 습관을 가지는 것도 좋습니다. 계속 정리하다보면, 공통적인 부분을 발견할 수 있고, 점차 구체화된 패턴을 발견하실 수 있을 것입니다.
마지막으로, from 절을 먼저 보고, where나 select 절을 보는 방법도 좋습니다. 먼저 개략적으로 데이터의 연결관계를 보고, 어떠한 컬럼으로 연결이 되며, 왜 연결했는지, 왜 filtering 하는지에 대한 감을 잡은 뒤에 상세 분석을 시도하는 방식으로 계속 노력해 보시면 좋을 것 같습니다.
감사합니다.
답글