레이블이 #오라클교육인 게시물을 표시합니다. 모든 게시물 표시
레이블이 #오라클교육인 게시물을 표시합니다. 모든 게시물 표시

2021년 12월 21일 화요일

오라클SQL튜닝도구 Autotrace, 실행계획, 통계정보, db block gets vs consistent gets, 읽기일관성,Current Mode, 오라클교육/오라클교육/자바교육/자바학원/오라클학원/ORACLe동영상

 

오라클SQL튜닝도구 Autotrace, 실행계획, 통계정보, db block gets vs consistent gets, 읽기일관성,Current Mode, 오라클교육/오라클교육/자바교육/자바학원/오라클학원/ORACLe동영상


http://ojc.asia/bbs/board.php?bo_table=LecOrccleTun&wr_id=163 


오라클SQL튜닝도구 Autotrace, 실행계획, 통계정보, db block gets vs consistent gets, 읽기일관성,Current Mode

오라클SQL튜닝도구 Autotrace, 실행계획, 통계정보, db block gets vs consistent gets, 읽기일관성,Current Mode오라클 SQL 튜닝SQL*Plus 튜닝 도구 AutotraceDB BLOCK GETS vs CONSISTENT GETS실습 ORACLE 19CSQL*Plus에서 Autotrace를

ojc.asia



https://youtu.be/CK4UzRwkDVs

https://youtu.be/9rvdwAcz4D0

https://youtu.be/2DjEl1PYzWo

https://youtu.be/e9lZ0oZNZDo




https://youtu.be/oR_UKxk_HO4


https://youtu.be/b-IxbRmwpGE

오라클 SQL 튜닝



SQL*Plus 튜닝 도구 Autotrace

DB BLOCK GETS vs CONSISTENT GETS



실습 ORACLE 19C





SQL*Plus에서 Autotrace를 이용하여 Oracle Optimizer가 만드는 실행계획과 통계정보를 얻을 수 있는데 DML문의 성능 튜닝을 위한 방법으로 자주 이용된다. 



SET AUTOTRACE를 사용하기 위해선 실행 계획용 테이블(PLAN_TABLE)이 존재해야 하며 구문을 활성화하기 위해 SET AUTOTRACE ON, 비활성화 하기 위해 SET AUTOTRACE OFF하면 된다. 참고로 SET AUTOTRACE에서 사용할 수 있는 옵션은 다음과 같다.

SET AUTOTRACE OFF : 기본값으로 AUTOTRACE를 수행하지 않는다.
SET AUTOTRACE ON EXPLAIN : 실행계획만을 출력
SET AUTOTRACE ON STATISTICS : 통계정보만을 출력
SET AUTOTRACE ON : 옵티마이저의 실행계획과 통계정보, 질의의 실행 결과를 함께 출력
SET AUTOTRACE TRACEONLY [EXPLAIN] : SET AUTOTRACE ON과 유사하지만 옵티마이저의 실행계획과 통계정보만 출력, 쿼리 결과는 출력하지 않는다. 만약 EXPLAIN이라고 하면 실행계획만 출력, STATISTICS라고 하면 통계정보만 출력 한다.


Creating the PLUSTRACE Role

C:\> sqlplus / as sysdba


SQL> @C:\db_home\sqlplus\admin\plustrce.sql

SQL> drop role plustrace;
drop role plustrace
          *
1행에 오류:
ORA-01919: 롤 'PLUSTRACE'(이)가 존재하지 않습니다

SQL> create role plustrace;
롤이 생성되었습니다.

SQL> grant select on v_$sesstat to plustrace;
권한이 부여되었습니다.

SQL> grant select on v_$statname to plustrace;
권한이 부여되었습니다.

SQL> grant select on v_$session to plustrace;
권한이 부여되었습니다.

SQL> grant plustrace to dba with admin option;
권한이 부여되었습니다.

SQL> set echo off

Granting the PLUSTRACE Role

SQL> grant plustrace to scott; -- AutoTrace를 사용할 계정
권한이 부여되었습니다.

SQL> conn scott/tiger        -- AutoTrace를 사용할 계정
연결되었습니다.


Creating a PLAN_TABLE



SQL> @C:\db_home\rdbms\admin\utlxplan.sql

테이블이 생성되었습니다.

여기까지 하면 SQL*Plus에서 TRACE 하기위한 plustrace 롤을 SCOTT이 부여 받았고 , 실행계획을 저장할 테이블인 PLAN_TABLE도 생성된다.

