본문 바로가기
SQLP Study/Database Call

04 Array Processing 활용

by bash park 2020. 4. 12.

04 Array Processing 활용

# Array Processing 기능을 사용하면 한번의 SQL수행으로 다량의 로우를 insert/update/delete 할수 있다.
  이를 통해 Network를 통한 데이터베이스 Call을 감소시켜 SQL수행시간과 CPU 사용량을 줄일 수 가 있다.

# 예시상황 : "03 데이터베이스 Call이 성능에 미치는 영향"에 있는 예시상황 
1) 3만건인 월요금납부실적 테이블에서 각로우를 fetch하여 읽은 다음 조건에 맞게끔
   납입방법별_월요금집계 테이블에 중복삽입
2) stmt1.setFetchSize(1000); 구문을 통해 월요금납부실적 테이블을 fetch 할때 1000건씩 fetch
3) select시 fetch call    : 30
   insert시 execute call : 30
4) fetch Array processing size   : 1000 (=Fetch Size)
   execute Array processing size : 5000

---------------------------------------------------------------------------------------------------------------------------------
public static void execute (Connection con , String i nput month) 
throws Exception { 
   long rows 0;
   String SQLStmtl "SELECT 고객번호, 납입월 "
               + ", 지로, 자동이체, 신용카드, 핸드폰, 인터넷"
               + "from 월요금납부실적"
               + "where 납입월 ? ";
   String SQLStmt2 "INSERT INTO 납입방법별_월요금집계 " 
               +"(고객변호, 납입월,납입방법묘드, 납입금액) "
               + "VALUES (?, ?, ?, ?)";
con. setAutoCommit(false);
PreparedStatement stmtl = con.prepareStatement(SQLStmt1);
PreparedStatement stmt2 = con.prepareStatement(SQLStmt2);
stmt1.setFetchSize(1000);
stmtl.setString(1, input month);
ResultSet rs = stmtl.executeQuery();

while(rs.next()) {
   String 고객변호 = rs.getString(1);
   String 납입월 = rs.getString(2);
   long 지로 = rs.getLong(3);
   long 지동이체 = rs.getLong(4);
   long 신용카드 = rs.getLong(5);
   long 핸드폰 = rs.getLong(6);
   long 인터넷 rs.getLong(7);
   if( 지로 > 0 )
      insertData (con, stmt2, 고객변호, 납입월, "A", 지로);
   if ( 지동이체 > 0 )
      insertData (con, stmt2, 고객번호, 납입월, "B", 지동이체);
   if ( 신용카드 > 0 ) 
      insertData (con, stmt2, 고객변호, 납입월, "C", 신용카드);
   if ( 핸드폰 > 0 ) 
      insertData (con, stmt2, 고객변호, 납입월, "D" , 핸드폰);
   if ( 인터넷 > 0 )
      insertData (con, stmt2, 고객변호, 납입월, "E" , 인터넷) ;
   if(++rows%1000 == 0) stmt2.executeBatch();
}
---------------------------------------------------------------------------------------------------------------------------------

# Array processing의 효과를 제대로 발휘하려면, 연속된 일련의 처리과정이 모두 Array 단위로 지정되어야 한다.
   ex : insert select문 - select (fetch), insert(execute)의 각각의 단계에서 
         Array processing size가 일치해야한다. 만약 select에서 5000건식 Fetch를 한다 하더라도,
         insert 단계에서, 건건이 execute를 수행하면, 병렬로부터 직렬로 처리되는 부분이 병목현상을 야기하기 때문에
         쿼리 처리속도가 빠르지 않다.


댓글