가. SQL 파싱(Parsing)
파싱종류
소프트파싱 (Soft Parsing) | SQL과 실행계획을 캐시에서 찾아 곧바로 실행단계로 넘어가는 경우 |
하드파싱(Hard Parsing) | SQL과 실행계획을 캐시에서 찾지 못해 최적화 과정을 거치고 나서 실행단계로 넘어가는 경우 |
나. 최적화(Optimization)
최적화 과정
가. 실행계획 공유 조건
중요
나. 실행계획이 공유하지 못하는 경우
가. 바인드 변수의 중요성
procedure LOGIN_TOMMY() { ... }
procedure LOGIN_KARAJAN() { ... }
procedure LOGIN_JAVAKING() { ... }
procedure LOGIN_ORAKING() { ... }
procedure LOGIN(login_id in varchar2) { ... }
SELECT * FROM CUSTOMER WHERE LOGIN_ID = :LOGIN_ID; << 바인드변수
바인드변수를 사용했을때의 효과
바인드 변수를 사용하지 않아도 되는 예외상황
나. 바인드변수 사용시 주의사항
다. 바인드 변수 부작용을 극복하기 위한 노력
가. Static SQL
int main()
{
printf("사번을 입력하십시오 : ");
scanf("%d", &empno);
EXEC SQL WHENEVER NOT FOUND GOTO notfound;
EXEC SQL SELECT ENAME INTO :ename
FROM EMP
WHERE EMPNO = :empno;
printf("사원명 : %s.\n", ename);
notfound:
printf("%d는 존재하지 않는 사번입니다. \n", empno); }
나. Dynamic SQL
int main()
{
char select_stmt[50] = "SELECT ENAME FROM EMP WHERE EMPNO = :empno";
// scanf("%c", &select_stmt); → SQL문을 동적으로 입력 받을 수도 있음
EXEC SQL PREPARE sql_stmt FROM :select_stmt;
EXEC SQL DECLARE emp_cursor CURSOR FOR sql_stmt;
EXEC SQL OPEN emp_cursor USING :empno;
EXEC SQL FETCH emp_cursor INTO :ename;
EXEC SQL CLOSE emp_cursor;
printf("사원명 : %s.\n", ename);
}
다. 바인드 변수의 중요성 재강조
for(;;) {
EXEC ORACLE OPTION (HOLD_CURSOR=YES);
EXEC ORACLE OPTION (RELEASE_CURSOR=NO);
EXEC SQL INSERT ...... ; // SQL 수행
EXEC ORACLE OPTION (RELEASE_CURSOR=YES);
}
call count cpu elapsed disk query current rows
----- ------ ----- ------- ----- ------- ------ -----
Parse 1 0.00 0.00 0 0 0 0
Execute 5000 0.18 0.14 0 0 0 0
Fetch 5000 0.17 0.23 0 10000 0 5000
----- ------ ----- ------- ----- ------- ------ -----
total 10001 0.35 0.37 0 10000 0 5000
Misses in library cache during parse: 1
public static void CursorCaching(Connection conn, int count) throws Exception{
// 캐시 사이즈를 1로 지정
((OracleConnection)conn).setStatementCacheSize(1);
// 묵시적 캐싱 기능을 활성화 ((OracleConnection)conn).setImplicitCachingEnabled(true);
for (int i = 1; i <= count; i++) {
// PreparedStatement를 루프문 안쪽에 선언
PreparedStatement stmt = conn.prepareStatement(
"SELECT ?,?,?,a.* FROM emp a WHERE a.ename LIKE 'W%'"); stmt.setInt(1,i);
stmt.setInt(2,i); stmt.setString(3,"test");
ResultSet rs=stmt.executeQuery();
rs.close();
// 커서를 닫더라도 묵시적 캐싱 기능을 활성화 했으므로 닫지 않고 캐시에 보관하게 됨
stmt.close();
}
}
public static void CursorHolding(Connection conn, int count) throws Exception{
// PreparedStatement를 루프문 바깥에 선언
PreparedStatement stmt = conn.prepareStatement(
"SELECT ?,?,?,a.* FROM emp a WHERE a.ename LIKE 'W%'");
ResultSet rs;
for (int i = 1; i <= count; i++) {
stmt.setInt(1,i);
stmt.setInt(2,i);
stmt.setString(3,"test");
rs=stmt.executeQuery();
rs.close();
} // 루프를 빠져 나왔을 때 커서를 닫는다.
stmt.close();
}
[J STORY] SQLP - 데이터베이스 I/O 원리 (0) | 2021.04.26 |
---|---|
[J STORY] SQLP - 데이터베이스 CALL과 네트워크 부하 (1) | 2021.04.25 |
SQLP - 인덱스 기본 (0) | 2021.04.24 |
SQLP - 데이터베이스 아키텍처 (0) | 2021.04.24 |
[J STORY] SQLP - 조인 수행 원리 (0) | 2021.04.22 |
댓글 영역