Oracle, MySQL, Goldilocks 등을 활용하여 개발하시는 분들의 쿼리를 보다보면, 쿼리문에 WHERE 1 = 1 을 쓰는 모습을 종종 볼 수 있었습니다.아무래도 소스상의 가독성 때문에 이렇게 사용하는 분들이 많이 있을텐데요. WHERE 1 = 1 의 구문이 없는 소스의 경우와 있는 소스를 보면 가독성에 차이가 있습니다.mozi.append(" SELECT ID, AGE "); mozi.append(" FROM MOZI "); mozi.append(" WHERE "); if ( ID != null ){ mozi.append(" ID = 91 "); } if ( AGE != null) { if ( ID != null ) { mozi.append(" AND AGE = 28"); }else{ mo..
Oracle
오라클은 다중 테이블을 조인하여 데이터를 갱신하는 기능을 지원합니다. T1 테이블 A1, A2, A3 컬럼, T2 테이블 B1, B2, B3 컬럼에서 A2 와 B2 의 데이터가 같고 A1 의 데이터가 1 인경우 A3 을 B3 으로 업데이트 한다고 합니다.CREATE TABLE A ( A1 INT, A2 INT, A3 INT ); CREATE TABLE B ( B1 INT, B2 INT, B3 INT ); INSERT INTO A VALUES (1, 3, 3); INSERT INTO B VALUES (1, 3, 5); COMMIT;UPDATE 문은 다음과 같이 작성할 수 있습니다.UPDATE A SET A3 = ( SELECT B3 FROM B WHERE A.A2 = B.B2 AND A.A1 = 1 );이..
SQL 의 성능은 시스템 운영에 매우 중요합니다.예를들어 사용자가 평소 1초내로 응답받던 결과가, 갑자기 느려지면 사용자는 그 서비스를 더이상 사용하지 않을수도 있습니다. 이번 포스팅은 SPM(SQL Plan Management 실행계획 관리) 을 통해 SQL 성능이 갑자기 느려졌을 때, 대처하는 방법입니다. SPM 을 관리함으로써 아래와 같은 효과를 얻을 수 있습니다. - 성능 안정화 - 성능 개선 먼저 SPM 아키텍처에 대해 알아봅니다.SPM 은 SQL 성능이 저하될 경우를 대비해 미리 실행계획을 저장합니다.이렇게 저장된 실행계획은 'SQL 계획 베이스라인' 이라고 불립니다.실행계획은 SQL 단위로 다수개가 저장될 수 있습니다. SPM 은 SQL 관리 베이스라는 딕셔너리 뷰에서 관리되며, SYSAUX..
ORACLE 은 대량의 레코드 적재를 FORALL 키워드 를 이용하여, 벌크로 적재하는 기능을 제공합니다.또한 이런 기능을 BULK INSERT 라고 칭합니다. 벌크 INSERT 는 레코드를 배열의 값에 저장하고 한번에 INSERT 하는 작업을 수행합니다. 예를들어서 테이블이 아래와 같은 경우,CREATE TABLE MOZI ( C1 NUMBER, C2 NUMBER ); 레코드를 3건 넣기 위해서는 INSERT 구문을 3번 수행해야 합니다.SQL> INSERT INTO MOZI VALUES (1, 1); SQL> INSERT INTO MOZI VALUES (2, 2); SQL> INSERT INTO MOZI VALUES (3, 3); SQL> COMMIT; 반면, FORALL 을 사용하여 데이터를 배열에..
ORACLE 은 SQL 을 병렬 힌트를 부여하여 실행하는 기능을 제공합니다.이 기능을 사용하면 어플리케이션 쪽에서 소스를 수정하지 않아도 되므로, 많은 이점이 있습니다. 병렬 힌트란, 데이터를 가져오는 작업을 단일이 아닌 멀티로 진행하여 빠른 응답을 제공받습니다. 병렬 쿼리 사용 방법먼저, 병렬처리가 가능하도록 세션에 권한을 부여합니다.SQL> ALTER SESSION ENABLE PARALLEL DML; Session altered.병렬 쿼리는 PARALLEL 힌트를 사용하여 활성화 합니다. 괄호안의 수는 멀티 작업 스레드를 의미합니다.SQL> SELECT /*+ PARALLEL (4) */ 2 C1, C2 3 FROM 4 MOZI; C1 C2 ---------- ---------- 1 1 2 2 병렬..
실행 계획(Plan) 이란, 결과를 도출하기 위해 어떤 방법 혹은 순서로 데이터에 접근할지를 나타내는 것을 의미합니다. 접근 방식은 테이블 스캔과, 인덱스 스캔으로 나뉘어집니다.이 접근 방식은 테이블의 데이터 량에 따라 성능차이가 발생할 수 있습니다. 예를 들어 보겠습니다. 테이블에 데이터가 1건이 있는 경우, 학번 1001 을 검색하기 위해선, 아래 그림 중 어느 게 빠를까요?테이블에 데이터가 10,000 건(엄청 많음을 의미)이 있는 경우, 학번 1001 을 검색하기 위해선, 아래 그림 중 어느게 빠를까요? 테이블의 건수가 많은 경우테이블 스캔은 수많은 데이터중 1건을 스캔해야 하지만,인덱스 스캔은 1001 이라는 데이터에 접근한 뒤, 이 주소를 이용하여 테이블에 접근하면 되므로 성능에서 이점이 생깁..
오라클 설치시 SID 가 이미 존재한다는 오류와 함께 설치가 진행되지 않은 경우가 있습니다. 이때에는 /etc/ 경로의 oratab 파일을 삭제한 뒤 다시 설치를 진행하면 됩니다.# cd /etc # rm oratab rm: remove 일반 파일 `oratab'? y
TEST 명으로 된 계정 혹은 롤이 없는 상황에서ORACLE 에 TEST 계정을 생성하려고 하는데 아래와 같은 오류가 나왔습니다. ORA-65096: invalid common user or role name SQL> drop user test; drop user test * ERROR at line 1: ORA-01918: user 'TEST' does not exist SQL> drop role test; drop role test * ERROR at line 1: ORA-01919: role 'TEST' does not existSQL> create user test identified by test; create user test identified by test * ERROR at line 1:..
이전 포스팅에서 나온 오류를 해결 한 후, 계속해서 프로그램을 짜던 중아래와 같은 에러코드를 다시한번 뱉습니다.[ERROR] Insert Execute Failure! SQLCODE : -1001 ERROR MSG : ORA-01001: invalid cursor 오라클 공식문서에서도 뾰족한 해결방법도 안나와있고, 그냥 커서가 적합하지 않다라고만 되어있어서 많이 해멨습니다. 기존에 컴파일한 Makefile 방식과 에러가 나온 부분의 소스는 아래와 같았습니다.TARGET = sh CC = gcc PROC = proc LIB = -L$(ORACLE_HOME)/lib -lclntsh -lpthread -ldl -lm -lrt -lodbc MYINC = include/ PROCINC = include=$(ORA..
Pro*C 를 짜던 중 아래와 같은 에러코드를 자꾸 뱉습니다.[ERROR] Insert Execute Failure! SQLCODE : -2122 ERROR MSG : SQL-02122: Invalid OPEN or PREPARE for this database connection 오라클 사이트에서 찾아보면, 아래처럼 해결하라고 나와있습니다.Close the cursor to make it available for this connection or use a different cursor for this connection. 대충해석해보자면, 현재 세션이 사용하고 있는 커서를 닫거나, 다른 커서를 사용하세요. 라고 되어있습니다. 데이터베이스를 재구동 해봐도 마찬가지로 발생합니다.SID 별 열려있는 커서를..