생계/튜닝2025. 6. 21. 15:57
반응형

앞선 포스팅에서 소프트 파싱과 하드파싱을 정리한 글에서 

바인드 피킹 기능 한계 및 보완으로 ACS 가 새로 도입이 되었다고 했는데 더 자세히 알아보자

1. ACS 등장 배경 

 1) 리터럴 SQL 사용
  - 동일 구조 쿼리에서 입력값이 동일하지 않은 경우 하드파싱 부하 
 
 2) bind 변수 사용 SQL 
 - 바인드변수 사용으로 동일 SQL ID 를 사용, 하드파싱 감소
 - 데이터 분포를 고려하지 않은 실행계획이 생성, 실행됨

 3) bind peeking 기능 도입
 - 최초 실행시 데이터입력 값의 분포를 고려한 실행계획이 생성됨
 - 분포도가 다른 입력값이 들어오면 비효율 발생

 4) adaptive cursor share
 - 데이터 분포에 따라 다른 실행계획 생성
 - 오버헤드는 발생 

 

 

2. ACS 사용하기

 ACS 를 사용하려면 컬럼의 히스토그램이 생성되어 있어야 한다. 

통계정보 수집 할때 method_opt 옵션에서 지정할수 있고 문법과 예시는 아래와 같다. 

 - METHOD_OPT 옵션 문법

FOR COLUMNS [column_clause] [size_clause]
size_clause := SIZE {integer | REPEAT | AUTO | SKEWONLY}
column_clause := column_name | extension name | extension

 - 예시

EXEC DBMS_STATS.GATHER_TABLE_STATS('SYSTEM','TB_DPS_TRSC_BASE', ESTIMATE_PERCENT=>100, METHOD_OPT=>'FOR COLUMNS ACCT_NO SIZE 2 ');

* SIZE 뒤의 숫자만큼 버킷을 지정되어 수집되고 1부터 2048 까지 지정 할수 있다.

0 은 지정할수 없고, 1 은 히스토그램을 수집하지 않겠다는 것을 의미.

NDV 를 고려해서 버킷사이즈를 적절하게 선택 

 

- 관련 파라미터 확인 

alter [ system | session ] set "_optimizer_adaptive_cursor_sharing" = true;  -- default 

 

 - V$SQL 의 관련 컬럼

IS_BIND_SENSITIVE 
 => Y : 옵티마이저가 히스토그램을 분석, 바인드 값 변경 시 실행계획이 달라질 수 있음을 감지 
 => N : 통계가 없거나, 균일한 분포(임계를 넘지 않은) 

IS_BIND_AWARE
 => Y : (SENSITIVE already marked 상태) extended cursor sharing 사용 
 => N : 1) SENSITIVE 가 N 이거나
            2) SENSITIVE 가 Y 이지만 아직 extended cursor sharing 사용되지 않은 상태 
   

- 실행계획 분화 프로세스

  1. 통계, 히스토그램 수집

  2. 옵티마이저가 바인드변수에 따라 실행계획이 변경될수 있다고 판단되면 => IS_BIND_SENSITIVE = Y 

  3. 유저 입력값의 변경에 따라 이전에 비해 많은 일량 처리 됨 => IS_BIND_AWARE = Y

 4. 3번의 바인드 값 다시 들어오면 기존 커서 중지, 새로운 커서 생성

 

 

3. ACS 한계

 히스토그램을 반영하는 실행계획을 생성해주는 장점이 있지만 추가적인 오버헤드 발생하는 단점이 있다. 

 아래와 같은 추가적인 비용이 발생하게 된다.  

 - 실행계획 평가 비용 증가
 각 실행 시점마다 옵티마이저가 바인드 값과 기존 실행계획의 효율성을 지속적으로 평가
 
 - 커서 관리 부하
새로운 Child Cursor 생성 시 추가적 관리 부하 발생 

 - 메모리 할당(library cache) 및 통계 정보 수집(v$sql_cs_histogram) 발생
최대 20개까지의 Child Cursor 유지로 인한 메모리 증가

 - 파싱 오버헤드
Bind-Aware 상태 전환 시 추가적인 Soft Parsing 발생 -> 라이브러리 캐시 래치 경합 가능성 증가

 

즉, IS_BIND_AWARE = Y 이면 이후 해당 SQL 은

매번 바인드 값을 확인하고, 
Child Cursor 선택/생성 로직을 거치며,
통계 정보와 히스토그램을 참조하는 추가적인 내부 연산이 발생한다. 

Child Cursor가 많아질수록 커서 관리 비용, 라이브러리 캐시 경합, CPU 소모가 증가하게 된다. 

 

