안녕하세요..
오랜만에 문의 드립니다.
쿼리 좀 부탁드려요^^;
KBC 라는 테이블이 있는데요..
이 테이블의 칼럼중에 인덱스컬럼는 여러개칼럼이 있지만 그중 ETC 라는 컬럼도 인덱스로 되어 있는데요.
ETC 칼럼을 SUBSTR로 잘라서 이 컬럼의 중복테이타를 모두 찾을려고 합니다.
그냥 일반적으로 SUBSTR(ETC,1,3) 으로 해서 그룹바이 해서 찾으니 너무 오래걸립니다. 인덱스가 깨지니..
빠른방법 없을까요? 건수가 아닌 중복데이타가 전부 조회되게요..
참고로 KBC테이블전체건수는 약 3억건 정도입니다. ETC칼럼의 인덱스명은 ETC_IDX 입니다.
저는 그냥 아래처럼 했는데..너무 오래걸랴서 끝날 생각을 안합니다.
SELECT * FROM (
SELECT ECT,RCE,RCID, COUNT(1) OVER(PARTITION BY SUBSTR(ETC,1,3) ORDER BY NULL) NO
FROM KBC A)
WHERE A.NO >1;
혹시 HINT 나 다른 빠른 쿼리 있으면 부탁드립니다...
function-based index 가 없다면 시스템 여유 있을때 세션 MBRC 지정 후 full, parallel 돌리는 방법 정도가 가능할것 같습니다. (숫자는 환경에 적절하게 설정)
ex) alter session set db_file_multiblock_read_count = 128;
SELECT /*+ full(a) parallel(a 4) */ ...
ect, rce, rcid 이 항목들이 하나의 인덱스 안에 포함된다면 모를까?
그게 아니라면 어차피 인덱스 탈 수 없는 상황입니다.
Substr 과는 연관이 없어 보이네요.
그냥 전체 데이터 건수가 많아서 느린걸로 보입니다.
기타...
Order By Null 구문은 불필요한 구문입니다. ==> 생략 가능
Count(1) 또한 오해로부터 시작된 잘못된 습관인 듯 합니다. ==> Count(*)