-- 아래 set autotrace on은 SQL문이 실행될 때 마다 실행 계획과 통계정보, 그리고 SQL의 실행 결과까지 보기 위해서 이며 set autotrace trace라고만 하면 결과는 보여주지 않고 실행 계획과 통계정보만 보여주고 기능을 해제하기 위해서는 OFF라고 하면된다.
--쿼리 실행 결과는 안 나온다.
SQL>set autotrace trace   

SQL> select * from emp;
14 개의 행이 선택되었습니다.

Execution Plan
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |    14 |   532 |     3   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| EMP  |    14 |   532 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------

Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
          8  consistent gets
          0  physical reads
          0  redo size
       1467  bytes sent via SQL*Net to client
        415  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
         14  rows processed

SQL> set autotrace off   --Autotrace 기능 해제

SQL> select count(*) from emp;

  COUNT(*)
----------
        14

SQL> set timing on;
SQL> set autotrace traceonly statistics ;
– 결과는 보여주지 않고 통계정보, 쿼리실행시간만 보여준다.
SQL> select * from emp where empno = 7369;

경   과: 00:00:00.02

Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          2  consistent gets
          0  physical reads
          0  redo size
        985  bytes sent via SQL*Net to client
        387  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed


SQL> set autotrace on; 
 
SQL> select deptno, min(sal) from emp
    group by deptno
    having min(sal) > (select min(sal) from emp
                         where deptno = 30)
    order by deptno;

    DEPTNO   MIN(SAL)
---------- ----------
        10       1300

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   FILTER
   2    1     SORT (GROUP BY)
   3    2       TABLE ACCESS (FULL) OF 'EMP'
   4    1     SORT (AGGREGATE)
   5    4       TABLE ACCESS (FULL) OF 'EMP'


Statistics
----------------------------------------------------------
        //재귀호출의 횟수, SQL 파싱과 최적화 과정등에서 발생하게 되는 Data Dictionary 조회,
        // 테이블의 존재나 권한체크(사용자가 테이블에 대해 SELECT 권한 등이 있는지)    
        //하드파싱 시증가. Recursive Call을 최소화 하기 위해서는, 바인드 변수를 사용하여 
        //하드파싱 발생 자체를 줄이는 것이 효과적이다       
        191  recursive calls    
        //현재의 블록이 요구된 횟수
        //DML or SELECT FOR UPDATE등에 의한 Current Mode로 읽힌 블록 수 
         5  db block gets          
        //한 블록에 대해 요구된 consistent read 횟수
        //SELECT했을 때 읽기 일관성 모드로 읽힌 블록 수(Consistent Mode)
        28  consistent gets              
        //디스크로부터 읽어들인 데이터 블록의 총 개수
        7  physical reads 
        // 리두로그가 만들어진 크기(SIZE)             
        0  redo size         
        // Client에 보내진 바이트수
        448  bytes sent via SQL*Net to client       
        // Client로부터 받은 바이트 수
        503  bytes received via SQL*Net from client             
        //클라이언트에 송/수신된 Net메시지 합계 수
        //SQL*Pluss라면 Set Arraysize 설정에 따라 달라진다.
        2  SQL*Net roundtrips to/from client
       // 메모리에서 일어난 소트의 수
       3  sorts (memory)      
       // 디스트에서 일어난 소트의 수    
       0  sorts (disk)     
        //연산을 하는 동안 처리한 ROW의 수       
       1  rows processed 


DB BLOCK GETS vs CONSISTENT GETS


Consistent Mode : 읽기 일관성이 보장된 상태에서 데이터 블록을 읽는 것인데 대부분 SELECT 쿼리가 해당된다. 쿼리가 시작된 시점을 기준으로 일관성있게 읽어 들이며 읽는 도중에 값이 바뀌더라도 쿼리 시작시점의 값으로 읽는다. 그러므로 SCN(System Change Number)의 값을 확인하면서 읽는데 데이터값이 변경된 후 Commit되면 SCN번호가 증가되므로 이 경우에는 Rollback Segment에서 과거의 블록을 읽어들인다. AUTOTRACE에서는 consistent gets로 표시된다.


Current Mode : SQL 시작시점이 아닌 실제 블록을 액세스하는 그 시점의 최종값을 읽어들이는데 AUTOTRACE에서는 db block gets로 표시된다. SELECT FOR UPDATE 또는 DML 또는 디스크 소트가 필요할 정도의 대용량 정렬시 나타난다.


아래의  Update문을 보자.



Update emp
Set sal = sal + 100
Where deptno = 10;