그러므로, 과도한 child cursor 로 인한 부작용 발생시, 아래와 같이 적절히 대응해야 할수도 있다. 

- ACS 기능을 비활성화하거나(_optimizer_adaptive_cursor_sharing=false)
- 바인드 변수 대신 리터럴 사용
- 히스토그램 수집 범위 조정 (skew 없으면 히스토그램을 수집X)
- SQL 구조 변경(조건 분기, 힌트 사용 등)

즉, 남용하지 말고 DBA 가 적절히 개입할 필요가 있다. 

 

 

반응형

'생계 > 튜닝' 카테고리의 다른 글

[oracle] 소프트 파싱 과 하드파싱  (0) 2024.12.11
mysql 실행계획 확인하기  (0) 2024.11.25
rac 환경 통계수집 후 no_invalidate  (0) 2023.06.10
오라클 AWR 사용하기  (0) 2023.05.13
[SQL]열거된 OR 제거하기. IN 사용  (0) 2020.11.13
Posted by 돌고래트레이너
생계/Cloud2025. 6. 17. 18:27
반응형

 - OCI 에 대해서 알아보자

OCI 는 Oracle Cloud Infrastructure 의 약자로 AWS 처럼 oracle 에서 제공하는 클라우드 서비스 이다. 

AWS 도 1년 동안 무료로 사용할수 있는 free tier 계정이 있다. 

다만 서비스의 제약은 있고, 무료의 범위를 넘어서면 얄짤없이 과금이 되기도 한다. 

AWS 프리티어로 mysql 이나 postgresql 같은 오픈소스를 사용하는 것은 가능하지만 oracle RDS 의 경우 

라이센스의 문제로 프리티어에서 이용하기에는 어려움이 있다. 

반면, OCI 도 무료계정을 운영하는데, 여기서는 ATP 라는 이름으로 oracle instance 를 사용 가능하다. 

 

https://www.oracle.com/kr/cloud/

 

Oracle Cloud Infrastructure(OCI) 살펴보기

고객의 산업을 위해 특별히 설계되고, 고객이 원하는 곳 어디에서나 이용 가능한 클라우드 솔루션으로 효율성을 극대화하고 비용을 절감할 수 있습니다.

www.oracle.com

 

아래처럼 30 일 체험판으로 300 달러 크레딧이 제공이된다.

30일 체험판이 끝나도 always free 서비스 항목들은 그대로 무료로 제공이 된다고 한다. 

역시 오라클 테스트는 oci 가 개꿀이다.

 

무료계정을 생성해보자. 

 

개인용 테스트 목적이라 individual 을 선택했다. 

홈영역은 무료계정에서는 제약이 있는것 같다. 나는 춘천을 선택했다.

계정을 생성하고 다시 로긴하면 MFA 를 설정하는 듯하다. 

오라클 mobile authenticator 를 사용해도 좋지만 나는 구글 authenticator 를 사용했다.

OTP 를 입력하고 다시 로긴하자. 

이제 database 를 생성하자. autonomous databases 에서 "Create Autonomous Databases" 버튼을 누른다



 

display name 과 database name 을 적당히 적어준다. 

DW 용이 아니고 oltp 성 인스턴스가 필요하므로 "Transaction Processing" 을 선택한다.

Always free 를 선택했다. 버전은 19c 로 했다. 

admin 패스워드 입력하자. 최소 12자 이상, 최소 1자리 대문자/소문자/숫자 포함해야한다. 빡세다.

 

N/W access 는 지정 IP 로 했다. 

하단에 나의 현재 아이피가 나와있다. 

귀찮으면 그냥 secure access from everywhere 로 해도 된다. 

컨택정보도 입력해준다. (왜 필요한지 모르겠지만)

다 입력했으면 우측 하단의 "Create" 버튼을 누르면 생성이 된다. 

디비생성은 금방되고, 완료가 되면 'Available' 표시가 뜬다. 

이제 접속테스트 유저를 생성해보자. 

우측 상단의 "Database actions" 에서 "Database user" 선택 

 

사용자 생성을 눌러서 국민 유저 'SCOTT' 을 만들어보자.

scott 하면 tiger 지만, 역시나 빡센 비밀번호 검증 때문에 길게 만들어 주고 생성한다. 

 

scott 이 만들어졌다. 아래의 주소를 새탭에서 열어보자.

에디터가 나오고 쿼리를 실행해보자. 

상당히 직관적이고 많은 부분 편해진것 같다. 

앞으로 이것저것 눌러가며 많이 공부해보자.

이상 끝!

반응형
Posted by 돌고래트레이너