카테고리 없음2022. 10. 13. 20:26

dbms_xplan 패키지에 대하여

 

SQL 의 실행계획 및 옵티마이져 통계를 보기 위해서는 SQL_TRACE를 사용하면 더 구체적인 정보를 확인할 수 있지만 SQL_TRACE를 사용할 수 있는 권한이 없는 경우도 있고, 

굳이 파일로 생성하여 확인하는 과정이 번거롭다고 느낄 수도 있다.

 

이 때 dbms_xplan 패키지를 활용하여 SQL plan을 쉽게 얻을 수 있다.

 

주요 함수들

dbms_xplan.display

dbms_xplan.display_awr

dbms_xplan.display_cursor

dbms_xplan.display_sql_plan_baseline

dbms_xplan.display_sqlset

 

 

1. 권한 설정

 

dbms_xplan을 사용하기 위해선느 다음과 같이 일부 뷰들에 대한 select 권한이 부여되어 있어야 한다.

 

grant select on v_$session to <username>;

grant select on v_$sql_plan_statistics_all to <username>;

grant select on v_$sql to <username>;

 

# statistics_level을 아래와 같이 all로 설정한 경우, gather_plan_statistics

힌트를 주지 않아도 실행 통계 확인이 가능하다. 권장 사항은 아니다. 

 

alter session set statistics_level = all;

 

SQL Plan 확인

 

1. hint 추가

 

조금 더 유용한 정보를 얻기 위해서는 SQL에 gather_plan_statistics 힌트를 주어야 한다. 이 힌트가 포함되지 않은 SQL은 실실행계획에서 옵티마이저가 실행 전에 예상한 값만을 저장하고, 힌트가 포함된 경우는 실행 이후의 실제 실행통계 정보도 함께 포함된다.

 

select /*+ gather_plan_statistics plan_test */ col1

from tab1;

 

 

2. 실행한 SQL의 sql_id 확인

 

SQL을 실행한 이후 해당 SQL에 대해서만 plan을 추출하기 위해 sql_id를 확인한다. sql_text 컬럼을 조회해보면 library_cache에 저장된 sql들이 모두 조회되므로 원하는 sql의 id만 추출해낼 수 있도록 where 조건을 통해 필터링 해야 한다.

 

이때 명확하게 구별해낼 수 있도록 SQL 힌트에 유니크한 문자열을 주는 것도 한 방법이다.

(여기서는 plan_test라는 문자열을 추가로 넣어주었다.)

 

select sql_id, sql_text

from v$sql

where sql_text not like '%v$sql%'

and sql_text like '~~~~'

and sql_text like '%plan_test%'

order by last_active_time desc;

 

 

 

3. SQL Plan 조회

 

위 과정에서 조회한 sql_id 를 아래의 sql_id 부분에 넣어주고 실행

 

select *

from table(dbms_xplan.display_cursor(sql_id, null, 'allstats');

 

sql_id를 조회하기가 번거롭고 사용자가 많지 않은 경우

가장 마지막에 실행된 sql에 대해 아래와 같이 간단하게 조회할 수 있다.

 

select *

from table(dbms_xplan.display_cursor(null,null,'allstats last -rows'));

 

예시)

SQL> SELECT * 
     FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('ak7vxhj055996', 1, 'ALLSTATS LAST'));

-- 실제 수행한 결과
---------------------------------------------------------------------------------------
|Id  | Operation                  | Name   | E-Rows | A-Rows | A-Time     | Buffers |
---------------------------------------------------------------------------------------
|* 1 | TABLE ACCESS BY INDEX ROWID| EMP    | 1      | 0      |00:00:00.01 | 4       |
|* 2 | INDEX UNIQUE SCAN          | EMP_U1 | 1      | 1      |00:00:00.01 | 3       |
---------------------------------------------------------------------------------------

-- 예측 결과
-------------------------------------------------------
|Id  | Operation                  | Name   | E-Rows |
-------------------------------------------------------
|* 1 | TABLE ACCESS BY INDEX ROWID| EMP    | 1      |
|* 2 | INDEX UNIQUE SCAN          | EMP_U1 | 1      |
-------------------------------------------------------

-- 예측 실행계획과 실제 실행계획 비교
 - A-Rows, A-Time, Buffer 추가 정보 보여줌
 - E : Estimate, A : Actual
   

 

 

 

4. 예측 실행계획만 확인하고 싶을 때

 

SQL 실행 전, 그냥 실행계획만을 확인하고 싶은 경우는 display_cursor 대신 display를 사용하면 된다.

 

