인덱스 칼럼을 SUBSTR 로 해서 중복조회 0 2 1,005

by sm5 [SQL Query] [2014.11.06 11:49:29]


안녕하세요..

오랜만에 문의 드립니다.

쿼리 좀 부탁드려요^^;

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 나 다른 빠른 쿼리 있으면 부탁드립니다...

 

 

 

by 비주류 [2014.11.06 12:07:11]

function-based index 가 없다면 시스템 여유 있을때 세션 MBRC 지정 후 full, parallel 돌리는 방법 정도가 가능할것 같습니다. (숫자는 환경에 적절하게 설정)

ex) alter session set db_file_multiblock_read_count = 128;

SELECT /*+ full(a) parallel(a 4) */ ...

 


by 마농 [2014.11.06 13:11:07]

ect, rce, rcid 이 항목들이 하나의 인덱스 안에 포함된다면 모를까?
그게 아니라면 어차피 인덱스 탈 수 없는 상황입니다.
Substr 과는 연관이 없어 보이네요.
그냥 전체 데이터 건수가 많아서 느린걸로 보입니다.


기타...
Order By Null 구문은 불필요한 구문입니다. ==> 생략 가능
Count(1) 또한 오해로부터 시작된 잘못된 습관인 듯 합니다.  ==> Count(*)

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