이 경우 수정될 데이터를 찾기 위해 먼저 deptno가 10인 데이터를 읽기 일관성 모드(Consistent Mode)로 읽고 실제 값을 변경하는 시점에 Current Mode로 다시 읽어서 그때의 SAL 값에 100을 더해 변경한다. 이때 deptno=10 데이터를 찾을 때 읽어들이는 blocks은 consistent gets에 나타나고, 실제 변경을 하려고 Current Mode로 읽은 블록은 db block gets에 나타난다.


추가로 한가지 더 이해할 부분은 수정할 데이터를 조회하는 Consistent Mode로 읽을 때는 block단위로 I/O가 발생하므로 읽은 블록수가 표시된다. 또 실제 수정하기 위해 Current Mode로 읽을 때는 수정될 데이터를 찾기 위해 블록을 읽으므로 수정될 데이터 건수와 블록을 읽은 수가 비슷하게 나타나며 Consistent Mode로 읽은 블록수는 수정하기 위해 데이터를 읽은 블록보다 대체로 더 큰값을 가진다.


[실습]



SAL 값은 1000 이 됩니다. 


세션A에서 update 실행 후 commit 하기 전에 다른 세션B에서 또 update를 실행 했습니다.

세션B는 A가 update를 실행하면서 commit을 하지 않았고 Lock을 걸어서 B는 대기하는데, A가 Commit을 한 이후 B의 update 구문은 실행이 됩니다. B가 update를 실행할 때 7369의 SAL은 900이므로 consistent mode로 900을 읽고 current mode로도 900읽어 1000으로 변경 합니다.



#오라클 #SQL튜닝, #Autotrace, #실행계획, #통계정보, #dbblockgets, #consistentgets, #읽기일관성, #CurrentMode, #오라클교육, #오라클동영상, #ORACLE교육, #오라클학원, #ORACLE학원, 오라클 SQL튜닝, Autotrace, 실행계획, 통계정보, dbblockgets, consistentgets, 읽기일관성, CurrentMode, #오라클교육, 오라클동영상, ORACLE교육, 오라클학원, ORACLE학원, 

2021년 11월 20일 토요일

오라클SQL교육강좌, 오라클 동의어(Oracle Synonym)

 

동의어synonym는 테이블, 뷰, 시퀀스, 프로그램 유닛(함수, 프로시저, 패키지)에 대한 별명이며 공용(public), 전용(private) 두가지 형태로 작성 가능 합니다. 공용 동의어public synonym는 DBA 권한을 가진 사용자만이 생성 가능하고 모든 계정에서 접근 가능 하며, 전용 동의어private synonym는 동의어로 작성 될 객체에 대한 접근 권한을 얻은 사용자가 작성하는 동의어로 해당 USER에서만 사용 가능 합니다.

동의어는 단순한 별칭 이므로 데이터 딕셔너리data dictionary의 정의 외 다른 저장 공간이 필요하지는 않습니다.

동의어는 보안과 편의성 때문에 사용되는데 객체의 이름 및 소유자를 가릴 수 있습니다. 또 분산 환경에서 원격 객체에 대한 위치 투명성 제공합니다. 동의어로 만들어진 테이블의 이름을 바꾸거나 이동해야하는 경우 동의어 만 다시 정의하면되기 때문에 이 방법이 유용하며 동의어를 기반으로하는 응용 프로그램은 수정없이 계속 사용 가능 합니다.

동의어는 스키마 오브젝트를 직접 참조 합니다. 예를 들어 SCOTT 계정에서 EDU라는 계정의 STUDENT 테이블을 참조할 때 EDU.STUDENT 라고 써주어야 하는데 여러 번 사용되는 경우에는 이름이 길어서 불편 합니다. 이러한 경우 EDU.STUDENT 에 대한 동의어를 만들어서 사용하면 편리 합니다.

[기본형식]

CREATE [PUBLIC] SYNONYM [schema.] synonym_name
FOR [schema.]object;
PUBLIC : 공용 동의어를 정의하며 생략하면 전용 동의어를 정의합니다.

실제 RABBIT 사용자를 생성하고 테이블을 만들어서 SCOTT 계정에서 동의어를 만들고 이를 딕셔너리 뷰에서 확인 후 삭제해 보겠습니다.

실습

실습을 위한 RABBIT 사용자 계정을 생성합니다. 오라클12C 이후 사용자 생성시 앞에 C##을 붙여야만 하는데 이전 방식과 동일한 방식으로 사용자를 생성하기 위해 세션 레벨에서 “_ORACLE_SCRIPT”=TRUE라고 설정합니다.

