์คํ๊ณํ
์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ๋๋ฅผ ๋ ์ฌ๋ ค๋ด ์๋ค. ๋ฌธ์ ๋ฅผ ์ฝ๊ณ ์ด๋ค ๋ฐฉ์์ผ๋ก ํ์ด์ผ ์ ํ๋์ ํจ์จ์ฑ์ ์ก์ ์ ์์์ง ๊ณ ๋ฏผํฉ๋๋ค. ์์ ํ์์ ํด์ผํ๋์ง, ์ด๋ถํ์ผ๋ก ์๊ฐ๋ณต์ก๋๋ฅผ ์ค์ผ ์ ์๋์ง, ํน์ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด๋ค ๊ฒ์ ์ ํํด์ผํ๋์ง ๋ฑ ์ฌ๋ฌ ๊ณ ๋ฏผ์ ํ๊ณ ์ต์ ์ด๋ผ๊ณ ์๊ฐํ๋ ๋ฐฉ๋ฒ์ ์ ํํฉ๋๋ค.
์คํ๊ณํ๋ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ฅผ ํธ๋ ๊ณผ์ ๊ณผ ๋น์ทํฉ๋๋ค. ์ตํฐ๋ง์ด์ ๊ฐ ์ด๋ค ๋ฐฉ์์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์คํํด์ผ ๋น ๋ฅธ์๋๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ ์ ์๋์ง ๊ณ ๋ คํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ธฐ๊น์ง์ ๊ณผ์ ์ ์๋ ค์ค๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฌํ ์คํ๊ณํ์ ํ์ธํ๋ฉด์ SQL ์ฟผ๋ฆฌ๋ฌธ์ด ํจ์จ์ ์ผ๋ก ์ฌ์ฉ๋๊ณ ์๋์ง ํ์ธํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ๊ฐ ๋๋์ผ๋ก ๋์ด๋๋ฉด์ ํนํ ์๋๊ฐ ์ค์ํ ์์๊ฐ ๋์์ต๋๋ค. ๊ฐ๋จํ ํ๋์ ํตํด์๋ ์์ฒญ๋ ํจ์จ์ ์ป์ ์ ์๊ธฐ ๋๋ฌธ์ ํ๋์ ๊ธฐ๋ณธ์ธ ์คํ๊ณํ์ ํ์ธํ๋ ๋ฐฉ๋ฒ์ XPLAN, AutoTrace, SQL Trace ํฌ๊ฒ 3๊ฐ์ง ๋ฐฉ๋ฒ์ ์์๋ณด๊ฒ ์ต๋๋ค.
์ค์ต ์ค๋น
OS : Red Hat Enterprise Linux Server release 6.10
DB : Oracle 11.2.0.1
SID : orcl
user : jamong
์์ ํ๊ฒฝ์์ ์ค์ต์ ์งํํ๊ณ ์คํ๊ณํ์ ํ์ธํ๋ ๋ฐฉ๋ฒ๋ค์์ ์ฌ๋ฌ ๊ถํ ๋ฐ ์ฌ์ ์์ ์ด ํ์ํ์ฌ ์๋กญ๊ฒ jamong์ด๋ผ๋ ์ ์ ๋ฅผ ์์ฑํด์ ์งํํ์ต๋๋ค.
SYS@orcl> create user jamong identified by jamong;
User created.
SYS@orcl> grant connect,resource to jamong;
Grant succeeded.
SYS@orcl> create table jamong.dept as select * from scott.dept;
Table created.
SYS@orcl> create table jamong.emp as select * from scott.emp;
Table created.
SYS@orcl> conn jamong/jamong
Connected.
JAMONG@orcl> alter table dept add constraint pk_dept primary key(deptno);
Table altered.
JAMONG@orcl> alter table emp add constraint pk_emp primary key(empno);
Table altered.
scott ๊ณ์ ์ dept, emp ํ ์ด๋ธ์ ์ฌ์ฉํ๊ฒ ์ต๋๋ค.
select
owner,
synonym_name,
table_owner,
table_name
from all_synonyms
where synonym_name = 'PLAN_TABLE';
SQL์ ๋ํ ์คํ๊ณํ์ด plan_table์ ์ ์ฅ๋ฉ๋๋ค. oracle 10g ๋ถํฐ๋ ์ค์น์ ๊ธฐ๋ณธ์ ์ผ๋ก ํ ์ด๋ธ์ด ์์ฑ๋๊ณ ์ด๋ฅผ ๊ฐ๋ฅดํค๋ plan_table synonym์ด ์์ฑ๋ฉ๋๋ค. ๋ง์ฝ ํด๋น synonym์ด ์๋ค๋ฉด ์ค๋ผํด์์ ์ ๊ณตํ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํด์ ์์ฑํ ์ ์์ต๋๋ค. ์์ ์ ์๋ ๋ช ๋ น์ผ๋ก ์์ฑ๊ฐ๋ฅํฉ๋๋ค.
SYS@orcl> @ ?/rdbms/admin/utlxplan.sql
์ด์ ๋ชจ๋ ์ค๋น๋ ๋๋ฌ๊ณ ์คํ๊ณํ ํ์ธ๋ฐฉ๋ฒ์ ํ๋์ฉ ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
์คํ๊ณํ ์คํ ์์
์์ ๊ฐ์ด ์คํ๊ณํ์ด ์๋ค๊ณ ํ์๋ ์คํ๋๋ ์์๋ ์ด๋ป๊ฒ ๋ ๊น์? ๊ฐ์ฅ ์์์๋ถํฐ, ์์์๋ถํฐ๋ฅผ ๊ธฐ์ตํ์๋ฉด ๋ฉ๋๋ค. ์์ ์คํ๊ณํ์ ์์๋ 3 - 2 - 5 - 4 - 1์ด ๋๊ฒ ์ต๋๋ค.
1. AutoTrace
AutoTrace๋ ์คํ๊ณํ์ ํ์ธํ๊ธฐ ์ํ ๋๊ตฌ์ค ํ๋๋ก ๊ฐ์ฅ ์ฝ๊ฒ ํ์ธํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ฟผ๋ฆฌ ์คํ๊ณผ ๋์์ ์คํ๊ณํ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์์ผ๋ฉฐ ์ํ ๊ฒฐ๊ณผ, ์คํ ๊ณํ, ์คํ ํต๊ณ 3๊ฐ์ง ๋ถ๋ถ์ ์ต์ ์๋ฐ๋ผ ์กฐํฉํด์ ์ถ๋ ฅํ ์ ์์ต๋๋ค. ์ํ ๊ฒฐ๊ณผ์ ์คํ ๊ณํ์ ๋ฐ๋ก ํ์ธ ๊ฐ๋ฅํ์ง๋ง, ์คํ ํต๊ณ ๋ถ๋ถ์ ํจ๊ป ์ถ๋ ฅํ๋ ค๋ฉด v_$sesstat, v_$statname, v_$mystat ๋ทฐ์ ๋ํ ์ฝ๊ธฐ ๊ถํ์ด ํ์ํฉ๋๋ค. ์ค๋ผํด์์๋ plustrce.sql ์คํฌ๋ฆฝํธ๋ฅผ ์ ๊ณตํ์ฌ ์คํ ํต๊ณ๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํ ๋ทฐ๋ฅผ ๋กค์ ์์ฑํ ์ ์์ต๋๋ค.
SYS@orcl> @ ?/sqlplus/admin/plustrce.sql
SYS@orcl> grant plustrace to jamong;
Grant succeeded.
plustrace ๋กค์ ๋ถ์ฌํ์ฌ ์คํํต๊ณ์ ๋ํ ๋ถ๋ถ๋ ์ถ๋ ฅํ ์ ์๋๋ก ํฉ๋๋ค.
AutoTrace ๋ช ๋ น์ด ์กฐํฉ
๋ช ๋ น | ์ํ ๊ฒฐ๊ณผ | ์คํ ๊ณํ | ์คํ ํต๊ณ | plustrace ๊ถํ ์ฌ๋ถ |
set autotrace on | O | O | O | O |
set autotrace on explain | O | O | X | X |
set autotrace on statistics | O | X | O | O |
set autotrace traceonly --> SQL ์ํ | X | O | O | O |
set autotrace traceonly explain --> SQL ์ํ X | X | O | X | X |
set autotrace traceonly statistics --> SQL ์ํ | X | X | O | O |
autotrace ๋ช ๋ น์ ์ฝ์ด autot๋ก ๋์ฒดํ ์ ์์ต๋๋ค. ํด๋น ๋ช ๋ น์ด๋ค์ ์ฌ์ฉํ์ฌ ์ถ๋ ฅํ๊ณ ์ถ์ ๋ด์ฉ๋ง ์ ํํด์ ํ์ธํ ์ ์์ต๋๋ค. ์คํ ํต๊ณ์ ๋ํ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๊ธฐ ์ํด์๋ plustrace ๊ถํ์ด ํ์ํ๊ณ ์คํ ๊ณํ๋ง ํ์ธํ ๋์๋ SQL๋ฌธ์ ๋ํ ์ํ์์ด ์ถ๋ ฅ์ด ๊ฐ๋ฅํฉ๋๋ค.
์คํ ๊ณํ ๋ถ์
JAMONG@orcl> set autot traceonly explain
JAMONG@orcl> select * from emp where empno > 7800 and sal > 1400;
์ฐ์ ์คํ ๊ณํ์์ ๊ฐ ํญ๋ชฉ์ด ์ด๋ค ๋ป์ ๋ํ๋ด๋์ง๋ฅผ ์์๋ณด๊ฒ ์ต๋๋ค. XPLAN์ ์ด์ฉํ ๋ฐฉ์์์๋ ์์ ๋์ผํ ํํ์ ์คํ๊ณํ์ด ์ถ๋ ฅ๋๋๋ฐ ๋ชจ๋ AutoTrace๋ฅผ ์ด์ฉํ์ ๋์ ๊ฐ์ ๋ป์ ์๋ฏธํฉ๋๋ค.
ํญ๋ชฉ | ์๋ฏธ |
Id | Operation์ Id. Predicate Information์ ์ ๋ณด๊ฐ ์๋ค๋ฉด Id์ ์ฐ๊ฒฐ๋๋ค. |
Operation | ์ํ๋๋ ์ผ |
Name | Operation์ด ์ํ๋๋ ํ ์ด๋ธ ํน์ ์ธ๋ฑ์ค --> ์ค๋ธ์ ํธ๋ช |
Rows | ๊ฐ Operation์ด ๋๋ฌ์ ๋ ๋ฐํ๋๋ ์์์น ๊ฑด์ |
Bytes | Access ํ๋ byte ์ ์์์น |
Cost(%CPU) | Operation์ ๋น์ฉ --> ๋์ ์น |
Time | ์์ ์ํ ์๊ฐ |
access Predicate | block์ ์ฝ๊ธฐ ์ ์ ์ด๋ค ๋ฐฉ๋ฒ์ผ๋ก block์ ์ฝ์ ๊ฒ์ธ์ง ๊ฒฐ์ . --> index ? full table scan ? ๋ฑ |
filter Predicate | block์ ์ฝ์ ํ ๋ฐ์ดํฐ๋ฅผ ํํฐ๋ง๋์ด ์ฌ์ฉ๋๋ ์กฐ๊ฑด |
์ด๋๊น์ง๋ ์คํ ๊ณํ์ด๋ฏ๋ก ํต๊ณ์ ๋ณด๋ก ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค. ์ค์ ๋น์ฉ๊ณผ๋ ๋ค๋ฅผ ์ ์์ต๋๋ค.
์คํ ํต๊ณ ๋ถ์
JAMONG@orcl> set autot traceonly statistics
JAMONG@orcl> select * from emp where empno > 7800 and sal > 1400;
ํญ๋ชฉ | ์๋ฏธ |
recursive calls | ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ด๋ถ์์ ๋ฐ์ํ Call์ ์๋ฅผ ์๋ฏธํฉ๋๋ค. ์ฌ๊ท๋ผ๋ ์๋ฏธ๋ฅผ ๊ฐ๋ recursive๋ก ์๋์ ๊ฐ์ด ๋ด๋ถ์ ์ผ๋ก ์ํ๋๋ ์์
์ ์ํํ๋ ์ํฉ์์ ๋ฐ์ํฉ๋๋ค. -Data Dictionary ์กฐํ ์ -์ฌ์ฉ์ ์ ์ ํจ์๋ฅผ ์ํ ์ -ํ๋ก์์ ๋ฐ ํธ๋ฆฌ๊ฑฐ ๋ด์์ SQL ์ํ ์ |
db block gets | current mode block ์ฝ๊ธฐ ์์ฒญ๋ ํ์(logical read) |
consistent gets | consistent mode block ์ฝ๊ธฐ ์์ฒญ๋ ํ์(logical read) |
physical reads | ๋์คํฌ์์ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ฝ์ block์ ์ |
redo size | redo์ ํฌ๊ธฐ |
bytes set via SQL*NET to client | ํฌ๊ทธ๋ผ์ด๋ ํ๋ก์ธ์ค์์ ํด๋ผ์ด์ธํธ๋ก ๋ณด๋ธ ์ด ๋ฐ์ดํธ ์ |
bytes received via SQL*NET from client | Oracle Net์ ํตํด ํด๋ผ์ด์ธํธ์์ ๋ฐ์ ์ด ๋ฐ์ดํธ ์ |
SQL*NET roundtrips to/from client | ํด๋ผ์ด์ธํธ์ ์ฃผ๊ณ ๋ฐ์ ์ด Oracle Net ๋ฉ์์ง ์ |
sorts (memory) | ๋ฉ๋ชจ๋ฆฌ ๋ด์์์ ์ ๋ ฌ ์์ ํ์ |
sorts (disk) | ํ ๋น ๋ฐ์ sort area ๋ด์์ ์ ๋ ฌ์ ์๋ฃํ์ง ๋ชปํด ๋์คํฌ ๊ณต๊ฐ์ ์ฌ์ฉํ ์ ๋ ฌ ์์ ํ์ |
rows processed | ์ต์ข ์ ์ผ๋ก ์ฒ๋ฆฌ๋์ด ๋ฐํ๋ ํ์ ์ |
์คํ ํต๊ณ์์ ์ถ๋ ฅ๋๋ ํญ๋ชฉ์ ์์ ๊ฐ์ ์๋ฏธ๋ฅผ ๊ฐ๋๋ค๊ณ ํฉ๋๋ค.
2. SQL Trace
SQL ํ๋์ ์์ด ๊ฐ์ฅ ์ธ๋ถ์ ์ผ๋ก ๋ด์ฉ์ ์๋ ค์ฃผ๋ ๊ฒ์ด SQL Trace ์ ๋๋ค. AutoTrace์ ๊ฒฐ๊ณผ๋ก ๋ฌธ์ ๋ฅผ ์ฐพ์ ์ ์์ ๋ SQL Trace๋ฅผ ํตํด ์ฐพ์ ์ ์์ต๋๋ค. Oracle Database์๋ Trace ํ์ผ์ด ์์ต๋๋ค. ํ๋ผ๋ฏธํฐ์ ์ค์ ์ ๋ณ๊ฒฝํ์ฌ ์ง์ํ SQL ์ฟผ๋ฆฌ์ ๋ํด ๋๊ธฐ ์ด๋ฒคํธ๋ ์ฑ๋ฅ๊ด๋ จ ์ธ๋ถ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
SQL Trace ๋จ๊ธฐ๊ธฐ
SYS@orcl> grant alter session to jamong;
์ผ๋ฐ ์ฌ์ฉ์๋ผ๋ฉด session์ ํ๋ผ๋ฏธํฐ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ ๊ถํ์ ๋ถ์ฌํด์ค์ผํฉ๋๋ค.
JAMONG@orcl> alter session set tracefile_identifier='test_case';
JAMONG@orcl> alter session set sql_trace=true;
JAMONG@orcl> select * from dept;
JAMONG@orcl> alter session set sql_trace = false;
Trace๋ฅผ ๋จ๊ธฐ๊ธฐ ์ํ ์์ ์ ์งํํ๊ฒ ์ต๋๋ค. trace_identifier๋ฅผ ์ง์ ํ์ฌ trace ํ์ผ์ ์ฐพ๊ธฐ ์ฝ๋๋ก ์ค์ ํ์ต๋๋ค. ์ดํ sql_traceํ๋ผ๋ฏธํฐ๋ฅผ True๋ก ์ค์ ํ๊ณ Trace ์ ๋ณด๋ฅผ ํ์ธํ๊ณ ์ถ์ ์ฟผ๋ฆฌ๋ฅผ ์ง์ ํ sql_traceํ๋ผ๋ฏธํฐ๋ฅผ False๋ก ๋ณ๊ฒฝํ์ต๋๋ค.
[oracle@601d2fce71dc app]$ cd $ORACLE_BASE/diag/rdbms/orcl/orcl/trace
[oracle@601d2fce71dc trace]$ ls *test_case*.trc
orcl_ora_3896_test_case.trc
์ดํ Traceํ์ผ์ด ์์ฑ๋์๋์ง ํ์ธํฉ๋๋ค.
tkprof ์ ํธ๋ฆฌํฐ
Traceํ์ผ์ ์ง์ ์ด์ด๋ณด๋ฉด ์๊ธฐ ํ๋ ํํ๋ก ๋์ด์์ต๋๋ค. ์ค๋ผํด์์ ์ ๊ณตํ๋ tkprof ์ ํธ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํด์ ์ฌ์ฉ์๊ฐ ๋ณด๊ธฐ ํธํ ํํ๋ก ๋ถ์๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํด์ค๋๋ค.
[oracle@601d2fce71dc trace]$ tkprof orcl_ora_3896_test_case.trc report.txt sys=no
report.txt๋ผ๋ ์ด๋ฆ์ผ๋ก ํ์ผ์ ์์ฑํ๋ฉฐ sys=no ์ต์ ์ ๋ด๋ถ์ ์ผ๋ก ์ํ๋๋ SQL๋ฌธ์ฅ์ ์ ์ธ์์ผ์ค๋๋ค.
[oracle@601d2fce71dc trace]$ vi report.txt
ํ์ผ์ ๋ด๋ฆฌ๋ค๋ณด๋ฉด ์คํํ ์ฟผ๋ฆฌ์ ๋ํ ์ ๋ณด๊ฐ ์๋๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
SQL Trace ์๋ํ
SQL Trace ์์ ์ ์์์ ๊ฐ๋จํ๊ฒ ํ์ธํด๋ดค๋๋ฐ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๊ธฐ ๊น์ง ๋งค์ฐ ๋ฒ๊ฑฐ๋ก์ด ์์ ์ ์งํํด์ผํฉ๋๋ค. ๊ทธ๋์ Trace๋ฅผ on,off ํํ๋ก ์งํํ ์ ์๋๋ก ์คํฌ๋ฆฝํธ๋ก ์๋ํํด์ ์ฌ์ฉํ๋ฉด ํธํฉ๋๋ค. ์๋ํ ์คํฌ๋ฆฝํธ์์๋ ์ค๋ผํด์์ ์ ๊ณตํ๋ event Trace๋ฅผ ์ด์ฉํ์ฌ SQL Trace๋ฅผ ์์ฑ ๋ฐ ํ์ธํ๋ ์์ ์ ํ๊ฒ ์ต๋๋ค.
์ด๋ฐฉ์์ ์ฌ์ฉํ ๋ ๋ ๋ฒจ์ ์ค์ ํ๋๋ฐ ์ด๋ฅผ ํตํด ๋๊ธฐ ์ด๋ฒคํธ์ ๋ฐ์ธ๋ ๋ณ์์ ๋ํ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
Level | ๊ธฐ๋ณธ์ ๋ณด | Binding ์ ๋ณด | Waiting ์ ๋ณด |
1 | O | X | X |
4 | O | O | X |
8 | O | X | O |
12 | O | O | O |
alter session set events '10046 trace name context forever, level 12';
alter session set events '10046 trace name context off';
์์ ๊ฐ์ ํํ๋ก ์ฌ์ฉ๋๋๋ฐ level๋ง ๋ณ๊ฒฝํ์ฌ Trace๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
start.sql
conn jamong/jamong
alter session set max_dump_file_size=unlimited;
alter session set events '10046 trace name context forever, level 12';
Traceํ์ผ์ ์ธ์ ๋จ์๋ก ๊ฐฑ์ ๋๊ธฐ ๋๋ฌธ์ start.sql ์คํ ํ ์ ๋ ฅ๋๋ ์ฟผ๋ฆฌ๋ง ๊ฒฐ๊ณผ๋ก ์ถ๋ ฅํ๊ธฐ ์ํด ์ฌ์ฉํ ์ ์ ๋ก ์ฐ๊ฒฐ์ ์๋กญ๊ฒ ํด์ค๋๋ค.
end.sql
alter session set events '10046 trace name context off';
define _editor=vi
undefine trace
column trace_file new_value trace
SELECT value AS trace_file
FROM v$diag_info
WHERE name = 'Default Trace File';
!tkprof &trace output.trc sys=no
ed output.trc
์๋ํฐ๋ฅผ vi๋ก ์ง์ ํด์ฃผ๊ณ trace๋ผ๋ ๋ณ์์ ํ์ฌ Traceํ์ผ์ ๊ฒฝ๋ก๋ฅผ ์ ์ฅํด์ฃผ๊ณ tkprof ์ ํธ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํด์ ํ์ผ์ ์์ฑํฉ๋๋ค.
์ฌ์ฉ๋ฒ
JAMONG@orcl> @start
JAMONG@orcl> select * from emp where empno > 7800 and sal > 1400;
JAMONG@orcl> @end
script๊ฐ ์ ์ฅ๋ ๊ฒฝ๋ก์์ start๋ก ์์ํ๊ณ ์ฟผ๋ฆฌ์ง์๋ฅผ ํ ์ดํ์ end๋ก ๋๋ด๋ฉด Traceํ์ผ์ ํ์ธํ ์ ์์ต๋๋ค.
SQL Trace ๋ถ์
ํญ๋ชฉ | ์๋ฏธ |
Parse | SQL๋ฌธ์ ํ์ฑํ๊ณ ์คํ ๊ณํ์ ์์ฑํ๋๋ฐ์ ๋ํ ํต๊ณ |
Execute | Oracle ์๋ฒ์ ์ํด ์ค์ ๋ช ๋ น๋ฌธ์ด ์คํ๋๋๋ฐ์ ๋ํ ํต๊ณ. INSERT,UPDATE,DELETE |
Fetch | Select๋ฌธ์ ๋ํ ํต๊ณ |
count | ๊ฐ ๋จ๊ณ์ ๋ํ ์คํ ํ์ |
cpu | ์ฒ๋ฆฌ์ ์์๋๋ ์๊ฐ(์ด) |
elapsed | ์คํ์ ์์๋๋ ์๊ฐ(์ด) |
disk | ๋ฌผ๋ฆฌ์ ๋ธ๋ก ์ฝ๊ธฐ ์ |
query | consistent mode ๋ธ๋ก ์ฝ๊ธฐ(๋ ผ๋ฆฌ์ ์ฝ๊ธฐ) |
current | current mode ๋ธ๋ก ์ฝ๊ธฐ(๋ ผ๋ฆฌ์ ์ฝ๊ธฐ) |
rows | ๊ฐ ๋จ๊ณ์์ ์ฒ๋ฆฌ๋๋ ํ์ ์ |
ํญ๋ชฉ | ์๋ฏธ |
Rows | ๊ฐ ์ํ ๋จ๊ณ์ ์ถ๋ ฅ๋ ํ์ ์ |
cr | consistent mode ๋ธ๋ก ์ฝ๊ธฐ ์ |
pr | ๋ฌผ๋ฆฌ์ ๋ธ๋ก ์ฝ๊ธฐ ์ |
pw | ๋ฌผ๋ฆฌ์ ๋ธ๋ก ์ฐ๊ธฐ ์ |
time | ๊ฐ ์ํ ๋จ๊ณ์์ ์์๋๋ ์๊ฐ |
cost | ๋น์ฉ |
size | ๋ฐ์ดํฐ ํฌ๊ธฐ |
card | cardinality |
3. XPLAN
explain plan ๋ช ๋ น์ด
explain plan ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด์ ์คํ๊ณํ์ ํ์ธํ ์ ์์ต๋๋ค. explain plan ๋ช ๋ น์ ์ฌ์ฉํ๋ฉด ์ค์ต ์ค๋น์์ ์์ฑํ plan_table์ ์คํ๊ณํ์ ๋ด์ต๋๋ค. ์ดํ ์ค๋ผํด์์ ์ ๊ณตํ๋ utlxpls ์คํฌ๋ฆฝํธ๋ฅผ ์ด์ฉํด์ ํ์ธํ๊ธฐ ํธ์ํ ํํ๋ก ์คํ๊ณํ์ ์ถ๋ ฅํ ์ ์์ต๋๋ค.
JAMONG@orcl> explain plan for select * from emp;
JAMONG@orcl> @ ?/rdbms/admin/utlxpls
dbms_xplan.display
utlxpls ์คํฌ๋ฆฝํธ๋ฅผ ํ์ธํด๋ณด๋ฉด ์๋์๊ฐ์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
select plan_table_output from table(dbms_xplan.display('plan_table',null,'serial'));
dbms_xplan ํจํค์ง๋ฅผ ์ด์ฉํด์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํฉ๋๋ค. dbms_xplan์ ์ค๋ผํด์์ ์ ๊ณตํ๋ ํจํค์ง๋ก ์คํ๊ณํ์ ํ์ธํ ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฒซ๋ฒ์งธ ์ธ์๋ก plan_table์ ๋ฃ์ด์ฃผ๊ณ ๋๋ฒ์งธ ์ธ์์๋ statement_id, ์ธ๋ฒ์งธ๋ ์ถ๋ ฅ ํฌ๋งท ์ต์ ์ ์ค์ ํ ์ ์์ต๋๋ค. ๋๋ฒ์งธ ์ธ์์ null๊ฐ์ ๋ฃ์ผ๋ฉด ๊ฐ์ฅ ๋ง์ง๋ง์ explain plan ๋ช ๋ น์ ํตํด ์ฌ์ฉ๋ ์ฟผ๋ฆฌ์ ๋ํ ์คํ๊ณํ์ ๋ณด์ฌ์ค๋๋ค. ์๋์ ๊ฐ์ ํํ๋ก ์คํํ ์ ์์ต๋๋ค.
explain plan set statement_id='test' for select * from emp;
select plan_table_output from table(dbms_xplan.display('plan_table','test','serial'));
select plan_table_output from table(dbms_xplan.display('plan_table','test','basic'));
select plan_table_output from table(dbms_xplan.display('plan_table','test','typical'));
select plan_table_output from table(dbms_xplan.display('plan_table','test','basic rows bytes cost partition parallel predicate projection alias remote note'));
select plan_table_output from table(dbms_xplan.display('plan_table','test','advanced'));
dbms_xplan.display_cursor
display_cursor ํจ์๋ display ํจ์์ ๋ค๋ฅด๊ฒ ์ผ๋ฐ ์์ ์คํ๊ณํ์ด ์๋ ์ค์ ์คํ๊ณํ์ ํ์ธํ ์ ์์ต๋๋ค. ์ฆ, Shared Pool์ ์ฌ๋ผ๊ฐ ์๋ ์คํ๊ณํ์ ์ฝ๋ ๊ฒ์ ๋๋ค. display_cursor๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์ค๋ผํด์์ ์ค์ SQL๋ฌธ์ ์คํํ๋ ๋์์ ์คํ ๊ณํ์ ๊ฐ Row Source๋ณ๋ฃจ ์ํ ํต๊ณ๋ฅผ ์์งํ๊ธฐ ์ํด gather_plan_statistics ํํธ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ statistics_level ํ๋ฆฌ๋ฏธํฐ๋ฅผ all๋ก ์ค์ ํด์ผํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ผ๋ฐ ์ ์ ๊ฐ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์์ง๋ ํต๊ณ๋ฅผ ์ ์ฅํ๋ ๋ทฐ์๋ํ ์ ๊ทผ์ด ํ์ํ์ฌ ์๋ ๊ถํ์ด ํ์ํฉ๋๋ค.
grant select on v_$session to jamong;
grant select on v_$sql to jamong;
grant select on v_$sql_plan to jamong;
grant select on v_$sql_plan_statistics to jamong;
grant select on v_$sql_plan_statistics_all to jamong;
ํํธ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์๋์ฒ๋ผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
JAMONG@orcl> select /*+gather_plan_statistics*/ e.empno,e.sal,d.dname from emp e inner join dept d on e.deptno = d.deptno where e.sal >= 3000;
JAMONG@orcl> select * from table(dbms_xplan.display_cursor(null,null,'allstats last')) ;
๊ฐ์ฅ ๋ง์ง๋ง ์ฟผ๋ฆฌ์ ๋ํ ์ ๋ณด๋ฅผ ํ์ธํ๊ธฐ ์ํด ์ฒซ ๋ ์ธ์ ๊ฐ์ null๋ก ํ์ํ๋ฉด ๋ฉ๋๋ค.
display_cursor ์คํ๊ณํ ๋ถ์
ํญ๋ชฉ | ์๋ฏธ |
Id | Operation Id |
Operation | ์คํ๋๋ ์ผ |
Name | Operation์ด ์ํ๋๋ ํ ์ด๋ธ ํน์ ์ธ๋ฑ์ค --> ์ค๋ธ์ ํธ๋ช |
Starts | ๊ฐ Operation์ ๋ฐ๋ณต ์ํํ๋ ํ์ |
E-Rows | ๊ฐ Operation์ด ๋๋ฌ์ ๋ ๋ฐํ๋๋ ํ ์ (์์์น) |
A-Rows | ๊ฐ Operation์ด ๋๋ฌ์ ๋ ๋ฐํ๋๋ ํ ์ (์ค์ ) |
A-Time | ์ค์ ์คํ ์๊ฐ --> ๋์ ์น |
Buffers | ๊ฐ Operation์ ๋ ผ๋ฆฌ์ ๋ธ๋ก ์ฝ๊ธฐ ์ |
Reads | ๊ฐ Operation์ ๋ฌผ๋ฆฌ์ ๋ธ๋ก ์ฝ๊ธฐ ์ --> ์๋ ๊ฒฝ์ฐ์๋ง ์ถ๋ ฅ |
Writes | ๊ฐ Operation์๋ฌผ๋ฆฌ์ ๋ธ๋ก ์ฐ๊ธฐ ์ --> ์๋ ๊ฒฝ์ฐ์๋ง ์ถ๋ ฅ |
์ ๋ฆฌ
๊ฐ๋จํ๊ฒ ์คํ๊ณํ์ ์์๋ณด๋ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํด๋ดค์ต๋๋ค. ๊ฐ ์ํฉ๊ณผ ํ๊ฒฝ์ ๋ง๊ฒ ์๋ง๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ๋๋๋ฐ ๊ฐ์ธ์ ์ผ๋ก๋ SQL Trace๋ฅผ ํ์ธํ๋ ๊ฒ์ด ๊ฐ์ฅ ๊ฐ๋ ฅํ ๋ฐฉ๋ฒ์ด๋ผ๋ ์๊ฐ์ด ๋๋ค์.
๋๊ธ