Oracle Enterprise Edition에서 아래 DG 옵션이 무료이다.(11gR2 license 문서에서 나옴)

 

Oracle Data Guard—Redo Apply
Oracle Data Guard
SQL Apply
Oracle Data Guard
Snapshot Standby

 

그런데 Active Data guard Enterprise Edition 옵션에서 추가 비용을 지불하는 옵션이다.

 

하여 active data guard가 정확히 무엇을 해야 active data guard를 사용한다고 인식되는지 조금 뒤져보았다.

 

11g문서는 없었고(있을지도 모르지만 못찾았다)

 

 

12c기준으로 링크에서 아래처럼 나와있다.(http://www.oracle.com/technetwork/database/options/active-data-guard/overview/index.html)

 

Data Guard Architecture Overview

Data Guard provides the management, monitoring, and automation software to create and maintain one or more synchronized copies of a production database to protect Oracle data from failures, disasters, human error, and data corruptions while providing high availability for mission critical applications. Data Guard is included with Oracle Database Enterprise Edition.

 

Active Data Guard Functionality

Active Data Guard is an option license for Oracle Database Enterprise Edition. Active Data Guard enables advanced capabilities that that extend basic Data Guard functionality. These include:

 

·  Real-Time Query - offload read-only workloads to an up-to-date standby database => DB read-only 모드로 오픈

 

·  Automatic Block Repair - automatic repair of physical corruption transparent to the user => 예전부터 있던 기능

 

·  Far Sync - zero data loss protection across any distance => 12c new feature이다

 

 

·  Standby Block Change Tracking - enable incremental backups on an active standby => 예전부터 있던 기능

 

·  Active Data Guard Rolling Upgrade - make it simple to reduce planned downtime => 12c new feature. , 10.1.0.3부터 DG sql apply db rolling upgrade가 가능하다

 

·  Global Database Services - load balancing and service management across replicated databases. See Global Data Services => 12c new feature이다

 

·  Application Continuity - make outages transparent to users. See Application Continuity => (rac one node도 가능) => Requires the Active Data Guard option or the Real Application Clusters option

'Knowledge > Oracle' 카테고리의 다른 글

Local Partition INDEX Test  (0) 2018.04.24
Oracle DBA와 개발자의 필독서  (2) 2016.09.23
sqlplus 접속 hang시에 접속 방법  (0) 2016.05.27
impdp, imp 주의사항  (0) 2016.03.20
Oracle Create Table 내부 절차  (0) 2015.10.21
Posted by neo-orcl
,

■ 개요


성능고도화나 이번에 나온 트러블슈팅 오라클 퍼포먼스나 오라클 공식 교재의 SQL tuning workshop등에서 adaptive cursor sharing에 대해 효과를 설명하고 있습니다.

 

몇몇 파라미터를 조정시에 기능이 제대로 사용되는지 확인해보려 합니다.

 

테스트 계기는 사이트에서 DB 파라미터를 보다 보면 아래 파라미터들이 조정되어 있는 경우를 볼 수 있었기 때문입니다.

 

_optim_peek_user_binds=false  (기본값 true)

_optimizer_extended_cursor_sharing_rel=none  (10g 없음. 11g 기본 simple)

_optimizer_extended_cursor_sharing=none      (10g,11g 기본 udo)

_optimizer_adaptive_cursor_sharing=false        (10g 없음, 11g 기본 true)

 

버그 때문에 안정화를 위해 조정해두는 경우가 있는데, 위 파라미터들이 모두 조정되었을 경우, 혹은 한개라도 조정되었을 경우 adaptive cursor sharing이 동작 하는지 알기 위해 간단히 테스트합니다.

 

■ 테스트 준비


1. 현재 버전, 파라미터 확인

 

SQL> select version from v$instance;

VERSION
-----------------
11.2.0.4.0

 

--여기 적지 않았지만 PSU도 11.2.0.4.5까지 적용되어 있습니다.

 

SQL> select a.ksppinm, b.ksppstvl
  2  from x$ksppi a, x$ksppsv b
  3  where a.indx=b.indx
  4  and ksppinm like '%&parametername%';
Enter value for parametername: optim_peek
old   4: and ksppinm like '%&parametername%'
new   4: and ksppinm like '%optim_peek%'

 

KSPPINM                                  KSPPSTVL
---------------------------------------- ----------------------------------------
_optim_peek_user_binds                   TRUE

 

SQL>
SQL> select a.ksppinm, b.ksppstvl
  2  from x$ksppi a, x$ksppsv b
  3  where a.indx=b.indx
  4  and ksppinm like '%&parametername%';
Enter value for parametername: cursor_sharing
old   4: and ksppinm like '%&parametername%'
new   4: and ksppinm like '%cursor_sharing%'

 

KSPPINM                                  KSPPSTVL
---------------------------------------- ----------------------------------------
_disable_cursor_sharing                  FALSE
cursor_sharing                           EXACT
_optimizer_extended_cursor_sharing       UDO
_optimizer_extended_cursor_sharing_rel   SIMPLE
_optimizer_adaptive_cursor_sharing       TRUE

 

2. 테스트 테이블, 인덱스 생성, histogram도 수집하게 하여 통계정보 수집

 

SQL> create table tb1(id int, col2 char(4)) tablespace users;

Table created.

 

SQL> create index tb1_idx on tb1(id);

Index created.

 

SQL> insert into tb1 select 1, 'name' from all_objects where rownum <= 100000;

13757 rows created.

 

SQL> insert into tb1 values(2, 'name');

1 row created.

 

SQL> commit;

Commit complete.

--테이블의 id 컬럼에 1의 데이터를 13757건, 2의 데이터를 1건 입력

 

SQL> exec dbms_stats.gather_table_stats(user, 'tb1', estimate_percent=>100, method_opt=>'for columns size 2 id', cascade=>true);

 

PL/SQL procedure successfully completed.

--통계정보 수집. histogram도 수집

--bind peeking이나 adaptive cursor sharing 모두 histogram이 없으면 동작하지 않기에 반드시 histogram도 수집

 

■ 테스트


1. Default

 

SQL> set line 180
SQL> col IBS for a3
SQL> col IBA for a3
SQL> col sql_text for a42
SQL> var id number;
SQL> alter system flush shared_pool;

System altered.

--커서를 비우기 위해 수행

 

SQL> exec :id := 1;

PL/SQL procedure successfully completed.

 

SQL> select count(col2) from tb1 where id = :id;

COUNT(COL2)
-----------
      13757

 

SQL> select sql_id, sql_text,is_bind_sensitive AS IBS, is_bind_aware AS IBA,plan_hash_value
  2  from v$sql where sql_text like 'select count(col2) from tb1%';

 

SQL_ID        SQL_TEXT                                   IBS IBA PLAN_HASH_VALUE
------------- ------------------------------------------ --- --- ---------------
4q3p69cucf7m4 select count(col2) from tb1 where id = :id Y   N        1364719694

 

--bind peeking에 의해 full table scan 실행계획이 생성

 

SQL> exec :id := 2;

PL/SQL procedure successfully completed.

 

SQL> select count(col2) from tb1 where id = :id;

 

COUNT(COL2)
-----------
          1

 

SQL> select sql_id, sql_text,is_bind_sensitive AS IBS, is_bind_aware AS IBA,plan_hash_value
  2  from v$sql where sql_text like 'select count(col2) from tb1%';

 

SQL_ID        SQL_TEXT                                   IBS IBA PLAN_HASH_VALUE
------------- ------------------------------------------ --- --- ---------------
4q3p69cucf7m4 select count(col2) from tb1 where id = :id Y   N        1364719694

 

SQL> select count(col2) from tb1 where id = :id;

 

COUNT(COL2)
-----------
          1

 

SQL> select sql_id, sql_text,is_bind_sensitive AS IBS, is_bind_aware AS IBA,plan_hash_value
  2  from v$sql where sql_text like 'select count(col2) from tb1%';

 

SQL_ID        SQL_TEXT                                   IBS IBA PLAN_HASH_VALUE
------------- ------------------------------------------ --- --- ---------------
4q3p69cucf7m4 select count(col2) from tb1 where id = :id Y   N        1364719694
4q3p69cucf7m4 select count(col2) from tb1 where id = :id Y   Y         589386258

 

--두번째 실행에서 새로운 실행계획이 생성. index scan

 

SQL> exec :id := 1;

PL/SQL procedure successfully completed.

 

SQL> select count(col2) from tb1 where id = :id;

 

COUNT(COL2)
-----------
      13757

 

SQL> select sql_id, sql_text,is_bind_sensitive AS IBS, is_bind_aware AS IBA,plan_hash_value
  2  from v$sql where sql_text like 'select count(col2) from tb1%';

 

SQL_ID        SQL_TEXT                                   IBS IBA PLAN_HASH_VALUE
------------- ------------------------------------------ --- --- ---------------
4q3p69cucf7m4 select count(col2) from tb1 where id = :id Y   N        1364719694
4q3p69cucf7m4 select count(col2) from tb1 where id = :id Y   Y         589386258
4q3p69cucf7m4 select count(col2) from tb1 where id = :id Y   Y        1364719694

 

정상 동작은 위와 같습니다.(bind peeking -> adaptive cursor sharing)

 

 

2. _optim_peek_user_binds=false

 

SQL> alter session set "_optim_peek_user_binds"=false;

Session altered.

 

SQL> var id number;

SQL> alter system flush shared_pool;

System altered.

 

SQL> exec :id := 1;

PL/SQL procedure successfully completed.

 

SQL> select count(col2) from tb1 where id = :id;

COUNT(COL2)
-----------
      13757

 

SQL> select sql_id, sql_text,is_bind_sensitive AS IBS, is_bind_aware AS IBA,plan_hash_value
  2  from v$sql where sql_text like 'select count(col2) from tb1%';

 

SQL_ID        SQL_TEXT                                   IBS IBA PLAN_HASH_VALUE
------------- ------------------------------------------ --- --- ---------------
4q3p69cucf7m4 select count(col2) from tb1 where id = :id N   N        1364719694

 

SQL> exec :id := 2;

PL/SQL procedure successfully completed.

 

SQL> select count(col2) from tb1 where id = :id;

 

COUNT(COL2)
-----------
          1

 

SQL> select sql_id, sql_text,is_bind_sensitive AS IBS, is_bind_aware AS IBA,plan_hash_value
  2  from v$sql where sql_text like 'select count(col2) from tb1%';

 

SQL_ID        SQL_TEXT                                   IBS IBA PLAN_HASH_VALUE
------------- ------------------------------------------ --- --- ---------------
4q3p69cucf7m4 select count(col2) from tb1 where id = :id N   N        1364719694

 

SQL> select count(col2) from tb1 where id = :id;

 

COUNT(COL2)
-----------
          1

 

SQL> select sql_id, sql_text,is_bind_sensitive AS IBS, is_bind_aware AS IBA,plan_hash_value
  2  from v$sql where sql_text like 'select count(col2) from tb1%';

 

SQL_ID        SQL_TEXT                                   IBS IBA PLAN_HASH_VALUE
------------- ------------------------------------------ --- --- ---------------
4q3p69cucf7m4 select count(col2) from tb1 where id = :id N   N        1364719694

 

SQL> exec :id := 1;

PL/SQL procedure successfully completed.

 

SQL> select count(col2) from tb1 where id = :id;

 

COUNT(COL2)
-----------
      13757

 

SQL> select sql_id, sql_text,is_bind_sensitive AS IBS, is_bind_aware AS IBA,plan_hash_value
  2  from v$sql where sql_text like 'select count(col2) from tb1%';

 

SQL_ID        SQL_TEXT                                   IBS IBA PLAN_HASH_VALUE
------------- ------------------------------------------ --- --- ---------------
4q3p69cucf7m4 select count(col2) from tb1 where id = :id N   N        1364719694

 

SQL> alter session set "_optim_peek_user_binds"=true;

Session altered.

 

 

_optim_peek_user_binds 를 false로 설정하면 adaptive cursor sharing도 사용되지 않는 다는 것을 알 수 있습니다.

 

사실 위 테스트로는 bind peeking이 제대로 동작 안한건지 확인할 수가 없습니다. 왜냐면 bind peeking을 안써도 bind변수를 썼기에 optimizer는 col2 컬럼이 2개의 NDV로 가정하기 때문에 full table scan을 선택하거든요.

그래서 이번 테스트만 bind 변수 순서를 바꾸어서 한번 더 해봅니다.

 

SQL> alter session set "_optim_peek_user_binds"=false;

Session altered.

 

SQL> alter system flush shared_pool;

System altered.

 

SQL> exec :id := 2;

PL/SQL procedure successfully completed.

 

--id=2 로 먼저 시도해봅니다.

 

SQL> select count(col2) from tb1 where id = :id;

 

COUNT(COL2)
-----------
          1

 

SQL> select sql_id, sql_text,is_bind_sensitive AS IBS, is_bind_aware AS IBA,plan_hash_value
  2  from v$sql where sql_text like 'select count(col2) from tb1%';

 

SQL_ID        SQL_TEXT                                   IBS IBA PLAN_HASH_VALUE
------------- ------------------------------------------ --- --- ---------------
4q3p69cucf7m4 select count(col2) from tb1 where id = :id N   N        1364719694

 

SQL> exec :id := 1;

PL/SQL procedure successfully completed.

 

SQL> select count(col2) from tb1 where id = :id;

 

COUNT(COL2)
-----------
      13757

 

SQL> select sql_id, sql_text,is_bind_sensitive AS IBS, is_bind_aware AS IBA,plan_hash_value
  2  from v$sql where sql_text like 'select count(col2) from tb1%';

 

SQL_ID        SQL_TEXT                                   IBS IBA PLAN_HASH_VALUE
------------- ------------------------------------------ --- --- ---------------
4q3p69cucf7m4 select count(col2) from tb1 where id = :id N   N        1364719694

 

SQL> select count(col2) from tb1 where id = :id;

 

COUNT(COL2)
-----------
      13757

 

SQL> select sql_id, sql_text,is_bind_sensitive AS IBS, is_bind_aware AS IBA,plan_hash_value
  2  from v$sql where sql_text like 'select count(col2) from tb1%';

 

SQL_ID        SQL_TEXT                                   IBS IBA PLAN_HASH_VALUE
------------- ------------------------------------------ --- --- ---------------
4q3p69cucf7m4 select count(col2) from tb1 where id = :id N   N        1364719694

 

SQL> exec :id := 2;

PL/SQL procedure successfully completed.

 

SQL> select count(col2) from tb1 where id = :id;

 

COUNT(COL2)
-----------
          1

 

SQL> select sql_id, sql_text,is_bind_sensitive AS IBS, is_bind_aware AS IBA,plan_hash_value
  2  from v$sql where sql_text like 'select count(col2) from tb1%';

 

SQL_ID        SQL_TEXT                                   IBS IBA PLAN_HASH_VALUE
------------- ------------------------------------------ --- --- ---------------
4q3p69cucf7m4 select count(col2) from tb1 where id = :id N   N        1364719694

 

SQL> alter session set "_optim_peek_user_binds"=true;

Session altered.

 

--다시 bind peeking을 키고 id=2 일때 다시 수행해봅니다.

 

SQL> alter system flush shared_pool;

System altered.

 

SQL> select count(col2) from tb1 where id = :id;

COUNT(COL2)
-----------
          1

 

SQL> select sql_id, sql_text,is_bind_sensitive AS IBS, is_bind_aware AS IBA,plan_hash_value
  2  from v$sql where sql_text like 'select count(col2) from tb1%';

 

SQL_ID        SQL_TEXT                                   IBS IBA PLAN_HASH_VALUE
------------- ------------------------------------------ --- --- ---------------
4q3p69cucf7m4 select count(col2) from tb1 where id = :id Y   N         589386258

 

--예상하던대로 플랜이 달라졌습니다.


 

3. _optimizer_extended_cursor_sharing_rel=none

 

SQL> alter session set "_optimizer_extended_cursor_sharing_rel"=none;

Session altered.

 

SQL> var id number;

SQL> alter system flush shared_pool;

System altered.

 

SQL> exec :id := 1;

PL/SQL procedure successfully completed.

 

SQL> select count(col2) from tb1 where id = :id;

COUNT(COL2)
-----------
      13757

 

SQL> select sql_id, sql_text,is_bind_sensitive AS IBS, is_bind_aware AS IBA,plan_hash_value
  2  from v$sql where sql_text like 'select count(col2) from tb1%';

 

SQL_ID        SQL_TEXT                                   IBS IBA PLAN_HASH_VALUE
------------- ------------------------------------------ --- --- ---------------
4q3p69cucf7m4 select count(col2) from tb1 where id = :id N   N        1364719694

 

SQL> exec :id := 2;

PL/SQL procedure successfully completed.

 

SQL> select count(col2) from tb1 where id = :id;

COUNT(COL2)
-----------
          1

 

SQL> select sql_id, sql_text,is_bind_sensitive AS IBS, is_bind_aware AS IBA,plan_hash_value
  2  from v$sql where sql_text like 'select count(col2) from tb1%';

 

SQL_ID        SQL_TEXT                                   IBS IBA PLAN_HASH_VALUE
------------- ------------------------------------------ --- --- ---------------
4q3p69cucf7m4 select count(col2) from tb1 where id = :id N   N        1364719694

 

SQL> select count(col2) from tb1 where id = :id;

 

COUNT(COL2)
-----------
          1

 

SQL> select sql_id, sql_text,is_bind_sensitive AS IBS, is_bind_aware AS IBA,plan_hash_value
  2  from v$sql where sql_text like 'select count(col2) from tb1%';

 

SQL_ID        SQL_TEXT                                   IBS IBA PLAN_HASH_VALUE
------------- ------------------------------------------ --- --- ---------------
4q3p69cucf7m4 select count(col2) from tb1 where id = :id N   N        1364719694

 

SQL> exec :id := 1;

PL/SQL procedure successfully completed.

 

SQL> select count(col2) from tb1 where id = :id;

COUNT(COL2)
-----------
      13757

 

SQL> select sql_id, sql_text,is_bind_sensitive AS IBS, is_bind_aware AS IBA,plan_hash_value
  2  from v$sql where sql_text like 'select count(col2) from tb1%';

 

SQL_ID        SQL_TEXT                                   IBS IBA PLAN_HASH_VALUE
------------- ------------------------------------------ --- --- ---------------
4q3p69cucf7m4 select count(col2) from tb1 where id = :id N   N        1364719694

SQL> alter session set "_optimizer_extended_cursor_sharing_rel"='simple';

Session altered.

 

 

_optimizer_extended_cursor_sharing_rel 를 none으로 설정하면 adaptive cursor sharing도 사용되지 않는 다는 것을 알 수 있습니다.

 

 

4. _optimizer_extended_cursor_sharing=none

 

SQL> alter session set "_optimizer_extended_cursor_sharing"=none;

Session altered.

 

SQL> var id number;

SQL> alter system flush shared_pool;

System altered.

 

SQL> exec :id := 1;

PL/SQL procedure successfully completed.

 

SQL> select count(col2) from tb1 where id = :id;

COUNT(COL2)
-----------
      13757

 

SQL> select sql_id, sql_text,is_bind_sensitive AS IBS, is_bind_aware AS IBA,plan_hash_value
  2  from v$sql where sql_text like 'select count(col2) from tb1%';

 

SQL_ID        SQL_TEXT                                   IBS IBA PLAN_HASH_VALUE
------------- ------------------------------------------ --- --- ---------------
4q3p69cucf7m4 select count(col2) from tb1 where id = :id Y   N        1364719694

 

SQL> exec :id := 2;

PL/SQL procedure successfully completed.

 

SQL> select count(col2) from tb1 where id = :id;

COUNT(COL2)
-----------
          1

 

SQL> select sql_id, sql_text,is_bind_sensitive AS IBS, is_bind_aware AS IBA,plan_hash_value
  2  from v$sql where sql_text like 'select count(col2) from tb1%';

 

SQL_ID        SQL_TEXT                                   IBS IBA PLAN_HASH_VALUE
------------- ------------------------------------------ --- --- ---------------
4q3p69cucf7m4 select count(col2) from tb1 where id = :id Y   N        1364719694

 

SQL> select count(col2) from tb1 where id = :id;

 

COUNT(COL2)
-----------
          1

 

SQL> select sql_id, sql_text,is_bind_sensitive AS IBS, is_bind_aware AS IBA,plan_hash_value
  2  from v$sql where sql_text like 'select count(col2) from tb1%';

 

SQL_ID        SQL_TEXT                                   IBS IBA PLAN_HASH_VALUE
------------- ------------------------------------------ --- --- ---------------
4q3p69cucf7m4 select count(col2) from tb1 where id = :id Y   N        1364719694
4q3p69cucf7m4 select count(col2) from tb1 where id = :id Y   Y         589386258

 

SQL> exec :id := 1;

PL/SQL procedure successfully completed.

 

SQL> select count(col2) from tb1 where id = :id;

COUNT(COL2)
-----------
      13757

 

SQL> select sql_id, sql_text,is_bind_sensitive AS IBS, is_bind_aware AS IBA,plan_hash_value
  2  from v$sql where sql_text like 'select count(col2) from tb1%';

 

SQL_ID        SQL_TEXT                                   IBS IBA PLAN_HASH_VALUE
------------- ------------------------------------------ --- --- ---------------
4q3p69cucf7m4 select count(col2) from tb1 where id = :id Y   N        1364719694
4q3p69cucf7m4 select count(col2) from tb1 where id = :id Y   Y         589386258
4q3p69cucf7m4 select count(col2) from tb1 where id = :id Y   Y        1364719694

 

SQL> alter session set "_optimizer_extended_cursor_sharing"='UDO';

Session altered.

 

 

_optimizer_extended_cursor_sharing 을 none으로 변경해도 adaptive cursor sharing은 동작합니다.

 

 

5. _optimizer_adaptive_cursor_sharing=false

 

SQL> alter session set "_optimizer_adaptive_cursor_sharing"=false;

Session altered.

 

SQL> var id number;

SQL> alter system flush shared_pool;

System altered.

 

SQL> exec :id := 1;

PL/SQL procedure successfully completed.

 

SQL> select count(col2) from tb1 where id = :id;

 

COUNT(COL2)
-----------
      13757

 

SQL> select sql_id, sql_text,is_bind_sensitive AS IBS, is_bind_aware AS IBA,plan_hash_value
  2  from v$sql where sql_text like 'select count(col2) from tb1%';

 

SQL_ID        SQL_TEXT                                   IBS IBA PLAN_HASH_VALUE
------------- ------------------------------------------ --- --- ---------------
4q3p69cucf7m4 select count(col2) from tb1 where id = :id Y   Y        1364719694

 

SQL> exec :id := 2;

PL/SQL procedure successfully completed.

 

SQL> select count(col2) from tb1 where id = :id;

COUNT(COL2)
-----------
          1

 

SQL> select sql_id, sql_text,is_bind_sensitive AS IBS, is_bind_aware AS IBA,plan_hash_value
  2  from v$sql where sql_text like 'select count(col2) from tb1%';

 

SQL_ID        SQL_TEXT                                   IBS IBA PLAN_HASH_VALUE
------------- ------------------------------------------ --- --- ---------------
4q3p69cucf7m4 select count(col2) from tb1 where id = :id Y   Y        1364719694
4q3p69cucf7m4 select count(col2) from tb1 where id = :id Y   Y         589386258

 

SQL> select count(col2) from tb1 where id = :id;

COUNT(COL2)
-----------
          1

 

SQL> select sql_id, sql_text,is_bind_sensitive AS IBS, is_bind_aware AS IBA,plan_hash_value
  2  from v$sql where sql_text like 'select count(col2) from tb1%';

 

SQL_ID        SQL_TEXT                                   IBS IBA PLAN_HASH_VALUE
------------- ------------------------------------------ --- --- ---------------
4q3p69cucf7m4 select count(col2) from tb1 where id = :id Y   Y        1364719694
4q3p69cucf7m4 select count(col2) from tb1 where id = :id Y   Y         589386258

 

SQL> exec :id := 1;

PL/SQL procedure successfully completed.

 

SQL> select count(col2) from tb1 where id = :id;

COUNT(COL2)
-----------
      13757

 

SQL> select sql_id, sql_text,is_bind_sensitive AS IBS, is_bind_aware AS IBA,plan_hash_value
  2  from v$sql where sql_text like 'select count(col2) from tb1%';

 

SQL_ID        SQL_TEXT                                   IBS IBA PLAN_HASH_VALUE
------------- ------------------------------------------ --- --- ---------------
4q3p69cucf7m4 select count(col2) from tb1 where id = :id Y   Y        1364719694
4q3p69cucf7m4 select count(col2) from tb1 where id = :id Y   Y         589386258

 

 

예상하기론 optimizer_adaptive_cursor_sharing을 false로 변경하면 adaptive cursor sharing 기능이 사용되지 않을 줄 알았는데 오히려 더 적극적으로 사용됩니다.

 

마치 bind_aware 힌트를 사용한 것과 같은 효과를 가집니다. 

'Knowledge > Perfomance Tuning' 카테고리의 다른 글

Adaptive cursor simple test  (0) 2016.01.02
통계 export/import  (0) 2015.12.29
통계복원(restore_table_stats)  (0) 2015.12.29
statistics lock/unlock  (0) 2015.12.29
수동통계수집(gathering statistics manually)  (0) 2015.12.29
Posted by neo-orcl
,

■ 개요


접속이 안된다는 이상이 있다고 연락을 받고 확인을 하려 할 때 maximum processes 값을 초과하여 접속을 할 수 없을 경우가 있을 수 있다.

아니면 shared pool의 부족 등의 이유도 있을 수 있다.

 

이때 선택하는 방법은 pmon을 kill하고 startup 하는 비상 조치를 취할 수 있는데 문제는 이 경우 추후 원인을 찾지 못할 수도 있고 이 조치를 취하면 안되는 즉, DB를 내리면 안되는 경우도 있을 수 있다.

 

그래서 -prelim 옵션이 존재한다. preliminary connect 이다.

(오라클 매뉴얼에서 검색으로도 찾을 수 없다)

 

일반적으로 정상 상태에서 sysdba 접속시 새 프로세스를 시작하고, 새 프로세스가 SGA에 접속하고, SGA내에 프로세스와 세션 상태 정보를 넣기 위한 메모리를 할당받아 남긴다.

 

하지만 prelim 옵션은 마지막 과정이 없다.

그래서 Lock이나 latch나 mutext를 사용하는 작업을 할 수는 없다.

(prelim 접속시 shutdown 명령도 abort만 가능하다.) 

 

■ 테스트


$ sqlplus -prelim / as sysdba

SQL*Plus: Release 11.2.0.3.0 Production on Fri May 27 13:17:51 2016

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

SQL> select 1 from dual;                       
select 1 from dual
*
ERROR at line 1:
ORA-01012: not logged on
Process ID: 0
Session ID: 0 Serial number: 0

SQL> oradebug setmypid
Statement processed.

SQL> oradebug unlimit

Statement processed.

SQL> oradebug hanganalyze 12
Statement processed.

 

RAC일 경우에는 옵션이 다르게 있다.

 

SQL> oradebug setmypid
SQL> oradebug unlimit
SQL> oradebug -g all hanganalyze 3
SQL> oradebug -g all dump systemstate 266

 

 

※해당 기능을 사용한 케이스의 링크

 

 

http://arup.blogspot.kr/2008/08/diagnosing-library-cache-latch.html

'Knowledge > Oracle' 카테고리의 다른 글

Oracle DBA와 개발자의 필독서  (2) 2016.09.23
Data guard와 Active data guard license  (0) 2016.08.12
impdp, imp 주의사항  (0) 2016.03.20
Oracle Create Table 내부 절차  (0) 2015.10.21
SQL Loader Direct Load  (0) 2015.10.05
Posted by neo-orcl
,

■ synonym 관련


오라클에서 import시 해당 테이블에 대한 시노님이 걸려 있으면 ?

말 그대로, 오라클에서 IMPORT하려는 테이블명과 동일한 SYNONYM이 존재하는 경우,
테이블을 생성하지 않고 해당 SYNONYM에 DATA를 IMPORT하려고 시도한다

 

■ 스키마 단위 주의사항


import나 impdp나 스키마단위로 import하면 full과는 다르게
role, public synonym, profile, public database link, system 권한 등이 import되지 않으니 주의해야 한다.

 

■ 캐릭터셋 주의사항


캐릭터 셋이 다른 경우 자동 변환되지만
소스 DB의 캐릭터셋이 타겟 DB의 하위 셋이어야 한다.
예를 들어 소스 DB가 US7ASCII(7bit)이고 타겟 DB가 WE8ISO8859P1(8bit)일 경우 문제 없지만
상이한 8bit 캐릭터셋 사이나 8bit에서 7bit로 import할 경우 특수 문자가 손실될 수 있다.

 

■ network_link를 통한 datapump는 conventional path이다.


network_link를 사용하지 않는 impdp의 경우 direct path를 사용하지만
network_link를 사용하는 impdp는 conventional path이다.

'Knowledge > Oracle' 카테고리의 다른 글

Data guard와 Active data guard license  (0) 2016.08.12
sqlplus 접속 hang시에 접속 방법  (0) 2016.05.27
Oracle Create Table 내부 절차  (0) 2015.10.21
SQL Loader Direct Load  (0) 2015.10.05
undo 관련 좋은 링크  (0) 2015.09.15
Posted by neo-orcl
,

11g에선 Tablespace PITR만 가능했는데 12c에선 Table단위도 가능하게 되었다.

이를 간단히 테스트해본다.

 

1. 백업

$ rman target /

backup database;

 

2. 현재 시간 or scn 확인

SQL> select current_scn from v$database;

CURRENT_SCN
-----------
     665749


3. scott에서 emp, bonus truncate

$ sqlplus scott/tiger

SQL> truncate table emp;
SQL> truncate table bonus;

 

4. rman 에서 테이블 recover 실행

$ mkdir /oradata/aux

$ rman target /

recover table scott.emp, scott.bonus
until scn 665749
auxiliary destination '/oradata/aux'
remap table scott.emp:re_emp, scott.bonus:re_bonus;

※동일 명의 테이블이 있으면 에러나기 때문에 remap 해야함.

 

5. 확인 및 insert

$ sqlplus scott/tiger 

SQL> select * from re_emp;
SQL> select * from re_bonus;

SQL> insert into emp select * from re_emp;
SQL> insert into bonus select * from re_bonus;

Posted by neo-orcl
,

개요

find와 locate는 동일한 결과를 보인다고 생각할 수 있는데 왜 두개의 명령으로 나눠뒀는지 궁금해할 수 있다.

 

1. find는 물리적으로 search를 한다. 그래서 항상 최신의 정보이다. 옵션을 더 세밀하게 사용할 수 있다.

 

2. locate는 updatedb command에 의해 리스팅된 상태의 정보를 통해 search를 한다. 예전 버전의 정보일 수 있다. cron을 통해 매일 하루에 한번씩 이 정보도 업데이트된다. 이름만 옵션으로 줄 수 있다.

 

속도

# time find / -name *.arc

.... 

real    0m5.323s
user    0m0.074s
sys     0m2.040s


# time locate /*.arc

real    0m0.236s
user    0m0.213s
sys     0m0.004s 

 

최신 데이터와 old data

# cd ~

# touch ddd.arc
# locate *.arc | grep ddd       <- 아무 결과도 출력되지 않음

# find ~/ -name *.arc

/root/ddd.arc

# updatedb                         <- 수동으로 file list를 업데이트해준다.

# locate *.arc | grep ddd
/root/ddd.arc

 

cron.daily의 등록여부 확인

 

# cat /etc/crontab

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

 

# cd /etc/cron.daily/

# grep updatedb *
mlocate.cron
:/usr/bin/updatedb -f "$nodevs"

매일 4시 2분에 cron.daily가 실행되며, 그 안의 mlocate.cron을 실행하여 updatedb를 수행함을 알 수 있다.

 

주의사항

간혹 이 updatedb 명령이 nfs로 마운트된 영역을 검색하면서 느려질 경우가 수 있고 DB가 설치된 환경이라면 조정이 필요할 수 있다.

예를 들어 nfs 영역에 archive나 trace file을 저장하도록 설정하였는데 로그 스위치가 자주 발생하여 아카이브 로그 파일이 많이 생성되거나  trace파일이 엄청나게 생성되었을 경우 updatedb 명령시에 부하가 발생하게 된다.

이때 만약 RAC환경에서 nfs영역에 voting disk가 위치한다면 최악의 경우 eviction까지 이루어질 수 있다(매우 rare하다).

그래서 nfs는 주로 updatedb에서 제외하는 것을 권장하고 있다.

 

# cat /etc/updatedb.conf
PRUNEFS = "auto afs gfs gfs2 iso9660 sfs udf vmhgfs"
PRUNEPATHS = "/afs /media /net /sfs /tmp /udev /var/spool/cups /var/spool/squid /var/tmp"

위가 기본값이다.

 

PRUNEFS: df에서 확인할 수 있는 file system으로 제외한다. 이곳에 nfs를 추가하면 nfs 파일시스템은 updatedb 수행시 제외한다.

PRUNEPATHS: 경로를 지정하여 제외한다.

 

Posted by neo-orcl
,

Adaptive Cursor Sharing

 

adaptive cursor sharing은 히스토그램이 수집되어 있어야 작동한다.

 

col1 열에 1 값이 1개, 10000 값이 100000개라고 하면 바인드 변수 사용시 1값은 인덱스를 타고 10000값은 FTS를 타는게 최적이다.
하지만 adaptive cursor sharing을 사용한다고 해서 처음부터 실행계획을 별도로 사용하진 않는다.

이를 테스트를 통해 확인해본다.

11.2.0.1 버전에서 진행하였다.

 

SQL> create table t (col1 number, col2 varchar2(1) default 'a') tablespace users;

SQL> begin
insert into t(col1) values(1);
for i in 1..100000 loop
insert into t(col1) values(10000);
end loop;
commit;
end;
/

SQL> create index t_x2 on t(col1);

SQL> select last_analyzed from user_tables where table_name='T';

LAST_ANALYZE
------------               <--통계정보 수집이 되지 않았다.

 

SQL> exec dbms_stats.gather_table_stats('sys',tabname=>'t',method_opt=>'for columns col1',estimate_percent=>'100');
--col1에 대해 컬럼 통계와 히스토그램을 수집한다.

 

SQL> col low_value for a10                                                                                           
SQL> col high_value for a10
SQL> col histogram for a15
SQL> col column_name for a10

SQL> select column_name, num_distinct, low_value, high_value, histogram
from user_tab_col_statistics
where table_name='T';

COLUMN_NAME                    NUM_DISTINCT LOW_VALUE  HIGH_VALUE HISTOGRAM
------------------------------ ------------ ---------- ---------- ---------------
COL1                                      2 C102       C302       FREQUENCY
COL2                                      1 61         61         NONE

--col1의 histogram 열 값이 frequency로 되어있다.
--select * from user_tab_histograms where table_name='T' and column_name='COL1'; 으로 히스토그램의 자세한 정보를 알 수 있다.

 

바인드변수를 선언하고 1을 입력한 후 select를 진행해본다.

 

SQL> var val number
SQL> exec :val := 1;

SQL> select * from t where col1=:val;     

SQL> col sql_text for a35

SQL> select sql_id, sql_text, child_number
from v$sql
where sql_text like 'select * from t where col1=:val';

 

SQL_ID        SQL_TEXT                            CHILD_NUMBER
------------- ----------------------------------- ------------
bv63hazkv7ab1 select * from t where col1=:val                0

 

SQL> select * from table(dbms_xplan.display_cursor('bv63hazkv7ab1',0));

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------
SQL_ID  bv63hazkv7ab1, child number 0
-------------------------------------
select * from t where col1=:val

 

Plan hash value: 844497715

------------------------------------------------------------------------------------
| Id  | Operation                   | Name | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |      |       |       |     2 (100)|          |
|   1 |  TABLE ACCESS BY INDEX ROWID| T    |     1 |     5 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | T_X  |     1 |       |     1   (0)| 00:00:01 |
------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("COL1"=:VAL)

 

--index를 사용했음을 알 수 있다. 참고로 실제 실행계획이 아닌 예상실행계획으론 테이블 스캔이 나온다. 이때 bind peeking을 사용했음을 짐작할 수 있다.

 

SQL> select sql_id, sql_text,is_bind_sensitive, is_bind_aware from v$sql                                                       
where sql_text like 'select * from t where col1=:val';

SQL_ID        SQL_TEXT                            I I
------------- ----------------------------------- - -
bv63hazkv7ab1 select * from t where col1=:val     Y N

 

--is_bind_sensitive값은 Y이고 is_bind_aware 값은 N이다.

 

바인드변수값을 10000으로 바꿔서 재실행해본다.

 

SQL> exec :val := 10000;                                                                                             

SQL> select * from t where col1=:val;

SQL> select sql_id, sql_text,child_number,is_bind_sensitive, is_bind_aware from v$sqlwhere sql_text like 'select * from t where col1=:val';

SQL_ID        SQL_TEXT                            CHILD_NUMBER I I
------------- ----------------------------------- ------------ - -
bv63hazkv7ab1 select * from t where col1=:val                0 Y N

 

--아직 차일드가 하나이다. is_bind_aware값은 N이다.


다시 한번 실행해본다.
SQL> select * from t where col1=:val;

SQL> select sql_id, sql_text, child_number, is_bind_sensitive, is_bind_aware from v$sql
where sql_text like 'select * from t where col1=:val';

SQL_ID        SQL_TEXT                            CHILD_NUMBER I I
------------- ----------------------------------- ------------ - -
bv63hazkv7ab1 select * from t where col1=:val                0 Y N
bv63hazkv7ab1 select * from t where col1=:val                1 Y Y

 

--is_bind_aware 값이 Y인 커서가 하나 더 생성되었다.

 

SQL> select * from table(dbms_xplan.display_cursor('bv63hazkv7ab1',1));

PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------
SQL_ID  bv63hazkv7ab1, child number 1
-------------------------------------
select * from t where col1=:val

Plan hash value: 1601196873

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |       |       |    51 (100)|          |
|*  1 |  TABLE ACCESS FULL| T    |   100K|   488K|    51   (2)| 00:00:02 |
--------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("COL1"=:VAL)

 

풀테이블 스캔 실행계획이 추가됨을 확인할 수 있다.


히스토그램 없이 컬럼 통계만 있을 경우 동작을 확인

 

SQL> exec dbms_stats.delete_column_stats('sys',tabname=>'t',colname=>'col1', col_stat_type=>'HISTOGRAM');
--히스토그램만 삭제한다.

SQL> select column_name, num_distinct, low_value, high_value, histogram
from user_tab_col_statistics
where table_name='T';

COLUMN_NAM NUM_DISTINCT LOW_VALUE  HIGH_VALUE HISTOGRAM
---------- ------------ ---------- ---------- ---------------
COL1                  2 C102       C302       NONE
COL2                  1 61         61         NONE

--histogram 컬럼이 none으로 변경되었다.
--참고로 user_tab_histograms 컬럼에는 여전히 데이터들이 남아있다. 하지만 histogram이 none이기에 사용되지 않는다.

 

테스트를 위해 shared_pool도 비워준다.

SQL> alter system flush shared_pool;

System altered.

SQL> exec :val:=1;
SQL> select * from t where col1=:val;

SQL> select sql_id, sql_text, child_number, is_bind_sensitive, is_bind_aware from v$sql
where sql_text like 'select * from t where col1=:val';

SQL_ID        SQL_TEXT                            CHILD_NUMBER I I
------------- ----------------------------------- ------------ - -
bv63hazkv7ab1 select * from t where col1=:val                0 Y N

 

SQL> select * from table(dbms_xplan.display_cursor('bv63hazkv7ab1',0));

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------
SQL_ID  bv63hazkv7ab1, child number 0
-------------------------------------
select * from t where col1=:val

Plan hash value: 1601196873

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |       |       |    51 (100)|          |
|*  1 |  TABLE ACCESS FULL| T    | 50001 |   244K|    51   (2)| 00:00:02 |
--------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("COL1"=:VAL)

히스토그램이 없으니 user_tab_col_statistics의 num_distict 위주로 실행계획을 생성하여 col1 값이 1인 경우가 50%, 10000인 경우가 50%로 가정하여 FTS 실행계획을 생성하였다.

 


컬럼과 히스토그램 수집 관련 참고 사항

1. col1 컬럼에 대한 히스토그램은 수집하지 않게 하고 나머지는 auto 수집하도록 수집하는법

exec dbms_stats.gather_table_stats('sys',tabname=>'t',method_opt=>'FOR ALL COLUMNS SIZE auto, for columns size 1 col1');

 

2. 컬럼과 히스토그램 수집은 하지 않도록 수집하는 법

exec dbms_stats.gather_table_stats(user,tabname=>'t',method_opt=>'for columns ',estimate_percent=>'100');

 

3. 컬럼 통계와 히스토그램도 같이 수집하는 방법

exec dbms_stats.gather_table_stats('sys',tabname=>'t',method_opt=>'FOR ALL COLUMNS SIZE auto, for columns size 1 col1');

 

4. 테이블과 관련 인덱스, 히스토그램, 컬럼 통계 삭제

exec dbms_stats.delete_table_stats(user,tabname=>'t');

 

5. 히스토그램만 삭제하고 컬럼통계는 유지

exec dbms_stats.delete_column_stats('sys',tabname=>'t',colname=>'col1', col_stat_type=>'HISTOGRAM');

 

6. 테이블에 대한 기본 수집 옵션 변경

BEGIN
dbms_stats.set_table_prefs('sys', 't','METHOD_OPT', 'FOR ALL COLUMNS SIZE auto, for columns size 1 col1');
END;
/

 

확인:

select * from user_tab_stat_prefs where table_name='T';

TABLE_NAME PREFERENCE_NAME                PREFERENCE_VALUE
---------- ------------------------------ --------------------------------------------------
T          METHOD_OPT                     FOR ALL COLUMNS SIZE AUTO, FOR COLUMNS SIZE 1 COL1

 

결론

바인드피킹도 히스토그램을 사용한다.
adaptive cursor sharing은 한번은 실행을 해보고 난 뒤에 필요할 경우 실행계획을 추가로 생성한다.

 

Posted by neo-orcl
,

■dbms_stats 프로시저 사용한다.

 

1. create_stat_table 로 통계테이블을 만든다.

PROCEDURE CREATE_STAT_TABLE
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 OWNNAME                        VARCHAR2                IN
 STATTAB                        VARCHAR2                IN
 TBLSPACE                       VARCHAR2                IN     DEFAULT
 GLOBAL_TEMPORARY               BOOLEAN                 IN     DEFAULT

 

$ sqlplus hr/hr

 

orcl@HR> exec dbms_stats.create_stat_table('hr','stat');

PL/SQL procedure successfully completed.

 

2. export_*_stats 를 통해 통계 테이블로 저장

* 위치에 들어갈 수 있는 값
database, column, dictionary, fixed_object, index, pending, schema, system, table

 

3. 다른 db로 통계 테이블 이동(datapump등 사용)

 

4. import_*_stats 를 통해 통계를 딕셔너리에 입력

* 위치에 들어갈 수 있는 값
database, column, dictionary, fixed_object, index, pending, schema, system, table

 

■LAB

1. export_table_stats를 통해 통계를 테이블에 저장

 

PROCEDURE EXPORT_TABLE_STATS
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 OWNNAME                        VARCHAR2                IN
 TABNAME                        VARCHAR2                IN
 PARTNAME                       VARCHAR2                IN     DEFAULT
 STATTAB                        VARCHAR2                IN
 STATID                         VARCHAR2                IN     DEFAULT
 CASCADE                        BOOLEAN                 IN     DEFAULT
 STATOWN                        VARCHAR2                IN     DEFAULT

 

$ sqlplus hr/hr

 

orcl@HR> exec dbms_stats.export_table_stats('hr','employees',null,'stat');

PL/SQL procedure successfully completed.

 

※stat은 위 1단계에서 만든 통계 저장용 테이블이다.

 

orcl@SYSexec print_table('select * from hr.stat where rownum=1');
STATID                        :
TYPE                          : C
VERSION                       : 5
FLAGS                         : 2
C1                            : EMPLOYEES
C2                            :
C3                            :
C4                            : LAST_NAME
C5                            : HR
N1                            : 103
N2                            : .00462962962962963
N3                            : 103
N4                            : 108
N5                            : 0
N6                            : 339495007414717000000000000000000000
N7                            : 469506047861463000000000000000000000
N8                            : 8
N9                            : 1
N10                           : 21
N11                           : 355127267452184000000000000000000000
N12                           :
D1                            : 23-nov-2015 11:00:08
R1                            : 4162656C
R2                            : 5A6C6F746B6579
CH1                           :
CL1                           :

 

2. import_table_stats를 통해 통계를 dictionary에 저장. 만약 다른 DB라면 export/import or empdp/impdp를 통해 테이블을 넣었을 것이다.

 

PROCEDURE IMPORT_TABLE_STATS
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 OWNNAME                        VARCHAR2                IN
 TABNAME                        VARCHAR2                IN
 PARTNAME                       VARCHAR2                IN     DEFAULT
 STATTAB                        VARCHAR2                IN
 STATID                         VARCHAR2                IN     DEFAULT
 CASCADE                        BOOLEAN                 IN     DEFAULT
 STATOWN                        VARCHAR2                IN     DEFAULT
 NO_INVALIDATE                  BOOLEAN                 IN     DEFAULT
 FORCE                          BOOLEAN                 IN     DEFAULT

 

orcl@HR> exec dbms_stats.import_table_stats('hr', 'employees', null, 'stat');                                                

PL/SQL procedure successfully completed.

 

 

Posted by neo-orcl
,

■통계 복원

만약 실행이 정상적이던 SQL이 특정 시점부터 느려졌다면 실행계획의 변경도 의심해보아야 한다. 만약 실행계획의 변경이 통계정보의 갱신에 의한 변경이고 최적화되지 않았다면 통계의 복원을 사용할 기회이다.

 

dbms_stats.restore_*_stats 프로시저로 이전 통계 복원 가능하다

예:
begin
 dbms_stats.restore_table_stats(ownname=>'oe'
  , tabname=>'inventories'
  , as_of_timestamp=>to_date('2015-12-28 10:00', 'yyyy-mm-dd hh24:mi'));
end;
/

 

or

 

begin
 dbms_stats.restore_table_stats('oe','inventories',to_date('2015-12-28 10:00', 'yyyy-mm-dd hh24:mi'));
end;
/

 


■테이블 통계 변경 내역 확인(테이블만 존재)

단, dbms_stats를 통해 수집한 내역만 확인 가능하다. analyze를 통한것은 기록이 남지 않는다.

 

select * from dba_tab_stats_history
where owner = 'HR'
and table_name='EMP'


orcl@SYS> exec print_table('select * from dba_tab_stats_history where owner = ''HR'' and table_name=''EMP''');
OWNER                         : HR
TABLE_NAME                    : EMP
PARTITION_NAME                :
SUBPARTITION_NAME             :
STATS_UPDATE_TIME             : 29-DEC-15 05.47.24.880458 PM +09:00
-----------------
OWNER                         : HR
TABLE_NAME                    : EMP
PARTITION_NAME                :
SUBPARTITION_NAME             :
STATS_UPDATE_TIME             : 29-DEC-15 06.07.28.041455 PM +09:00
-----------------
OWNER                         : HR
TABLE_NAME                    : EMP
PARTITION_NAME                :
SUBPARTITION_NAME             :
STATS_UPDATE_TIME             : 22-DEC-15 10.00.16.870032 PM +09:00
-----------------

PL/SQL procedure successfully completed.

 

 

■보관주기

기본값은 31일

변경은 dmbs_stats.alter_stats_history_retention 으로 설정한다.

 

15일로 변경 예시

 

orcl@SYS> exec dbms_stats.alter_stats_history_retention(15);

PL/SQL procedure successfully completed.

 

확인

 

orcl@HR> select dbms_stats.get_stats_history_retention from dual;

GET_STATS_HISTORY_RETENTION
---------------------------
                         15

 

■ 프로시저 정보

PROCEDURE RESTORE_DATABASE_STATS
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 AS_OF_TIMESTAMP                TIMESTAMP WITH TIME ZONE IN
 FORCE                          BOOLEAN                 IN     DEFAULT
 NO_INVALIDATE                  BOOLEAN                 IN     DEFAULT
PROCEDURE RESTORE_DICTIONARY_STATS
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 AS_OF_TIMESTAMP                TIMESTAMP WITH TIME ZONE IN
 FORCE                          BOOLEAN                 IN     DEFAULT
 NO_INVALIDATE                  BOOLEAN                 IN     DEFAULT
PROCEDURE RESTORE_FIXED_OBJECTS_STATS
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 AS_OF_TIMESTAMP                TIMESTAMP WITH TIME ZONE IN
 FORCE                          BOOLEAN                 IN     DEFAULT
 NO_INVALIDATE                  BOOLEAN                 IN     DEFAULT
PROCEDURE RESTORE_SCHEMA_STATS
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 OWNNAME                        VARCHAR2                IN
 AS_OF_TIMESTAMP                TIMESTAMP WITH TIME ZONE IN
 FORCE                          BOOLEAN                 IN     DEFAULT
 NO_INVALIDATE                  BOOLEAN                 IN     DEFAULT
PROCEDURE RESTORE_SYSTEM_STATS
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 AS_OF_TIMESTAMP                TIMESTAMP WITH TIME ZONE IN
PROCEDURE RESTORE_TABLE_STATS
 Argument Name                  Type                    In/Out Default?
 ------------------------------ ----------------------- ------ --------
 OWNNAME                        VARCHAR2                IN
 TABNAME                        VARCHAR2                IN
 AS_OF_TIMESTAMP                TIMESTAMP WITH TIME ZONE IN
 RESTORE_CLUSTER_INDEX          BOOLEAN                 IN     DEFAULT
 FORCE                          BOOLEAN                 IN     DEFAULT
 NO_INVALIDATE                  BOOLEAN                 IN     DEFAULT

 

'Knowledge > Perfomance Tuning' 카테고리의 다른 글

Adaptive cursor simple test  (0) 2016.01.02
통계 export/import  (0) 2015.12.29
statistics lock/unlock  (0) 2015.12.29
수동통계수집(gathering statistics manually)  (0) 2015.12.29
histogram 고려사항  (0) 2015.12.29
Posted by neo-orcl
,

■통계 lock

    자동 수집 방지 목적

예: 매번 동적 샘플링하도록 설정
begin
 dbms_stats.delete_table_stats('oe','orders');
 dbms_stats.lock_table_stats('oe','orders');
end;
/

 

예: 대표 값에 대한 통계가 있는 테이블에 대한 통계 lock
begin
 dbms_stats.gather_table_stats('oe','orders');
 dbms_stats.lock_table_stats('oe','orders');
end;
/

 

■ lock 방법

lock_partition_stats
lock_schema_stats
lock_table_stats

 

■unlock 방법

unlock_partition_stats
unlock_schema_stats
unlock_table_stats

 

■통계 lock 되었는지 확인하는 방법

 

select table_name, stattype_locked from user_tab_statistics
where stattype_locked='ALL';

 

※stattype은 기본값이 ALL이며 아직까진 다른 옵션은 개발되지 않은 것으로 보인다. 매뉴얼에도 없다.

 

■통계가 lock되어있더라도 강제 갱신 방법

통계가 lock된 테이블이나 테이블의 종속(인덱스, 열, 히스토그램)된 객체에 통계 갱신이나 수집, import를 시도하면
아래처럼 ora-20005를 만난다.

 

SQL> exec dbms_stats.gather_index_stats(null, 'LOCK_TEST_IDX')
BEGIN dbms_stats.gather_index_stats(null, 'LOCK_TEST_IDX'); END;

*
ERROR at line 1:
ORA-20005: object statistics are locked (stattype = ALL)
ORA-06512: at "SYS.DBMS_STATS", line 10872
ORA-06512: at "SYS.DBMS_STATS", line 10896
ORA-06512: at line 1

 

이때 force 옵션을 사용하면 갱신 가능하다.

SQL> exec dbms_stats.gather_index_stats(null, 'LOCK_TEST_IDX', force=>true);
PL/SQL procedure successfully completed.

Posted by neo-orcl
,