현재 세션에서 오라클 12C 이전 스크립트방식을 지원하면서 사용자를 생성하기 위해 _ORACLE_SCRIPT를 TRUE로 설정하세요.

ALTER SESSION SET "_ORACLE_SCRIPT"=TRUE;

<실행결과>

Session이(가) 변경되었습니다.

새로운 사용자 계정을 생성 합니다.

ID : RABBIT, PASSWORD : RABBIT으로 사용자 계정을 생성하세요.

CREATE USER RABBIT IDENTIFIED BY RABBIT;

<실행결과>

User RABBIT이(가) 생성되었습니다.

오라클에 접속을 하기위한 롤role과 테이블 등을 생성할 수 있는 롤을 부여합니다. 롤은 권한privilege을 여러개 합쳐놓은 것 입니다.

생성한 사용자 계정에 CONNECT, RESOURCE 롤을 부여하세요.

GRANT CONNECT, RESOURCE TO RABBIT;

<실행결과>

Grant을(를) 성공했습니다.

CONNECT 롤에는 ALTER SESSION, CREATE SESSION, CREATE CLUSTER, CREATE SYNONYM, CREATE DATABASE LINK, CREATE TABLE, CREATE SEQUENCE, CREATE VIEW 권한이 포함되어 있고, RESOURCE 롤에는 CREATE CLUSTER, CREATE INDEXTYPE, CREATE OPERATOR, CREATE PROCEDURE, CREATE SEQUENCE

CREATE TABLE, CREATE TRIGGER, CREATE TYPE 권한이 포함되어 있습니다.

오라클에 접속을 하기위한 롤role과 테이블 등을 생성할 수 있는 롤을 부여합니다. 롤은 권한privilege을 여러개 합쳐놓은 것 입니다.

생성한 사용자 계정에 CONNECT, RESOURCE 롤을 부여하세요.

GRANT CONNECT, RESOURCE TO RABBIT;

<실행결과>

Grant을(를) 성공했습니다.

오라클11g 까지는 RESOURCE 롤에 UNLIMITED TABLESPACE 권한이 있어 RESOURCE 롤을 부여후 CREATE TABLE이 가능했지만 12C 이후에는 별도로 부여해야 합니다.

생성한 사용자 계정에 UNLIMITED TABLESPACE 권한을 부여하세요.

GRANT UNLIMITED TABLESPACE TO RABBIT;

<실행결과>

Grant을(를) 성공했습니다.

RABBIT 계정으로 명령프롬프트를 이용하여 접속 후 테이블을 생성하고 데이터 2건을 입력 합니다.

생성한 사용자 계정에서 테이블 및 데이터를 생성 하세요.

SQL Developer의 SCOTT 계정에서 RABBIT 계정의 CUSTOMER 테이블을 SELECT 합니다. SCOTT 계정은 DBA 롤을 부여받은 계정이므로 SELECT 되지만 일반 다른 사용자에서는 CUSTOMER 테이블에 대한 SELECT 권한을 부여 받아야 합니다.

RABBIT 계정의 CUSTOMER 테이블을 SELECT 하세요.

SELECT * FROM RABBIT.CUSTOMER;

<실행결과>

 
ID
NAME
1
1
1길동
2
2
2길동

RABBIT.CUSTOMER에 대한 공용 동의어를 생성합니다. 공용 동의어는 모든 사용자 계정에서 접근 가능 합니다.

RABBIT.CUSTOMER에 대한 동의어 RC를 생성 합니다.

CREATE PUBLIC SYNONYM RC FOR RABBIT.CUSTOMER;

<실행결과>

SYNONYM RC이(가) 생성되었습니다.

동의어를 통해 데이터를 조회 합니다.

동의어 RC를 SELECT 합니다.

SELECT * FROM RC;

<실행결과>

 
ID
NAME
1
1
1길동
2
2
2길동

생성한 동의어를 딕셔너리 뷰에서 조회 합니다.

동의어 RC를 SELECT 합니다.

SELECT OWNER, SYNONYM_NAME, TABLE_OWNER

FROM DBA_SYNONYMS

WHERE SYNONYM_NAME = 'RC' ;


#오라클교육, #ORACLE교육, #오라클동의어, #동의어, #ORACLE, #synonym, #OracleSynonym

<실행결과>

 
OWNER
SYNONYM_NAME
TABLE_OWNER
1
PUBLIC
RC
RABBIT

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...