지난번 "대량테이블 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이 되어서 예상과는 다른 결과 였던 것 같습니다.
어찌되었건 좋은 시간 이었습니다. 오랜만에 예전 생각도 나고 테스트 해보면서 즐거웠습니다. 그리고 결과적으로 시간이 비슷하였다 해도 수작업으로 일일이 작성하지 않는 방법을 알게 된 것만도
크게 감사할 따름 입니다. 앞으로도 계속 방문하여 다양하고 좋은 예제 참고 하겠습니다.
다시 한번 감사 드리면 환절기 건강들 유의 하세요 !!!!
이렇게 테스트 수행 결과를 올려 주니 좋네요.
ROWNUM 조건이 있는 개별 쿼리가 더 빠를 것 같았는데. 비슷하군요.
어느 정도 걸리는지도 구체적으로 올려주시면 참고할만한 좋은 정보가 될 것 같습니다.
혹시나 하고 들어와 봤는데 역시 하나하나 다 확인하시고 답변을 주시네요(감사할 따름)
위 테스트 내용은 메모를 하질 않아서 다시 올릴수는 없지만 다음 부터는 좀더 상세하게 내용을 정리해서 올리겠습니다.
그간 배운 내용이 많아서 늘 감사했는데 저도 익히고 다른분들께도 꼭 공유 하겠습니다.