고급 SQL

clover·2023년 5월 24일

DB

목록 보기
2/3

analyze table t compute statistics; ... 테이블 분석



why we use bind variables in sql?

_The "compiling" is known as a hard parse. The "re-use" is known as a soft parse. A hard parse is very expensive.

A typical benchmark on Oracle 10.1 on a Sun dual AMD platform. Running the following selects a 100,000 times:
SELECT count() FROM table WHERE id =
SELECT count(
) FROM table WHERE id = :BINDVARIABLE

A 100,000 executions of the 1st SELECT (each with a different hardcoded number) ran in 24 min 51 sec.

A 100,000 executions of the 2nd SELECT (using a bind variable) took 08 seconds.

The reason for the huge performance difference?

A 100,000 hard parses versus 1 hard parse and 99,999 soft parses._

하드파싱은 최대한 적게!

  • 커서를 많이 생성하지 않고 하나를 반복 재사용하므로 메모리 사용량과 파싱 소요 시간을 줄여줌

  • 시스템 전반의 메모리와 cpu 사용률을 낮춰 데이터베이스 성능과 확장성을 높이는데 기여함

  • 동시 사용자 접속이 많을 때 유리

  • 바인드변수 사용하지 않으면 라이브러리 캐시 경합으로 인해 시스템 정상 가동이 어려운 상황이 발생할 수 있음

  • 종목별 프로시저 생성하는 것보다 바인드변수 처리하는 것이 훨씬 좋음
    ex) select from 거래 where 종목 = :종목
    -변수 바인딩 시점 = 최적화 시점보다 나중인 실행 시점



    side effect of bind variables usage

  • 최적화하는 시점에 조건절 컬럼의 데이터 분포도를 활용하지 못함 (컬럼 히스토그램 정보를 사용하지 못함)

  • 정확한 컬럼 히스토그램에 근거하지 않고 카디널리티를 구하는 정해진 계산식에 기초해 비용을 계산하므로 최적이 아닌 실행계획을 수립할 가능성이 높음

  • 파티션 테이블을 쿼리할 때 파티션 레벨 통계 정보를 이용하지 못하고 파티션 레벨 통계보다 다소 부정확한 테이블 레벨 통계를 이용함으로써 옵티마이저가 가끔 악성 실행계획을 수립함


    cf. 컬럼 히스토그램
    http://wiki.gurubee.net/pages/viewpage.action?pageId=3080226


    http://dbcafe.co.kr/wiki/index.php/%EC%98%A4%EB%9D%BC%ED%81%B4_%ED%9E%88%EC%8A%A4%ED%86%A0%EA%B7%B8%EB%9E%A8


    cf. sql 튜닝 방법론
    https://scidb.tistory.com/entry/SQL%ED%8A%9C%EB%8B%9D-%EB%B0%A9%EB%B2%95%EB%A1%A0


    static sql = embeded sql
    string형 변수에 담지않고 코드 사이에 직접 기술한 sql문

    dynamic sql
    string형 변수에 담아서 기술하는 sql문

    cf. static sql과 dynamic sql은 바인드 변수 사용 여부로 구분하는 것이 아님

    dynamic sql을 사용해서 라이브러리 캐시 효율이 떨어지는 것이 아니라 바인드 변수를 사용하지 않아서 효율이 떨어지는 것임
    바인드 변수 사용하지 않고 리터럴 값을 sql 문자열에 결합하는 방식으로 개발시 반복적 하드파싱으로 성능 저하, 그로 인해 라이브러리 캐시에 심한 경합이 발생
    static sql을 지원하면 static sql로 작성하는 것이 원칙

0개의 댓글