# 실행계획 수집

explain plan for

select *

from tab1

where condition is not null;

 

# 실행계획 조회

select * from table(dbms_xplan.display);

 

참고사이트 

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=itperson&logNo=220840180396 

 

[Oracle] dbms_xplan 을 활용한 SQL Plan 확인

SQL 실행계획을 확인하고 싶을 때 SQL_TRACE 를 쓰면 더 구체적인 정보를 확인할 수 있지만 S...

blog.naver.com

https://docs.oracle.com/database/121/ARPLS/d_xplan.htm#ARPLS378

 

DBMS_XPLAN

format Controls the level of details for the plan. It accepts four values: BASIC: Displays the minimum information in the plan—the operation ID, the operation name and its option. TYPICAL: This is the default. Displays the most relevant information in th

docs.oracle.com

 

https://argolee.tistory.com/8

Posted by 자수성가한 부자
카테고리 없음2022. 7. 19. 17:03

(1) 기본 매커니즘

 

Nested Loops 조인을 이해하기 위한 중첩 루프

 

중첩 루프문

 

<C, JAVA>

for(i=0; i<100; i++){

   for(j=0; j<100; j++) {

     // Do Anything

   }

}

 

begin

  for outer in (select deptno, empno, rpad(ename, 10) ename from emp)

    for inner in (select dname from dept where depeno = outer.deptno)

    loop

       dbms_output.put_line(outer.empno||' : '||outer.ename||' : '||inner.dname);

    end loop;

  end loop;

end

 

위 PL/SQL문은 아래 쿼리와 100% 같은 순서로 데이터를 엑세스하고, 데이터 출력 순서도 같다. 내부적으로 쿼리를 반복 수행하지 않는다는 점만 다르다.

 

select /*+ ordered use_nl(d) */ e.empno, e.ename, d.dname

from emp e, dept d

where d.deptno = e.deptno;

 

 

(2) 힌트를 이용해 NL 조인을 제어하는 방법

 

select /*+ ordered use_nl(e) */ *

   from dept d, emp e

 where d.deptno = d.deptno;

 

ordered 힌트는 from 절에 기술된 순서대로 조인하라고 옵티마이저에게 지시할 때 사용하고,

use_nl 힌트는 NL 방식으로 조인하라고 지시할 때 사용한다. 위에서는 ordered와 use_nl(e) 힌트를 같이 사용했으므로 dept 테이블을 기준으로 emp테이블과 조인할 때 NL방식으로 조인하라는 뜻이다.

 

 

참고로 세개 이상의 테이블을 nl 조인으로 유도할 때 쓰는 힌트 예제

 

select /*+ ordered use_nl(B) use_nl(C) use_nl(D) */ *

from A, B, C, D

where ....

 

 

(3) NL 조인 튜닝 실습

 

- 테이블 및 인덱스 정보

 

테이블 : jobs, employees

인덱스 : 

pk_jobs : jobs.job_id

jobs_max_sal_ix : jobs.max_salary

pk_employees : employees.employee_id

emp_job_ix : employees.job_id

emp_hiredate_ix : employees.hire_date

 

 

튜닝 대상 쿼리

 

select /*+ ordered use_nl(e) index(j) index(e) */

         j.job_titile, e.first_time, e.last_time,

        e.hire_date, e.salary, e.email.e.phone_number

from jobs j, employees e

where e.job_id = j.job_id        ------------  ①

and j.max_salary >= 1500     ------------- ②

and j.job_type = 'A'                ------------- ③ 

and e.hire_date >= to_date('19960101','yyyymmdd');  ----------- ④

 

② -> ③ -> ① -> ④ 

 

 

참고 : 

오라클 성능 고도와 원리와 해법 Ⅱ(p. 210 ~ p.214)

Posted by 자수성가한 부자
카테고리 없음2021. 12. 21. 14:56

 

 

select output from table (dbms_workload_repository.awr_report_text(
'4152996211',   -- DBID
'1',            -- Instance #
'82',           -- begin Snapshut ID
'86',           -- End Snapshut ID
0 )             -- Report option (0: Default / 8: Including ADDM Information (as a Advice)
);

 

 

참고사이트 : 

https://pat98.tistory.com/851

Posted by 자수성가한 부자
카테고리 없음2021. 11. 23. 15:02

0. 설치 파일 unzip

unzip <grid 설치파일> -d /oracle/19

unzip <oracle engine 설치파일> -d /oracle/grid

OPatch 최신버전으로 변경

unzip P6880880_xxxx.zip 

 

1. GRID 설치

 

1) 설치전 requirement 확인

  - silent 모드로 RU patch를 동시에 실행하면서 사전 체크를 한다.

