<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>https://dbstudy.co.kr/w/index.php?action=history&amp;feed=atom&amp;title=%EB%B3%91%EB%A0%AC_%EC%BF%BC%EB%A6%AC_I%2FO_%ED%99%95%EC%9D%B8</id>
	<title>병렬 쿼리 I/O 확인 - 편집 역사</title>
	<link rel="self" type="application/atom+xml" href="https://dbstudy.co.kr/w/index.php?action=history&amp;feed=atom&amp;title=%EB%B3%91%EB%A0%AC_%EC%BF%BC%EB%A6%AC_I%2FO_%ED%99%95%EC%9D%B8"/>
	<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EB%B3%91%EB%A0%AC_%EC%BF%BC%EB%A6%AC_I/O_%ED%99%95%EC%9D%B8&amp;action=history"/>
	<updated>2026-10-07T00:41:58Z</updated>
	<subtitle>이 문서의 편집 역사</subtitle>
	<generator>MediaWiki 1.39.10</generator>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EB%B3%91%EB%A0%AC_%EC%BF%BC%EB%A6%AC_I/O_%ED%99%95%EC%9D%B8&amp;diff=1947&amp;oldid=prev</id>
		<title>Dbstudy: 새 문서: === 병렬 프로세스별 I/O 확인 SQL ===  &lt;source lang=sql&gt; SELECT q.sql_id, NVL(p.qcinst_id, p.inst_id) || &#039;:&#039; || p.qcsid AS qc, p.inst_id, p.sid, NVL2(p.server_set, &#039;Set&#039;||p.server_set||&#039;-&#039;||p.server#, &#039;QC&#039;) AS role, s.status, p.degree, p.req_degree, MAX(DECODE(n.name,&#039;session logical reads&#039;, p.value)) AS buffer_gets, MAX(DECODE(n.name,&#039;consistent gets&#039;, p.value)) AS cr_gets, MAX(DECODE(n.name,&#039;db block gets&#039;, p.value)) AS current_gets, MAX(DECODE(n.name,&#039;physical reads&#039;,...</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EB%B3%91%EB%A0%AC_%EC%BF%BC%EB%A6%AC_I/O_%ED%99%95%EC%9D%B8&amp;diff=1947&amp;oldid=prev"/>
		<updated>2026-10-06T07:21:48Z</updated>

		<summary type="html">&lt;p&gt;새 문서: === 병렬 프로세스별 I/O 확인 SQL ===  &amp;lt;source lang=sql&amp;gt; SELECT q.sql_id, NVL(p.qcinst_id, p.inst_id) || &amp;#039;:&amp;#039; || p.qcsid AS qc, p.inst_id, p.sid, NVL2(p.server_set, &amp;#039;Set&amp;#039;||p.server_set||&amp;#039;-&amp;#039;||p.server#, &amp;#039;QC&amp;#039;) AS role, s.status, p.degree, p.req_degree, MAX(DECODE(n.name,&amp;#039;session logical reads&amp;#039;, p.value)) AS buffer_gets, MAX(DECODE(n.name,&amp;#039;consistent gets&amp;#039;, p.value)) AS cr_gets, MAX(DECODE(n.name,&amp;#039;db block gets&amp;#039;, p.value)) AS current_gets, MAX(DECODE(n.name,&amp;#039;physical reads&amp;#039;,...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=== 병렬 프로세스별 I/O 확인 SQL ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT q.sql_id,&lt;br /&gt;
