본문 바로가기

공부/DB6

[SQL] ROWNUM 적용한 페이징 쿼리 SELECT A.* FROM (SELET ROWNUM AS RNUM , EMPL.PERS_NO , INFO.KOR_NM , EMPL.STAFF_FG FROM ( SELECT PERS_NO , STAFF_FG FROM EMPL WHERE ROWNUM = '1' 사실, 대용량이라고 하기도 애매한 건수이지만, 어쨌든 성능이 안나오는 쿼리에 페이징을 적용해야 할 일이 생겼다. 대충 위와 같은 방식으로 쿼리를 짜 페이징 적용을 했다. ROWNUM 을 사용한 것 외에도, 안쪽 테이블에 직접 INFO 테이블을 LEFT 조인을 걸고 있었는데 이를 바깥으로 빼 페이징이 적용된 데이터들만 가지고 조인을 하도록 했다. 페이징 쿼리를 짜는 방법에 따라 속도가 조금씩 차이가 나는 것 같다. 기존 쿼리에는 안쪽 EMPL 테이블 .. 2021. 2. 20.
쿼리(LEAD) SELECT PERS_NO , A.OFORD_FR_DT , CASE WHEN LEAD(A.OFORD_FG_CD) OVER (ORDER BY A.PERS_NO, A.OFORD_SEQ) LIKE 'D%' THEN LEAD(A.OFORD_FR_DT) OVER (ORDER BY A.PERS_NO, A.OFORD_SEQ) ELSE A.OFORD_TO_DT END AS OFORD_TO_DT FROM TABLE A ORDER BY A.PERS_NO, A.OFORD_SEQ 오늘은 LEAD 구문을 썼다. 특정 컬럼을 기준으로 정렬하여 자기보다 바로 다음 행의 값을 가져올 수 있음. 2021. 2. 18.
[SQL] ROWNUM = 2 쿼리를 짜다보면 ROWNUM 을 쓸 일이 종종 있다. ROWNUM = 1 의 경우 가장 상위 행을 가져오는 구문이지만, ROWNUM = 2 조건은 아무런 행을 가져오지 않는다. 보통 ROWNUM = 2 라는 조건을 사용하고 싶은 경우는, 특별한 기준으로 데이터를 정렬 후 2번째 순위에 있는 데이터를 뽑고 싶을 때 일 것이다. 일단 ROWNUM = 2 과 같은 조건을 사용하고 싶을 땐, 쿼리문을 한번 더 감싸서 바깥 쿼리문에서 조건을 걸어주면 된다. SELECT FROM ( SELECT ROWNUM AS RNUM , AAA FROM TBL ORDER BY AAA ) T WHERE T.RNUM = 2 다음과 같이 ROWNUM 을 사용하면 원하는 결과를 추출 가능하다. 그렇다면 왜 ROWNUM = 2 는 내가.. 2021. 1. 15.
[SQL] Order by 문 변형 2021. 01. 15 오늘 짜려는 쿼리 중 order by 를 사용하여야 하는 부분이 있었다. 학기 코드 컬럼이 있었는데 '1', 'S', '2', 'W' 와 같은 형식의 코드로 저장되는 컬럼이었다. S, W 는 각각 여름학기, 겨울학기로 1학기 다음이 S, 2학기 다음이 W 순서로 정렬이 되어야만 했다. 이처럼 문자와 숫자가 함께있는 경우엔 어떻게 Order by 를 사용해야 하는지 고민했다. Case when 문으로 각각의 코드를 다시 1,2,3,4 와 같은 코드형식으로 치환하여 한번 더 쿼리문을 감싸 정렬해야 하나, 고민하던 중, Order by 문에 Decode 를 쓰는 방법을 생각했다. ORDER BY DECODE(SHTM_CD, '1', '1', 'S', '2', '2', '3','W', '.. 2021. 1. 15.
[중첩루프조인] 오라클 조인 Nested Loop Join Nested Loop Join 두 개 이상의 테이블 구조에서 하나의 테이블(Driving/Outer Table)을 기준으로, 순차적으로 (Driven/Inner Table)의 Row 를 조인하여 원하는 데이터를 추출하는 방식의 조인. 추출되는 Row 가 많아질 수록 성능이 현저히 떨어지고, 성능을 높이기 위해서는 Driving Table 의 크기가 작을수록 유리. Inner Table 은 조인되는 컬럼으로 인덱스가 구성되어 있어야 함. 선행(드라이빙) 테이블의 크기 NL 조인은 흔히 loop 문에 비교한다. for(int i = 0 ; i < A.length; i++) { // 선행테이블 for(int j = 0; j < B.length; j++) { // 후행테이블 } } 위 for 문을 예로 들어보면.. 2019. 12. 2.
오라클 튜닝 2019.09.22 [튜닝공부] 1. 내부적 형변환 만일, 인덱스에 포함되어 있는 컬럼을 조건에 걸어줬는데도 full scan 을 하는 경우가 있다면, 인덱스의 컬럼 데이터 형 또한 고려해주어야 한다. 인덱스 컬럼이 varchar 형인데 불구하고, 숫자로 조건을 걸어주었다면 이를 위해 컬럼의 값을 숫자로 형변환한다. 따라서, 인덱스가 걸리지 않고 full scan 을 타는 경우가 존재한다고 한다. 출처 : 구루비 http://www.gurubee.net/lecture/2122 데이터타입 불일치 예제 튜닝 전 첫 번째 예제는 데이터타입이 틀릴 경우 인덱스를 사용하지 못하는 내용이다. 아래의 내용을 보면, EMP 테이블에 EMPNO_VARCHAR 컬럼으로.. www.gurubee.net 2. 외부적 형변환 .. 2019. 9. 22.