./gridSetup.sh -silent -responseFile /oracle/grid/install/response/gridsetup.rsp -applyRU /home/oracle/32895406 -executePrereqs

 

2) grid 설치

./gridSetup.sh -silent -responseFile /oracle/grid/install/response/gridsetup.rsp -applyRU /home/oracle/32895406 -ignorePrereq

 

 

2. DB 엔진 설치

 

export CV_ASSUME_DISTID=RHEL7.6

※ RHEL 8 버전은 아직 인증이 되지 않는 듯 하다.

cd /oracle/19

./runInstaller -silent -responseFile /oracle/19/install/response/db_install.rsp -applyRU /home/oracle/32895406 -waitForCompletion -ignorePrereq

 

3. 디스크 그룹 추가

 

create diskgroup DATA external redundancy disk

'/dev/asm/data_01',

'/dev/asm/data_02'

ATTRIBUTE 'compatible.asm'='19.0.0.0.0',

'compatible.rdbms'='10.1.0.0.0',

'au_size'='4M';

 

 

4. db 생성

 

dbca -silent -createDatabase -responseFile <response파일위치>

Posted by 자수성가한 부자
Oracle/RAC2021. 11. 23. 14:49

 

su - oracle

1) 현재 OCR에 설정되어 있는 IP정보 확인

$GRID_HOME/bin/oifcfg getif 

 

 

2) 기존 ip 삭제

$GRID_HOME/bin/oifcfg delif -global eth1

 

3) 신규 ip 대역 입력

$GRID_HOME/bin/oifcfg setif -global eth1/20.20.20.0:cluster_interconnect

 

※ class 까지 입력할 것.

 

 

참고사이트 : 

https://positivemh.tistory.com/322

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

오라클 RAC의 서비스 와 백그라운드 프로세스  (0) 2019.01.22
RAC 노드간 parallel process 제어  (0) 2015.08.18
CSS 파라미터  (1) 2013.08.12
[펌] crs 로그 위치  (0) 2013.02.07
CRS 소프트웨어 버전 확인  (0) 2011.09.08
Posted by 자수성가한 부자
카테고리 없음2021. 10. 19. 16:21


Flex ASM

flex ASM에서는 클러스터로 이루어진 서버들의 숫자보다 더 적은 수의 ASM 인스턴스로 운영이 가능하며,
적용되는 ASM의 최대 인스턴스의 개수를 ASM 카디널리티라고 한다.

만약 ASM 인스턴스가 실패할 경우 클러스터웨어는 다른 서버에 ASM 인스턴스를 기동시켜 ASM 카디널리티를 유지하게 된다.
이 때 데이터베이스는 ASM 인스턴스가 실패시 같이 데이터베이스가 실패되는 것이 아닌, 다른 ASM 인스턴스로 연결이 된다.
ASM 카디널리티의 기본값은 3이며, 클러스터웨어 명령을 통해 원하는 숫자로 변경이 가능하다.

Flex ASM 특징
 - ASM diskgroup의 최대 개수가 63개에서 511개로 증가
 - 더 큰 LUN 사이즈 지원(32PB)
 - Disk Group 내의 ASM Disk 이름 변경 가능



[grid@server1 ~]$ asmcmd showclusterstate
Normal

현재 기동중인 ASM이 Flex ASM인지 확인하는 명령어,
[grid@server1 ~]$ asmcmd showclustermode
ASM cluster : Flex mode enabled

ASM 인스턴스 카디널리티

[grid@rac1 ~]$ srvctl config asm
ASM home: <CRS home>
Password file: +SYSVOL/orapwASM
ASM listener: LISTENER
ASM instance count: 3               ==============> 카디널리티
Cluster ASM listener: ASMNETLSNR_ASM

현재 ASM Instance 가 어느 노드에서 떠 있는지를 확인하기 위해서는 SRVCTL 명령으로 확인 할 수 있다

[grid@rac1 ~]$ srvctl status asm -detail
ASM is running on rac1,rac2,rac3
ASM is enabled.

카디널리티 변경
$ srvctl modify asm –count n

n 값이 변경할 카디널리티



[grid@server3 ~]$ crsctl stat res -t
--------------------------------------------------------------------------------
Name           Target  State        Server                State details
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.ASMNET1LSNR_ASM.lsnr
               ONLINE  ONLINE       server1               STABLE
               ONLINE  ONLINE       server2               STABLE
               ONLINE  ONLINE       server3               STABLE

