DB 37

선행 컬럼의 distnct 값이 많지 않은 경우(특히 일자) 튜닝 방법 한가지

1. 특정 테이블의 date1은 YYYYMMDD 형식의 일자 형태의 문자열 컬럼 (8 byte) table1은 수백만건 index: date1(col1) select distinct date1 from table1 date1에 index가 있더라도 index 전체를 읽어야 하기 때문에 일량이 크다. -> YYYYMMDD 형식을 갖는 임의 테이블을 만들고 원 테이블의 MIN/MAX값을 범위로 지정하고, SEMI JOIN 방식으로 한 건씩 나올때 마다 루프에서 나오도록 튜닝 (temp_date 라는 테이블을 어느정도(table1을 모두 커버 가능한) 범위의 YYYYMMDD 값을 갖는 date2 라는 컬럼을 갖도록 만들고(인덱스 추가) 아래 SQL 처럼 튜닝 가능함) select d.date2 from tem..

DB 2011.09.19

min/max 쿼리 튜닝시 random access 감소를 위한 목적으로 index_desc + rowid 사용시 주의할 것

INDEX 컬럼 순서에 따라 결과 값이 달라진다. 결과적으로, select * from ( 메인 쿼리(/*+ index_desc */) order by min/max대상) where rownum = 1 과 같이 한번 감싸줘야 의도한 대로 결과값이 나온다. (다소 성능은 감소되지만... index drop 이나 unusable, plan 변경으로 인한 데이터 오류보다 무섭진 않겠지...) 아래는 test script. drop table test5 cascade constraints purge; create table test5 (a number, b number, c number); insert into test5 values (1, 1, 6); insert into test5 values (1, 3, ..

DB 2011.05.25

OracleDataSource 를 이용한 Connection Pooling

Java Stored Procedure 에서도 외부 DB 연결시 사용 가능하나, 사전에 아래와 같이 권한이 있어야 함.exec dbms_java.grant_permission('schemaName', 'SYS:java.net.SocketPermission', 'host:port', 'connect,resolve'); package test; import java.sql.*;import javax.sql.PooledConnection;import oracle.jdbc.pool.OracleConnectionCacheManager; import oracle.jdbc.pool.OracleConnectionPoolDataSource; import oracle.jdbc.pool.OracleDataSource;pub..

DB 2010.12.03

[SQL] 행 -> 열 전환, 행을 하나의 열로 합치기

행 -> 열 전환 [C1][C2] ID1T ID2T ID2S ID2P ID3T ID3P 위와 같을 때 아래와 같이 행을 열로 한번에 나타내고 싶을 때? [C1] [T][S][P] ID1Y ID2YYY ID3YY [Sol.] SELECTC1, MAX(DECODE(C2, 'T', 'Y', NULL)) "T", MAX(DECODE(C2, 'S', 'Y', NULL)) "S", MAX(DECODE(C2, 'P', 'Y', NULL)) "P" FROMTABLE GROUP BYC1 ORDER BYC1 --------------- 행을 하나의 열로 합치기 SELECT REPLACE(MAX(SYS_CONNECT_BY_PATH(data, '/#/')), '/#/', '') FROM ( SELECT ROWNUM rn, t..

DB 2010.10.12

ORA-01461 can bind a LONG value only for insert into a LONG column 오류 대응

LONG 타입 컬럼이 없는데도 위와 같은 오류가 발생해서 검색을 해보았다. 1. 라이브러리의 ojdbc14.jar, classes12.jar 파일의 버전을 서버의 버전과 맞출 것 2. 10.2.0.1 부터는 문제 해결되었다고 함 (대응 jdbc 라이브러리 필요) 3. Statement 를 사용하면 해결됨 위와 같은 설명 정도가 나왔는데, 해결이 안되어 분석을 해보니 변수에 값을 bind 할때 4000 byte 가 넘는 문자열을 bind 하고 있었다. getBytes 등으로 적절히 encoding 하여 문자열을 자른후 입력하니 해결.

DB 2010.04.09