대량테이블 N개의 컬럼별 건수 구하기2 1 5 2,268

by 구사일생 [SQL Query] 대량테이블 N개의 컬럼 [2022.02.28 20:23:46]


지난번 "대량테이블 N개의 컬럼별 건수 구하기"에 해법을 주셨는데 한가지 더 질문을 합니다.

비슷한 내용으로 보여져 제가 어찌 해보려 하였으나 도저히  답이 나오질 않아 이렇게 다시 문의 드립니다.

SELECT
         AA, ROWID
FROM TABLE
 WHERE AA IS NOT NULL
    AND (LENGTHB(AA) < 20 OR REGEXP_LIKE(AA,'[가-힣]'))  AND ROWNUM = 1

     
;

SELECT
         BB, ROWID
FROM TABLE
 WHERE BB IS NOT NULL
    AND (LENGTHB(BB) < 20 OR REGEXP_LIKE(BB,'[가-힣]'))  AND ROWNUM = 1
;


SELECT
         CC, ROWID
FROM TABLE
 WHERE CC IS NOT NULL
    AND (LENGTHB(CC) < 20 OR REGEXP_LIKE(CC,'[가-힣]'))  AND ROWNUM = 1
;

같은 테이블을 컬럼별로 여러번 읽어야 하는 것은 지난번 질문과 같은나 , 단순히 컬럼별로 GROUP BY  COUNT가 아니고

컬럼의 사이즈가 20보다 작거나 한글이 포함 된 경우의 한건 만 ROWID와 같이 보여 주는  SQL 입니다.

여러가지고 고민을 해 보았으나 도저히 모르겠습니다.

 

고수님들의 지도 다시 한번 부탁드립니다.

 

 

by 마농 [2022.03.01 02:30:21]

작성하신 쿼리가 문제가 있나요?
ROWNUM = 1 조건으로 전반적으로 느리진 않을 듯 한데요?

지난번과 마찬가지로 UNPIVOT 한방 쿼리 가능하긴 합니다.
다만, 한방쿼리가 위 질문글의 개별쿼리 반복보다 빠를지는 의문입니다.
이 부분은 지난번에도 언급했었습니다. 피드백은 없었구요.
 

SELECT gb
     , MIN(v) KEEP(DENSE_RANK FIRST ORDER BY ROWID) v
     , MIN(ROWID) rid
  FROM t
 UNPIVOT (v FOR gb IN (aa, bb, cc))
 WHERE (LENGTHB(v) < 20 OR REGEXP_LIKE(v,'[가-힣]'))
 GROUP BY gb
;
SELECT *
  FROM (SELECT gb, v, ROWID rid
             , ROW_NUMBER() OVER(PARTITION BY gb ORDER BY ROWID) rn
          FROM t
         UNPIVOT (v FOR gb IN (aa, bb, cc))
         WHERE (LENGTHB(v) < 20 OR REGEXP_LIKE(v,'[가-힣]'))
        )
 WHERE rn = 1
;

 


by 구사일생 [2022.03.01 16:47:44]

우와 역시 금일 휴무인데도 프로젝트 진행 중이라 출근했다가 와서 이제야 봅니다. 

저는 어찌해도 이런 생각이 들지가 않네요 암튼 넘 감사하며 지난번 말씀하신내용에 대한 피드백을 이제야 드리면

건건히 돌린 SQL과 답변주신 SQL을 돌리면 전체 테이블 전체컬럼을 비교하면 말씀하신 것과 같이 엄청 시간이 차이가 나지는 않는 것 같습니다.

그런데, 건건히 돌리는 SQL은 대량의 테이블을 여러 번(컬럼갯수 만큼) SELECT 해야 하는 문제가 있습니다. 제가 자원을 (서버자원) 혼자서만 사용을 할 수는 없어서 

실제로 작업을 돌릴때 CPU 모니터링을 해 보면 건건히 돌리는 게 좀더 자원을 사용하는 듯 했습니다,

물론 지난번 질문드린 전체 테이블의 컬럼별 GROUP BY COUNT 했을때의 경우고 이번에 질문 드린 건은 제가 다시 테스트를 진행 해 보고 댓글 달겠습니다.

감사합니다.


by 구사일생 [2022.03.07 20:51:49]

서버 이전 관계로 그 동안 테스트를 해 보지 못하고 금일에야 하게되었습니다.

우선 결론부터 말씀 드린면 50개 테이블을 대상으로 코드성 컬럼에 LENGTHB(v) < 20 OR REGEXP_LIKE(v,'[가-힣]') 이 조건을 테이블별 컬럼별로 조회 하였습니다.

마농님께서 제안 해 주신 위 SQL과 제가 작성한 SQL을 비교 하였습니다.

(같은 테이블을 컬럼갯수 만큼 여러번 읽는 대신 LENGTHB(v) < 20 OR REGEXP_LIKE(v,'[가-힣]') 조건을 만나면 ROWNUM = 1로 끝나게  수작업 으로 작성 하여 돌렸습니다.)

예상과 달리 시간 차이가 거의 나질 않았습니다. 오히려 시간이 더 오래 걸리는 테이블도 존재 하였습니다. 저는 마농님께서 작성해 주신 SQL이 훨씬 빠를 것으로 예상 하였으나 시간이 거의 비슷하였습니다.

그래서 생각을 해 보니 지난번 질문은 테이블 컬럼별 GROUP BY COUNT질문일때는 마농님께서 제안 해 주신 SQL이 더 빨랐습니다(엄청 차이가 나는 것은 아니나 분명하게 유효한 차이를 느낄 수 있었 음).

아마도 그것은 결국 테이블을 모두 다 읽었던 것 같고 두번째 질문에서는 조건이 만족하면 ROWNUNM = 1으로 STOP이 되어서 예상과는 다른 결과 였던 것 같습니다.

어찌되었건 좋은 시간 이었습니다. 오랜만에 예전 생각도 나고 테스트 해보면서 즐거웠습니다. 그리고 결과적으로 시간이 비슷하였다 해도 수작업으로 일일이 작성하지 않는 방법을 알게 된 것만도

크게 감사할 따름 입니다. 앞으로도 계속 방문하여 다양하고 좋은 예제 참고 하겠습니다.

다시 한번 감사 드리면 환절기 건강들 유의 하세요 !!!!


by 마농 [2022.03.08 09:18:37]

이렇게 테스트 수행 결과를 올려 주니 좋네요.
ROWNUM 조건이 있는 개별 쿼리가 더 빠를 것 같았는데. 비슷하군요.
어느 정도 걸리는지도 구체적으로 올려주시면 참고할만한 좋은 정보가 될 것 같습니다.


by 구사일생 [2022.03.08 20:45:28]

혹시나 하고 들어와 봤는데 역시 하나하나 다 확인하시고 답변을 주시네요(감사할 따름)

위 테스트 내용은 메모를 하질 않아서 다시 올릴수는 없지만 다음 부터는 좀더 상세하게 내용을 정리해서 올리겠습니다.

그간 배운 내용이 많아서 늘 감사했는데 저도 익히고 다른분들께도 꼭 공유 하겠습니다.

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입