[root@server1 usr]# srvctl config asm
ASM home: /u01/app/12.1.0.1/grid
Password file: +OCR/orapwASM
ASM listener: LISTENER
ASM instance count: 3
Cluster ASM listener: ASMNET1LSNR_ASM


[grid@server1 ~]$ srvctl modify asm -count 2
[grid@server1 ~]$ srvctl status asm
ASM is running on server3,server1


SQL> select dg.name,c.instance_name,c.db_name,c.status
  2  from v$asm_diskgroup dg, v$asm_client c
  3  where dg.group_number = c.group_number
  4 and c.db_name = 'ORCL'
  5 /
 
NAME       INSTANCE_N DB_NAME  STATUS
---------- ---------- -------- ------------
DATA       ORCL2      ORCL     CONNECTED
DATA       ORCL1      ORCL     CONNECTED


사일런트 모드로 ASM을 flex ASM으로 변경
asmca -silent 
     -convertToFlexASM 
     -asmNetworks interface_name/subnet
     -asmListenerPort ASM_listener_port_number


/app/aime/cfgtoollogs/asmca/scripts/converttoFlexASM.sh


flex asm 설치시 response file 정보

oracle.install.crs.config.storageOption=FLEX_ASM_STORAGE

Posted by 자수성가한 부자
카테고리 없음2021. 10. 19. 11:27

점보프레임(Jumbo Frame)

 

 


점보프레임(Jumbo Frame)을 소개해 볼까 한다. 기본적으로 우리가 지금 사용하는 MTU(Maximum Transmission Unit) 값은 1500 바이트이다. 실제 전송시에는 여기에 프레임 헤더를 붙이면 18 바이트가 추가되어 기본적으로는 1518 바이트가 된다. 점보프레임은 이름에서 느껴지는 것과 같이 프레임 크기를 크게 늘려주는 것이다. 점보프레임은 9000 바이트까지 MTU 를 확장시켜 준다. 처음 이더넷 프레임으로 1500 바이트가 사용된 것은 과거 낮은 통신속도와 비교적 높게 발생되었던 에러 비율 때문에 그런것이다. 즉, 데이터를 전송하다가 에러가 발생되면 단지 1500 바이트 부분만 에러를 정정하여 재 전송하면 되는 것이었다.

하지만 각 프레임은 네트워크 하드웨어와 소프트웨어적으로 프로세싱하는 것이 필요하다. 만약 프레임 사이즈가 커진다면 시스템에서 전송하기 위해 사용되는 처리 CPU 가 더 줄어든다. 그러므로 9000 바이트 이상으로 커진다면 데이터를 자르는 기준이 적어지므로 더욱 빠른 속도로 전달될 수 있는 것이다. 한번에 1500 바이트가 아닌 9000 바이트를 전송하기 때문이다.

그렇지만, 요새 하드웨어 성능은 워낙 좋아졌기 때문에 점보프레임으로 인한 성능 향상은 그리 크지는 않을 수 있다. 점보프레임이 2000년대 초 소개되었을 당시는 어느 정도 효과를 볼 수 있었을지 몰라도 빠르게 발전하는 하드웨어 속도에 비하면 프레임을 나누기 위한 CPU 사용은 적기 때문이다. 그래도 모든 사람이 좋은 하드웨어를 사용하는 것은 아니기 때문에 어느정도 효과는 있을 수 있다. 경험상 10-20% 정도의 향상을 얘기하는 경우가 많다.

점보프레임을 사용하기 위해서는 스위치, NIC 카드등에서 지원해야 하며, 요즘 사용되는 장비들은 대부분 지원한다. 다음 그림은 점보프레임이 설정된 패킷을 덤프한 것으로 데이터 크기가 8920 바이트나 되는 것을 확인할 수 있다.


점보프레임 확인 방법

# ip rounte get <IP>

111.6.0.25 dev bond1  src 111.6.0.30
    cache  mtu 9000 advmss 8960 hoplimit 64

 

jumbo frame으로 통신이 가능한지 확인

# ping -M do -s 8972 <목적지IP>



ifconfig 로도 확인해 볼 수 있다.

eth6      Link encap:Ethernet  HWaddr [삭제]
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:78501442 errors:0 dropped:0 overruns:0 frame:0
          TX packets:29641408 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:34935770805 (32.5 GiB)  TX bytes:25180384472 (23.4 GiB)
          Interrupt:48 Memory:d6000000-d6012800


변경방법
# ifconfig eth6 mtu 9000
# ifconfig eth6