NVL(p.qcinst_id, p.inst_id) || &amp;#039;:&amp;#039; || p.qcsid AS qc,&lt;br /&gt;
p.inst_id, p.sid,&lt;br /&gt;
NVL2(p.server_set, &amp;#039;Set&amp;#039;||p.server_set||&amp;#039;-&amp;#039;||p.server#, &amp;#039;QC&amp;#039;) AS role,&lt;br /&gt;
s.status, p.degree, p.req_degree,&lt;br /&gt;
MAX(DECODE(n.name,&amp;#039;session logical reads&amp;#039;, p.value)) AS buffer_gets,&lt;br /&gt;
MAX(DECODE(n.name,&amp;#039;consistent gets&amp;#039;, p.value)) AS cr_gets,&lt;br /&gt;
MAX(DECODE(n.name,&amp;#039;db block gets&amp;#039;, p.value)) AS current_gets,&lt;br /&gt;
MAX(DECODE(n.name,&amp;#039;physical reads&amp;#039;, p.value)) AS disk_reads,&lt;br /&gt;
MAX(DECODE(n.name,&amp;#039;physical reads direct&amp;#039;, p.value)) AS direct_reads,&lt;br /&gt;
ROUND(MAX(DECODE(n.name,&amp;#039;physical read total bytes&amp;#039;,p.value))/1048576,1) AS read_mb,&lt;br /&gt;
-- Exadata Smart Scan 확인용&lt;br /&gt;
ROUND(MAX(DECODE(n.name,&amp;#039;cell physical IO bytes eligible for predicate offload&amp;#039;,p.value))/1048576,1) AS offload_elig_mb,&lt;br /&gt;
ROUND(MAX(DECODE(n.name,&amp;#039;cell physical IO interconnect bytes returned by smart scan&amp;#039;,p.value))/1048576,1) AS smartscan_ret_mb,&lt;br /&gt;
DECODE(s.state,&amp;#039;WAITING&amp;#039;,s.event,&amp;#039;ON CPU&amp;#039;) AS event&lt;br /&gt;
FROM gv$px_sesstat p&lt;br /&gt;
JOIN v$statname n ON n.statistic# = p.statistic#&lt;br /&gt;
JOIN gv$session s ON s.inst_id = p.inst_id AND s.sid = p.sid AND s.serial# = p.serial#&lt;br /&gt;
JOIN gv$session q ON q.inst_id = NVL(p.qcinst_id, p.inst_id) AND q.sid = p.qcsid&lt;br /&gt;
WHERE q.sql_id = &amp;#039;b1ad0sj26zcy0&amp;#039; -- 필터를 안쪽으로 밀어 넣음&lt;br /&gt;
AND n.name IN (&amp;#039;session logical reads&amp;#039;,&amp;#039;consistent gets&amp;#039;,&amp;#039;db block gets&amp;#039;,&lt;br /&gt;
&amp;#039;physical reads&amp;#039;,&amp;#039;physical reads direct&amp;#039;,&amp;#039;physical read total bytes&amp;#039;,&lt;br /&gt;
&amp;#039;cell physical IO bytes eligible for predicate offload&amp;#039;,&lt;br /&gt;
&amp;#039;cell physical IO interconnect bytes returned by smart scan&amp;#039;)&lt;br /&gt;
GROUP BY q.sql_id, p.qcinst_id, p.qcsid, p.inst_id, p.sid,&lt;br /&gt;
s.status, p.server_set, p.server#, p.degree, p.req_degree, s.state, s.event&lt;br /&gt;
ORDER BY NVL(p.qcinst_id, p.inst_id), p.qcsid,&lt;br /&gt;
p.server_set NULLS FIRST, p.server#, p.inst_id, p.sid;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Exadata 지표 추가 : offload_elig_mb 대비 smartscan_ret_mb 비율로 Smart Scan이 실제로 효과를 내는지 볼 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
===  더 효율적인 방법: gv$sql_monitor ===&lt;br /&gt;
* Tuning Pack 라이선스가 있다면 &lt;br /&gt;
** - v$statname 조인과 피벗이 필요 없어 훨씬 가벼움.&lt;br /&gt;
** - 약 1초 주기로 갱신.&lt;br /&gt;
** - Exadata 오프로드 컬럼이 기본으로 들어 있음.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
SELECT inst_id, sid,&lt;br /&gt;
NVL2(px_server_set, &amp;#039;Set&amp;#039;||px_server_set||&amp;#039;-&amp;#039;||px_server#, &amp;#039;QC&amp;#039;) AS role,&lt;br /&gt;
status, buffer_gets, disk_reads, physical_read_requests AS read_req,&lt;br /&gt;
ROUND(physical_read_bytes/1048576,1) AS read_mb,&lt;br /&gt;
ROUND(io_interconnect_bytes/1048576,1) AS interconnect_mb,&lt;br /&gt;
ROUND(io_cell_offload_eligible_bytes/1048576,1) AS offload_elig_mb,&lt;br /&gt;
ROUND(elapsed_time/1e6,1) AS ela_s,&lt;br /&gt;
ROUND(user_io_wait_time/1e6,1) AS io_wait_s&lt;br /&gt;
FROM gv$sql_monitor&lt;br /&gt;
 WHERE sql_id = &amp;#039;b1ad0sj26zcy0&amp;#039;&lt;br /&gt;
   AND sql_exec_id = (SELECT MAX(sql_exec_id) FROM gv$sql_monitor&lt;br /&gt;
                       WHERE sql_id = &amp;#039;b1ad0sj26zcy0&amp;#039; AND status = &amp;#039;EXECUTING&amp;#039;)&lt;br /&gt;
 ORDER BY px_server_set NULLS FIRST, px_server#, inst_id, sid;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* plan line별 I/O를 보려면 `gv$sql_plan_monitor`를 사용&lt;br /&gt;
* 리얼모니터도 추천 : DBMS_SQLTUNE.REPORT_SQL_MONITOR(sql_id=&amp;gt;..., type=&amp;gt;&amp;#039;ACTIVE&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
* 참고: 두 쿼리 모두 값이 누적치라서 &amp;quot;지금 초당 몇 MB인지&amp;quot;는 바로 보이지 않음.&lt;br /&gt;
* 진짜 실시간 처리량은 두 번 조회한 값의 차이를 경과 시간으로 나눠야 합니다. &lt;br /&gt;
&lt;br /&gt;
[[category:oracle]]&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
</feed>