지난번 "대량테이블 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 입니다.
여러가지고 고민을 해 보았으나 도저히 모르겠습니다.
고수님들의 지도 다시 한번 부탁드립니다.
작성하신 쿼리가 문제가 있나요?
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 ;
우와 역시 금일 휴무인데도 프로젝트 진행 중이라 출근했다가 와서 이제야 봅니다.
저는 어찌해도 이런 생각이 들지가 않네요 암튼 넘 감사하며 지난번 말씀하신내용에 대한 피드백을 이제야 드리면
건건히 돌린 SQL과 답변주신 SQL을 돌리면 전체 테이블 전체컬럼을 비교하면 말씀하신 것과 같이 엄청 시간이 차이가 나지는 않는 것 같습니다.
그런데, 건건히 돌리는 SQL은 대량의 테이블을 여러 번(컬럼갯수 만큼) SELECT 해야 하는 문제가 있습니다. 제가 자원을 (서버자원) 혼자서만 사용을 할 수는 없어서
실제로 작업을 돌릴때 CPU 모니터링을 해 보면 건건히 돌리는 게 좀더 자원을 사용하는 듯 했습니다,
물론 지난번 질문드린 전체 테이블의 컬럼별 GROUP BY COUNT 했을때의 경우고 이번에 질문 드린 건은 제가 다시 테스트를 진행 해 보고 댓글 달겠습니다.
감사합니다.
서버 이전 관계로 그 동안 테스트를 해 보지 못하고 금일에야 하게되었습니다.
우선 결론부터 말씀 드린면 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이 되어서 예상과는 다른 결과 였던 것 같습니다.
어찌되었건 좋은 시간 이었습니다. 오랜만에 예전 생각도 나고 테스트 해보면서 즐거웠습니다. 그리고 결과적으로 시간이 비슷하였다 해도 수작업으로 일일이 작성하지 않는 방법을 알게 된 것만도
크게 감사할 따름 입니다. 앞으로도 계속 방문하여 다양하고 좋은 예제 참고 하겠습니다.
다시 한번 감사 드리면 환절기 건강들 유의 하세요 !!!!