eth6      Link encap:Ethernet  HWaddr [삭제]
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:9000  Metric:1
          RX packets:2892 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2728 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:256450 (250.4 KiB)  TX bytes:2785780 (2.6 MiB)
          Interrupt:32 Memory:d8000000-d8012800


# vi /etc/sysconfig/network-script/ifcfg-eth0

 

참고사이트

http://www.packetinside.com/2012/03/jumbo-frame.html

 

점보프레임(Jumbo Frame)으로 전송속도 높이기

점보프레임(Jumbo Frame) 을 소개해 볼까 한다. 기본적으로 우리가 지금 사용하는 MTU(Maximum Transmission Unit) 값은 1500 바이트이다. 실제 전송시에는 여기에 프레임 헤더를 붙이면 18 바이트가 추가되어

www.packetinside.com

 

Posted by 자수성가한 부자
카테고리 없음2021. 10. 2. 18:33

https://biz.chosun.com/industry/company/2021/09/28/GSVF6BZTCFCOTKB4TSZNTVCMTE/

 

대한항공, 전사 IT 시스템 아마존웹서비스로 이관 완료

대한항공, 전사 IT 시스템 아마존웹서비스로 이관 완료

biz.chosun.com

 

 => 사내 인프라를 클라우드로 전환하는 사례가 많이 생길것으로 판단된다.

Posted by 자수성가한 부자
카테고리 없음2021. 9. 29. 16:19

효율적인 회의를 위한 체크리스트

1. 정말로 필요한 회의인지 고민했나요?
2. 최소 하루 전에 참석 요청 메일을 보냈나요?
3. 회의의 목적을 명확히 설정했나요?
4. 회의 의제에 대한 구조를 잡았나요?
5. 목적, 의제, 토론 방식 등을 적은 페이퍼를 공유했나요?

Posted by 자수성가한 부자
카테고리 없음2021. 9. 16. 09:49

 

 

실행계획의 Row source operation의 의미

 

 


 

SORT ORDER BY

:order by 구문에 의한 정렬이 일어나는 단계

 

SORT UNIQUE

: 선택된 결과집합에서 중복 레코드를 제거하고자 할 때 나타남.
  Union 연산자나 Distinct 연산자를 사용할 때가 대표적임.

 

HASH GROUP BY

 : group by 구문에 의한 grouping이 되는 단계로 hash 함수를 사용하여 grouping함.

 

HASH UNIQUE 

 : hash 함수를 이용하여 중복제거를 하는 오퍼레이션

 

MERGE JOIN CARTESIAN

 : sort merge 조인이 일어나는 단계로 두 테이블간의 별도의 key가 join 조건이 없기때문에 crtesian이 일어난다.

 

NESTED LOOPS

 : 조인 방법 중 nested loops 로 조인하는 단계

 

INDEX RANGE SCAN

 : 인덱스의 범위 스캔이 일어나는 단계

 

INDEX UNIQUE SCAN

 : 유니크 인덱스 스캔이 일어나는 단계

 

TABLE ACCESS BY INDEX ROWID

: 인덱스의 rowid를 이용하여 테이블을 스캔하는 단계

 

BUFFER SORT

 : 후보행들을 database buffer cache에서 정렬하는 오퍼레이션

 

FIRST ROW

 : 한개의 행만 읽어온다는 뜻으로, INDEX RANGE SCAN (MIN/MAX) 이 후에 자주 나오는 오퍼레이션이다. 최대값이나 최소값 1개의 행만 읽을 때 일어나는 단계이다.

 

INDEX RANGE SCAN (MIN/MAX)

 : 인덱스가 항상 정렬 상태를 유지한다는 특징을 이용하여 Min, Max 값 추출

 

SORT AGGREGATE

 : 전체 row의 합계를 구한 후 정렬하는 오퍼레이션

 

TABLE ACCESS FULL

 : full table scan

 

 

WINDOW SORT PUSHED RANK

 : window 함수를 사용하면서 

 

  예) ROW_NUMBER() OVER (PARTITION BY A.COL1 ORDER BY COL2 DESC) SEQNO

.

.

.

WHERE SEQNO = 1;

 

 

WINDOW NOSORT

 

 

 

※ 참고사이트

 

http://www.gurubee.net/lecture/2409

 

소트 튜닝

1. 소트와 성능가. 메모리 소트와 디스크 소트Oracle은 소트 영역을 PGA 영역에 할당하고, SQL Server는 버퍼 캐시에 할당함.소트 시 메모리 공간이 부..

www.gurubee.net

 

Posted by 자수성가한 부자