ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • statement vs prepared statement vs callable statement interface
    CS 지식/데이터베이스(Database) 2023. 5. 4. 23:10

    SQL 실행 단계

    1) Parsing(쿼리 문장 분석)

    2) Compile

    3) Execute(실행)

     

    https://www.javatpoint.com/query-processing-in-dbms

     

    Statement

    - used to execute string-based SQL queries

    - SQL string을 concatenate 하기 때문에 less readable

    public void insert(PersonEntity personEntity) {
        String query = "INSERT INTO persons(id, name) VALUES(" + personEntity.getId() + ", '"
          + personEntity.getName() + "')";
    
        Statement statement = connection.createStatement();
        statement.executeUpdate(query);
    }

    - SQL injection에 취약

    - 데이터베이스로 query with inline values를 넘기기 때문에 query optimization을 하지 않고 database engine이 모든check를 다 해야 함. 

    - cache 사용 X 

    - CREATE, ALTER, DROP 같은 DDL(Data Definition Language) query에 적합

    (성능은 다른 둘에 비해 가장 낮음. 특정 쿼리를 한번만 실행할 때 선호됨)

    - file이나 array를 저장하거나 얻을 때는 활용 불가.

     

    장점

    - DDL(CREATE, ALTER, DROP) 작성에 적합.

     

    단점

    - cache 활용을 하지 못해 parsing 부분을 매 요청마다 수행하므로 query 처리 비용이 더 들게 됨. 

     

    ** SQL injection에 취약할 수 있으므로 필터나 방어 로직을 추가하여 사용

     

     

     

    Prepared Statement

    - used to execute parameterized SQL queries

    - PreparedStatement는 Statement interface를 상속받음.

    - run time에 parameter를 SQL query로 pass 할 수 있음.

    - 다양한 object type들을 bind 하는 메서드가 있음. 

    - Statement 보다 code를 이해하기 쉬움.

    public void insert(PersonEntity personEntity) {
        String query = "INSERT INTO persons(id, name) VALUES( ?, ?)";
    
        PreparedStatement preparedStatement = connection.prepareStatement(query);
        preparedStatement.setInt(1, personEntity.getId());
        preparedStatement.setString(2, personEntity.getName());
        preparedStatement.executeUpdate();
    }

    - SQL injection으로부터 보호 가능

    - pre-compilation 활용. database가 query를 얻자마자 query를 pre-compiling 하기 전에 cache 확인. 

    cache 되어있지 않으면 database engine은 다음 사용을 위해 캐시에 저장.

    - 쿼리 실행 계획 분석과 컴파일이 완료되어서 DBMS의 캐시에 준비되어 있는 쿼리를 사용한다는 의미

    - database와 JVM 사이에서 non-SQL binary protocol을 통해 더 빨리 소통 가능

    (packet에 data 양이 적어서 더 빨리 소통 가능.)

    - file을 저장하거나 얻는 쉬운 방법 (BLOB, CLOB 데이터 타입을 활용). list 저장도 가능. 

    - 특정 SQL query를 여러 번 실행할 때 유용. precompiled되어 있고, query plan이 한 번만 생성되기 때문.

     

    장점

    - SQL injection 예방 가능. 

    - cache에 저장된 query 활용해서 statement 보다 실행이 빠름

     

    단점

    - query에 오류가 생긴 경우 분석하기 어려움. bind변수 부분이 '?'로 나오므로 실제 실행된 query를 확인하는 것이 어려움. 

     

     

    ** 그렇다고 모든 Query에 Statement 대신 PreparedStatement만 사용한다면 모든 Query가 compile 되어 Caching 영역의 한계로 정작 Caching 되어야 할 query가 그렇게 되지 못할 가능성이 커짐.

    -> 성능상 caching 되길 원하는 query에 적용하는 것이 좋음.

     

     

     

    Callable Statement

    - database stored procedures 실행할 때 사용. 

    - PreparedStatement 상속받음. 

    - stored procedure에게 3 종류의 parameter를 pass 할 수 있음. 

    IN : pass the values to stored procedure

    OUT : hold the result returned by the stored procedure

    IN OUT : IN과 OUT parameter 기능 모두 수행

    - 셋중에 가장 성능이 높음. 이미 compile 되어 있고, database server에 저장되어 있기 때문.

     


    Statement vs PreparedStatement vs CallableStatement 사용 case

    https://www.tutorialspoint.com/jdbc/jdbc-statements.htm

    Statement : execute static SQL queries

    PreparedStatement : execute dynamic or parameterized SQL queries

    CallableStatement : execute stored procedures

     

     

     

     

     

     

     

     

     

    Further Topics

    • SQL DDL, DML, DCL
    • Database Engine
    • 동적 쿼리, 정적 쿼리
    • SQL query processing steps including query plan
    • relational-algebra

     

     

    References

     

     

    'CS 지식 > 데이터베이스(Database)' 카테고리의 다른 글

    Transaction Isolation Level(트랜잭션 격리 수준)  (0) 2023.04.25
    Transaction  (0) 2023.04.25
    SQL vs NoSQL  (0) 2023.04.21
    SQL - injection  (2) 2023.04.19
    Relational Model과 Key의 종류  (0) 2023.04.17
Designed by Tistory.