<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>https://dbstudy.co.kr/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jhwang327</id>
	<title>DB스터디 - 사용자 기여 [ko]</title>
	<link rel="self" type="application/atom+xml" href="https://dbstudy.co.kr/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jhwang327"/>
	<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/%ED%8A%B9%EC%88%98:%EA%B8%B0%EC%97%AC/Jhwang327"/>
	<updated>2026-05-09T00:55:12Z</updated>
	<subtitle>사용자 기여</subtitle>
	<generator>MediaWiki 1.39.10</generator>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EC%84%B1%EB%8A%A5_%EB%AC%B8%EC%A0%9C_%EC%8B%9D%EB%B3%84_%EB%B0%A9%EB%B2%95%EB%A1%A0%EA%B3%BC_%ED%8A%9C%EB%8B%9D_%EC%A0%91%EA%B7%BC%EB%B2%95&amp;diff=1609</id>
		<title>성능 문제 식별 방법론과 튜닝 접근법</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%84%B1%EB%8A%A5_%EB%AC%B8%EC%A0%9C_%EC%8B%9D%EB%B3%84_%EB%B0%A9%EB%B2%95%EB%A1%A0%EA%B3%BC_%ED%8A%9C%EB%8B%9D_%EC%A0%91%EA%B7%BC%EB%B2%95&amp;diff=1609"/>
		<updated>2025-10-22T06:25:56Z</updated>

		<summary type="html">&lt;p&gt;Jhwang327: /* 처리량 문제 (Throughput Issues) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 성능 문제 식별 방법론과 튜닝 접근법 =&lt;br /&gt;
&lt;br /&gt;
== 성능 문제 분석 방법론 ==&lt;br /&gt;
&lt;br /&gt;
=== Top-Down 접근법 (시스템 → 세션 → SQL) ===&lt;br /&gt;
&lt;br /&gt;
**단계별 분석 순서:**&lt;br /&gt;
```&lt;br /&gt;
시스템 전체 성능 → 인스턴스 레벨 → 세션 레벨 → SQL 레벨 → 오브젝트 레벨&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
**장점:**&lt;br /&gt;
- 전체적인 시스템 상황 파악 가능&lt;br /&gt;
- 우선순위가 높은 문제부터 식별&lt;br /&gt;
- 리소스 사용률 기반의 객관적 분석&lt;br /&gt;
&lt;br /&gt;
**분석 도구:**&lt;br /&gt;
- ADDM (Automatic Database Diagnostic Monitor)&lt;br /&gt;
- AWR (Automatic Workload Repository)&lt;br /&gt;
- Statspack (AWR 대체)&lt;br /&gt;
&lt;br /&gt;
=== Bottom-Up 접근법 (SQL → 세션 → 시스템) ===&lt;br /&gt;
&lt;br /&gt;
**적용 시나리오:**&lt;br /&gt;
- 특정 애플리케이션의 성능 문제&lt;br /&gt;
- 특정 SQL 문장의 성능 저하&lt;br /&gt;
- 사용자 불만 기반 문제 해결&lt;br /&gt;
&lt;br /&gt;
**분석 도구:**&lt;br /&gt;
- SQL Trace (10046 Event)&lt;br /&gt;
- ASH (Active Session History)&lt;br /&gt;
- SQL Tuning Advisor&lt;br /&gt;
&lt;br /&gt;
== 성능 문제 분류 체계 ==&lt;br /&gt;
&lt;br /&gt;
=== 문제 유형별 분류 ===&lt;br /&gt;
&lt;br /&gt;
==== 응답 시간 문제 (Response Time Issues) ====&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 응답 시간 분석을 위한 기본 쿼리&lt;br /&gt;
SELECT &lt;br /&gt;
    s.sid, s.serial=, s.username, s.machine, s.program, s&lt;br /&gt;
    s.status, s.last_call_et,&lt;br /&gt;
    w.event, w.state, w.wait_time, w.seconds_in_wait,&lt;br /&gt;
    sq.sql_text&lt;br /&gt;
FROM v$session s, v$session_wait w, v$sqlarea sq&lt;br /&gt;
WHERE s.sid = w.sid WHERE&lt;br /&gt;
  AND s.sql_address = sq.address(+) AND&lt;br /&gt;
  AND s.sql_hash_value = sq.hash_value(+) AND&lt;br /&gt;
  AND s.status = &#039;ACTIVE&#039; AND&lt;br /&gt;
ORDER BY s.last_call_et DESC;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 처리량 문제 (Throughput Issues) ====&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 시간당 트랜잭션 처리량 분석&lt;br /&gt;
SELECT &lt;br /&gt;
    TO_CHAR(begin_interval_time, &#039;YYYY-MM-DD HH24&#039;) as hour,&lt;br /&gt;
    (SELECT value FROM dba_hist_sysstat dhss2 &lt;br /&gt;
     WHERE dhss2.snap_id = dhs.snap_id  WHERE&lt;br /&gt;
       AND dhss2.stat_name = &#039;user commits&#039;) /  AND&lt;br /&gt;
    (EXTRACT(HOUR FROM (end_interval_time - begin_interval_time)) * 3600 + &lt;br /&gt;
     EXTRACT(MINUTE FROM (end_interval_time - begin_interval_time)) * 60) as tps&lt;br /&gt;
FROM dba_hist_snapshot dhs&lt;br /&gt;
WHERE begin_interval_time &amp;gt;= SYSDATE - 7 WHERE&lt;br /&gt;
ORDER BY begin_interval_time;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 리소스 고갈 문제 (Resource Exhaustion) ====&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 메모리 사용률 분석&lt;br /&gt;
SELECT &lt;br /&gt;
    component, &lt;br /&gt;
    current_size/1024/1024 as current_mb,&lt;br /&gt;
    max_size/1024/1024 as max_mb,&lt;br /&gt;
    (current_size/max_size)*100 as usage_pct&lt;br /&gt;
FROM v$memory_dynamic_components&lt;br /&gt;
WHERE max_size &amp;gt; 0&lt;br /&gt;
ORDER BY usage_pct DESC;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 문제 심각도 분류 ===&lt;br /&gt;
&lt;br /&gt;
==== 긴급도 매트릭스 ====&lt;br /&gt;
| 심각도 | 영향 범위 | 응답 시간 | 비즈니스 영향 |&lt;br /&gt;
|--------|-----------|-----------|---------------|&lt;br /&gt;
| P1 | 전체 시스템 | &amp;gt; 300% 증가 | 서비스 중단 |&lt;br /&gt;
| P2 | 특정 모듈 | 100-300% 증가 | 기능 제한 |&lt;br /&gt;
| P3 | 개별 기능 | 50-100% 증가 | 사용자 불편 |&lt;br /&gt;
| P4 | 미미한 영향 | &amp;lt; 50% 증가 | 성능 개선 여지 |&lt;br /&gt;
&lt;br /&gt;
== Wait Event 기반 근본 원인 분석 ==&lt;br /&gt;
&lt;br /&gt;
=== Wait Event 분류 및 진단 ===&lt;br /&gt;
&lt;br /&gt;
==== User I/O 관련 Wait Events ====&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- I/O 관련 대기 이벤트 상세 분석&lt;br /&gt;
SELECT &lt;br /&gt;
    event, &lt;br /&gt;
    total_waits, &lt;br /&gt;
    total_timeouts,&lt;br /&gt;
    time_waited,&lt;br /&gt;
    average_wait,&lt;br /&gt;
    time_waited/total_waits*1000 as avg_wait_ms&lt;br /&gt;
FROM v$system_event &lt;br /&gt;
WHERE wait_class = &#039;User I/O&#039; WHERE&lt;br /&gt;
  AND total_waits &amp;gt; 0&lt;br /&gt;
ORDER BY time_waited DESC;&lt;br /&gt;
&lt;br /&gt;
-- 파일별 I/O 통계&lt;br /&gt;
SELECT &lt;br /&gt;
    df.tablespace_name,&lt;br /&gt;
    df.file_name,&lt;br /&gt;
    fs.phyblkrd as blocks_read,&lt;br /&gt;
    fs.phyblkwrt as blocks_written,&lt;br /&gt;
    fs.readtim as read_time,&lt;br /&gt;
    fs.writetim as write_time,&lt;br /&gt;
    CASE WHEN fs.phyblkrd &amp;gt; 0 &lt;br /&gt;
         THEN fs.readtim/fs.phyblkrd*10 &lt;br /&gt;
         ELSE 0 END as avg_read_time_ms&lt;br /&gt;
FROM dba_data_files df, v$filestat fs&lt;br /&gt;
WHERE df.file_id = fs.file= WHERE&lt;br /&gt;
ORDER BY avg_read_time_ms DESC;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
**주요 I/O Wait Events:**&lt;br /&gt;
- `db file sequential read`: 인덱스 스캔, ROWID 액세스&lt;br /&gt;
- `db file scattered read`: Full Table Scan&lt;br /&gt;
- `direct path read`: 병렬 처리, LOB 액세스&lt;br /&gt;
- `log file sync`: 커밋 대기&lt;br /&gt;
&lt;br /&gt;
==== Concurrency 관련 Wait Events ====&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Lock 경합 분석&lt;br /&gt;
SELECT &lt;br /&gt;
    s1.sid as blocker_sid,&lt;br /&gt;
    s1.username as blocker_user,&lt;br /&gt;
    s2.sid as waiter_sid,&lt;br /&gt;
    s2.username as waiter_user,&lt;br /&gt;
    lo.object_id,&lt;br /&gt;
    do.object_name,&lt;br /&gt;
    lo.locked_mode,&lt;br /&gt;
    s2.seconds_in_wait&lt;br /&gt;
FROM v$locked_object lo, dba_objects do, v$session s1, v$session s2&lt;br /&gt;
WHERE lo.object_id = do.object_id WHERE&lt;br /&gt;
  AND lo.session_id = s1.sid AND&lt;br /&gt;
  AND s2.blocking_session = s1.sid; AND&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
**주요 Concurrency Wait Events:**&lt;br /&gt;
- `enq: TX - row lock contention`: 행 레벨 lock 경합&lt;br /&gt;
- `enq: TM - contention`: 테이블 lock 경합&lt;br /&gt;
- `latch: cache buffers chains`: Buffer Cache 경합&lt;br /&gt;
- `library cache lock`: 공유 SQL 영역 경합&lt;br /&gt;
&lt;br /&gt;
=== Wait Event 패턴 분석 ===&lt;br /&gt;
&lt;br /&gt;
==== 시간대별 Wait Event 트렌드 ====&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 시간대별 주요 Wait Event 분석 (AWR 기반)&lt;br /&gt;
SELECT &lt;br /&gt;
    TO_CHAR(s.begin_interval_time, &#039;YYYY-MM-DD HH24:MI&#039;) as snapshot_time,&lt;br /&gt;
    e.event_name,&lt;br /&gt;
    e.total_waits - LAG(e.total_waits) OVER (&lt;br /&gt;
        PARTITION BY e.event_name ORDER BY s.snap_id&lt;br /&gt;
    ) as waits_delta,&lt;br /&gt;
    ROUND((e.time_waited_micro - LAG(e.time_waited_micro) OVER (&lt;br /&gt;
        PARTITION BY e.event_name ORDER BY s.snap_id&lt;br /&gt;
    ))/1000000, 2) as time_waited_sec&lt;br /&gt;
FROM dba_hist_system_event e, dba_hist_snapshot s&lt;br /&gt;
WHERE e.snap_id = s.snap_id WHERE&lt;br /&gt;
  AND s.begin_interval_time &amp;gt;= SYSDATE - 1 AND&lt;br /&gt;
  AND e.wait_class != &#039;Idle&#039; AND&lt;br /&gt;
  AND e.event_name IN (&lt;br /&gt;
      &#039;db file sequential read&#039;,&lt;br /&gt;
      &#039;db file scattered read&#039;, &lt;br /&gt;
      &#039;log file sync&#039;,&lt;br /&gt;
      &#039;enq: TX - row lock contention&#039;&lt;br /&gt;
  )&lt;br /&gt;
ORDER BY snapshot_time, time_waited_sec DESC;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 시스템 리소스 분석 ==&lt;br /&gt;
&lt;br /&gt;
=== CPU 사용률 분석 ===&lt;br /&gt;
&lt;br /&gt;
==== OS Level CPU 분석 ====&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- CPU 사용률 히스토리 (AWR 기반)&lt;br /&gt;
SELECT &lt;br /&gt;
    TO_CHAR(s.begin_interval_time, &#039;YYYY-MM-DD HH24:MI&#039;) as time,&lt;br /&gt;
    os1.value as num_cpus,&lt;br /&gt;
    os2.value as load_avg,&lt;br /&gt;
    ROUND(os2.value/os1.value * 100, 2) as cpu_util_pct&lt;br /&gt;
FROM dba_hist_osstat os1, dba_hist_osstat os2, dba_hist_snapshot s&lt;br /&gt;
WHERE os1.snap_id = os2.snap_id WHERE&lt;br /&gt;
  AND os1.snap_id = s.snap_id AND&lt;br /&gt;
  AND os1.stat_name = &#039;NUM_CPUS&#039; AND&lt;br /&gt;
  AND os2.stat_name = &#039;LOAD&#039; AND&lt;br /&gt;
  AND s.begin_interval_time &amp;gt;= SYSDATE - 1 AND&lt;br /&gt;
ORDER BY time;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Oracle Process CPU 사용률 ====&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 세션별 CPU 사용률&lt;br /&gt;
SELECT &lt;br /&gt;
    s.sid, s.serial=, s.username, s.machine, s.program, s&lt;br /&gt;
    ss.value/100 as cpu_used_seconds,&lt;br /&gt;
    s.last_call_et as seconds_since_last_call&lt;br /&gt;
FROM v$session s, v$sesstat ss, v$statname sn&lt;br /&gt;
WHERE s.sid = ss.sid WHERE&lt;br /&gt;
  AND ss.statistic= = sn.statistic= AND&lt;br /&gt;
  AND sn.name = &#039;CPU used by this session&#039; AND&lt;br /&gt;
  AND ss.value &amp;gt; 0&lt;br /&gt;
ORDER BY ss.value DESC;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 메모리 사용률 분석 ===&lt;br /&gt;
&lt;br /&gt;
==== SGA 구성요소별 분석 ====&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- SGA 구성요소별 사용률&lt;br /&gt;
SELECT &lt;br /&gt;
    component,&lt;br /&gt;
    current_size/1024/1024 as current_mb,&lt;br /&gt;
    min_size/1024/1024 as min_mb,&lt;br /&gt;
    max_size/1024/1024 as max_mb,&lt;br /&gt;
    ROUND((current_size/max_size)*100, 2) as usage_pct,&lt;br /&gt;
    resize_ops,&lt;br /&gt;
    last_oper_type&lt;br /&gt;
FROM v$memory_dynamic_components&lt;br /&gt;
WHERE current_size &amp;gt; 0&lt;br /&gt;
ORDER BY current_mb DESC;&lt;br /&gt;
&lt;br /&gt;
-- Buffer Cache Hit Ratio 상세 분석&lt;br /&gt;
SELECT &lt;br /&gt;
    name,&lt;br /&gt;
    physical_reads,&lt;br /&gt;
    db_block_gets,&lt;br /&gt;
    consistent_gets,&lt;br /&gt;
    ROUND((1 - (physical_reads / (db_block_gets + consistent_gets))) * 100, 2) as hit_ratio&lt;br /&gt;
FROM v$buffer_pool_statistics;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== PGA 메모리 분석 ====&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 세션별 PGA 사용량&lt;br /&gt;
SELECT &lt;br /&gt;
    s.sid, s.serial=, s.username, s.program, s&lt;br /&gt;
    ROUND(p.value/1024/1024, 2) as pga_used_mb,&lt;br /&gt;
    ROUND(p2.value/1024/1024, 2) as pga_alloc_mb,&lt;br /&gt;
    ROUND(p3.value/1024/1024, 2) as pga_max_mb&lt;br /&gt;
FROM v$session s, v$process pr, v$sesstat p, v$sesstat p2, v$sesstat p3,&lt;br /&gt;
     v$statname sn, v$statname sn2, v$statname sn3&lt;br /&gt;
WHERE s.paddr = pr.addr WHERE&lt;br /&gt;
  AND s.sid = p.sid AND p.statistic= = sn.statistic= AND&lt;br /&gt;
  AND s.sid = p2.sid AND p2.statistic= = sn2.statistic= AND&lt;br /&gt;
  AND s.sid = p3.sid AND p3.statistic= = sn3.statistic= AND&lt;br /&gt;
  AND sn.name = &#039;session pga memory&#039; AND&lt;br /&gt;
  AND sn2.name = &#039;session pga memory max&#039; AND&lt;br /&gt;
  AND sn3.name = &#039;session uga memory max&#039; AND&lt;br /&gt;
  AND p.value &amp;gt; 1024*1024&lt;br /&gt;
ORDER BY pga_used_mb DESC;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SQL 레벨 근본 원인 분석 ==&lt;br /&gt;
&lt;br /&gt;
=== Top SQL 식별 및 분석 ===&lt;br /&gt;
&lt;br /&gt;
==== 리소스 소비량 기준 Top SQL ====&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- CPU 시간 기준 Top SQL&lt;br /&gt;
SELECT &lt;br /&gt;
    sql_id,&lt;br /&gt;
    child_number,&lt;br /&gt;
    executions,&lt;br /&gt;
    ROUND(cpu_time/1000000, 2) as cpu_time_sec,&lt;br /&gt;
    ROUND(elapsed_time/1000000, 2) as elapsed_time_sec,&lt;br /&gt;
    ROUND(cpu_time/executions/1000, 2) as avg_cpu_ms,&lt;br /&gt;
    disk_reads,&lt;br /&gt;
    buffer_gets,&lt;br /&gt;
    rows_processed,&lt;br /&gt;
    SUBSTR(sql_text, 1, 100) as sql_text_preview&lt;br /&gt;
FROM v$sql&lt;br /&gt;
WHERE executions &amp;gt; 0&lt;br /&gt;
  AND cpu_time &amp;gt; 0&lt;br /&gt;
ORDER BY cpu_time DESC&lt;br /&gt;
FETCH FIRST 20 ROWS ONLY;&lt;br /&gt;
&lt;br /&gt;
-- Logical I/O 기준 Top SQL&lt;br /&gt;
SELECT &lt;br /&gt;
    sql_id,&lt;br /&gt;
    executions,&lt;br /&gt;
    buffer_gets,&lt;br /&gt;
    ROUND(buffer_gets/executions, 2) as avg_lio_per_exec,&lt;br /&gt;
    disk_reads,&lt;br /&gt;
    ROUND(disk_reads/executions, 2) as avg_pio_per_exec,&lt;br /&gt;
    rows_processed,&lt;br /&gt;
    SUBSTR(sql_text, 1, 100) as sql_text_preview&lt;br /&gt;
FROM v$sql&lt;br /&gt;
WHERE executions &amp;gt; 0&lt;br /&gt;
ORDER BY buffer_gets DESC&lt;br /&gt;
FETCH FIRST 20 ROWS ONLY;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실행 계획 분석 ===&lt;br /&gt;
&lt;br /&gt;
==== 비효율적인 실행 계획 패턴 식별 ====&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Full Table Scan이 발생하는 SQL 식별&lt;br /&gt;
SELECT DISTINCT&lt;br /&gt;
    p.sql_id,&lt;br /&gt;
    COUNT(*) as fts_operations,&lt;br /&gt;
    s.executions,&lt;br /&gt;
    s.cpu_time/1000000 as cpu_sec,&lt;br /&gt;
    SUBSTR(s.sql_text, 1, 100) as sql_preview&lt;br /&gt;
FROM v$sql_plan p, v$sql s&lt;br /&gt;
WHERE p.sql_id = s.sql_id WHERE&lt;br /&gt;
  AND p.child_number = s.child_number AND&lt;br /&gt;
  AND p.operation = &#039;TABLE ACCESS&#039; AND&lt;br /&gt;
  AND p.options = &#039;FULL&#039; AND&lt;br /&gt;
  AND s.executions &amp;gt; 10&lt;br /&gt;
GROUP BY p.sql_id, s.executions, s.cpu_time, s.sql_text&lt;br /&gt;
ORDER BY cpu_sec DESC;&lt;br /&gt;
&lt;br /&gt;
-- 카디널리티 추정 오류 식별&lt;br /&gt;
SELECT &lt;br /&gt;
    sql_id, child_number, operation, object_name,&lt;br /&gt;
    cardinality as estimated_rows,&lt;br /&gt;
    last_cr_buffer_gets as actual_buffer_gets,&lt;br /&gt;
    CASE WHEN cardinality &amp;gt; 0 &lt;br /&gt;
         THEN ROUND(last_cr_buffer_gets/cardinality, 2)&lt;br /&gt;
         ELSE 0 END as actual_vs_estimated_ratio&lt;br /&gt;
FROM v$sql_plan_statistics_all&lt;br /&gt;
WHERE last_cr_buffer_gets &amp;gt; 0&lt;br /&gt;
  AND cardinality &amp;gt; 0&lt;br /&gt;
  AND ABS(LOG(10, last_cr_buffer_gets/cardinality)) &amp;gt; 1&lt;br /&gt;
ORDER BY actual_vs_estimated_ratio DESC;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 애플리케이션 레벨 분석 ==&lt;br /&gt;
&lt;br /&gt;
=== Connection Pool 분석 ===&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 세션 상태별 분포&lt;br /&gt;
SELECT &lt;br /&gt;
    status,&lt;br /&gt;
    COUNT(*) as session_count,&lt;br /&gt;
    ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER(), 2) as percentage&lt;br /&gt;
FROM v$session&lt;br /&gt;
WHERE type = &#039;USER&#039; WHERE&lt;br /&gt;
GROUP BY status&lt;br /&gt;
ORDER BY session_count DESC;&lt;br /&gt;
&lt;br /&gt;
-- 장시간 비활성 세션 식별&lt;br /&gt;
SELECT &lt;br /&gt;
    sid, serial=, username, machine, program, sid&lt;br /&gt;
    status, ROUND(last_call_et/3600, 2) as hours_inactive,&lt;br /&gt;
    logon_time&lt;br /&gt;
FROM v$session&lt;br /&gt;
WHERE type = &#039;USER&#039; WHERE&lt;br /&gt;
  AND status = &#039;INACTIVE&#039; AND&lt;br /&gt;
  AND last_call_et &amp;gt; 3600&lt;br /&gt;
ORDER BY last_call_et DESC;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 트랜잭션 패턴 분석 ===&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 장기 실행 트랜잭션 식별&lt;br /&gt;
SELECT &lt;br /&gt;
    s.sid, s.serial=, s.username, s.machine, s&lt;br /&gt;
    t.start_time,&lt;br /&gt;
    ROUND((SYSDATE - t.start_date) * 24 * 60, 2) as duration_minutes,&lt;br /&gt;
    t.used_ublk as undo_blocks_used,&lt;br /&gt;
    r.name as rollback_segment&lt;br /&gt;
FROM v$session s, v$transaction t, v$rollname r&lt;br /&gt;
WHERE s.taddr = t.addr WHERE&lt;br /&gt;
  AND t.xidusn = r.usn AND&lt;br /&gt;
  AND (SYSDATE - t.start_date) * 24 * 60 &amp;gt; 30&lt;br /&gt;
ORDER BY duration_minutes DESC;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 실전 진단 시나리오 ==&lt;br /&gt;
&lt;br /&gt;
=== 시나리오 1: 갑작스러운 전체 시스템 성능 저하 ===&lt;br /&gt;
&lt;br /&gt;
**진단 순서:**&lt;br /&gt;
1. **즉시 확인 사항**&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
   -- 현재 활성 세션 및 대기 이벤트&lt;br /&gt;
   SELECT event, count(*) as sessions&lt;br /&gt;
   FROM v$session_wait&lt;br /&gt;
   WHERE wait_class != &#039;Idle&#039; WHERE&lt;br /&gt;
   GROUP BY event&lt;br /&gt;
   ORDER BY sessions DESC;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. **시스템 리소스 확인**&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
   -- CPU 및 메모리 사용률 확인&lt;br /&gt;
   SELECT metric_name, value, metric_unit&lt;br /&gt;
   FROM v$sysmetric&lt;br /&gt;
   WHERE metric_name IN (&lt;br /&gt;
       &#039;Host CPU Utilization (%)&#039;,&lt;br /&gt;
       &#039;Current OS Load&#039;,&lt;br /&gt;
       &#039;Memory Usage (%)&#039;&lt;br /&gt;
   );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. **AWR 스냅샷 생성 및 분석**&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
   -- 수동 AWR 스냅샷 생성&lt;br /&gt;
   EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();&lt;br /&gt;
   ```&lt;br /&gt;
&lt;br /&gt;
=== 시나리오 2: 특정 시간대 성능 저하 ===&lt;br /&gt;
&lt;br /&gt;
**원인 분석 절차:**&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 문제 시간대의 Top Wait Events&lt;br /&gt;
SELECT &lt;br /&gt;
    event_name,&lt;br /&gt;
    wait_class,&lt;br /&gt;
    total_waits_delta,&lt;br /&gt;
    ROUND(time_waited_delta_micro/1000000, 2) as time_waited_sec&lt;br /&gt;
FROM (&lt;br /&gt;
    SELECT &lt;br /&gt;
        e.event_name,&lt;br /&gt;
        e.wait_class,&lt;br /&gt;
        e.total_waits - LAG(e.total_waits) OVER (&lt;br /&gt;
            PARTITION BY e.event_name ORDER BY e.snap_id&lt;br /&gt;
        ) as total_waits_delta,&lt;br /&gt;
        e.time_waited_micro - LAG(e.time_waited_micro) OVER (&lt;br /&gt;
            PARTITION BY e.event_name ORDER BY e.snap_id  &lt;br /&gt;
        ) as time_waited_delta_micro&lt;br /&gt;
    FROM dba_hist_system_event e, dba_hist_snapshot s&lt;br /&gt;
    WHERE e.snap_id = s.snap_id WHERE&lt;br /&gt;
      AND s.begin_interval_time BETWEEN &lt;br /&gt;
          TO_DATE(&#039;2024-01-15 14:00:00&#039;, &#039;YYYY-MM-DD HH24:MI:SS&#039;) AND&lt;br /&gt;
          TO_DATE(&#039;2024-01-15 16:00:00&#039;, &#039;YYYY-MM-DD HH24:MI:SS&#039;)&lt;br /&gt;
      AND e.wait_class != &#039;Idle&#039; AND&lt;br /&gt;
)&lt;br /&gt;
WHERE total_waits_delta &amp;gt; 0&lt;br /&gt;
ORDER BY time_waited_sec DESC;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== 자동화된 근본 원인 분석 도구 ==&lt;br /&gt;
&lt;br /&gt;
=== ADDM 보고서 자동 생성 스크립트 ===&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- ADDM 보고서 생성 및 분석&lt;br /&gt;
DECLARE&lt;br /&gt;
    task_name VARCHAR2(30) := &#039;ADDM_ANALYSIS_&#039; || TO_CHAR(SYSDATE, &#039;YYYYMMDDHH24MI&#039;); task_name&lt;br /&gt;
    begin_snap NUMBER;&lt;br /&gt;
    end_snap NUMBER;&lt;br /&gt;
BEGIN&lt;br /&gt;
    SELECT MAX(snap_id) - 1, MAX(snap_id) &lt;br /&gt;
    INTO begin_snap, end_snap&lt;br /&gt;
    FROM dba_hist_snapshot;&lt;br /&gt;
    &lt;br /&gt;
    DBMS_ADDM.ANALYZE_DB(&lt;br /&gt;
        task_name =&amp;gt; task_name, task_name&lt;br /&gt;
        begin_snapshot =&amp;gt; begin_snap, begin_snapshot&lt;br /&gt;
        end_snapshot =&amp;gt; end_snap end_snapshot&lt;br /&gt;
    );&lt;br /&gt;
    &lt;br /&gt;
    -- 권고사항 조회&lt;br /&gt;
    FOR rec IN (&lt;br /&gt;
        SELECT finding_name, impact, message&lt;br /&gt;
        FROM dba_addm_findings &lt;br /&gt;
        WHERE task_name = task_name WHERE&lt;br /&gt;
        ORDER BY impact DESC&lt;br /&gt;
    ) LOOP&lt;br /&gt;
        DBMS_OUTPUT.PUT_LINE(&#039;Finding: &#039; || rec.finding_name);&lt;br /&gt;
        DBMS_OUTPUT.PUT_LINE(&#039;Impact: &#039; || rec.impact);&lt;br /&gt;
        DBMS_OUTPUT.PUT_LINE(&#039;Message: &#039; || rec.message);&lt;br /&gt;
        DBMS_OUTPUT.PUT_LINE(&#039;---&#039;);&lt;br /&gt;
    END LOOP;&lt;br /&gt;
END;&lt;br /&gt;
/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[category:oracle]]&lt;/div&gt;</summary>
		<author><name>Jhwang327</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EC%84%B1%EB%8A%A5_%EB%AC%B8%EC%A0%9C_%EC%8B%9D%EB%B3%84_%EB%B0%A9%EB%B2%95%EB%A1%A0%EA%B3%BC_%ED%8A%9C%EB%8B%9D_%EC%A0%91%EA%B7%BC%EB%B2%95&amp;diff=1608</id>
		<title>성능 문제 식별 방법론과 튜닝 접근법</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EC%84%B1%EB%8A%A5_%EB%AC%B8%EC%A0%9C_%EC%8B%9D%EB%B3%84_%EB%B0%A9%EB%B2%95%EB%A1%A0%EA%B3%BC_%ED%8A%9C%EB%8B%9D_%EC%A0%91%EA%B7%BC%EB%B2%95&amp;diff=1608"/>
		<updated>2025-10-22T06:25:45Z</updated>

		<summary type="html">&lt;p&gt;Jhwang327: /* 응답 시간 문제 (Response Time Issues) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 성능 문제 식별 방법론과 튜닝 접근법 =&lt;br /&gt;
&lt;br /&gt;
== 성능 문제 분석 방법론 ==&lt;br /&gt;
&lt;br /&gt;
=== Top-Down 접근법 (시스템 → 세션 → SQL) ===&lt;br /&gt;
&lt;br /&gt;
**단계별 분석 순서:**&lt;br /&gt;
```&lt;br /&gt;
시스템 전체 성능 → 인스턴스 레벨 → 세션 레벨 → SQL 레벨 → 오브젝트 레벨&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
**장점:**&lt;br /&gt;
- 전체적인 시스템 상황 파악 가능&lt;br /&gt;
- 우선순위가 높은 문제부터 식별&lt;br /&gt;
- 리소스 사용률 기반의 객관적 분석&lt;br /&gt;
&lt;br /&gt;
**분석 도구:**&lt;br /&gt;
- ADDM (Automatic Database Diagnostic Monitor)&lt;br /&gt;
- AWR (Automatic Workload Repository)&lt;br /&gt;
- Statspack (AWR 대체)&lt;br /&gt;
&lt;br /&gt;
=== Bottom-Up 접근법 (SQL → 세션 → 시스템) ===&lt;br /&gt;
&lt;br /&gt;
**적용 시나리오:**&lt;br /&gt;
- 특정 애플리케이션의 성능 문제&lt;br /&gt;
- 특정 SQL 문장의 성능 저하&lt;br /&gt;
- 사용자 불만 기반 문제 해결&lt;br /&gt;
&lt;br /&gt;
**분석 도구:**&lt;br /&gt;
- SQL Trace (10046 Event)&lt;br /&gt;
- ASH (Active Session History)&lt;br /&gt;
- SQL Tuning Advisor&lt;br /&gt;
&lt;br /&gt;
== 성능 문제 분류 체계 ==&lt;br /&gt;
&lt;br /&gt;
=== 문제 유형별 분류 ===&lt;br /&gt;
&lt;br /&gt;
==== 응답 시간 문제 (Response Time Issues) ====&lt;br /&gt;
::::&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 응답 시간 분석을 위한 기본 쿼리&lt;br /&gt;
SELECT &lt;br /&gt;
    s.sid, s.serial=, s.username, s.machine, s.program, s&lt;br /&gt;
    s.status, s.last_call_et,&lt;br /&gt;
    w.event, w.state, w.wait_time, w.seconds_in_wait,&lt;br /&gt;
    sq.sql_text&lt;br /&gt;
FROM v$session s, v$session_wait w, v$sqlarea sq&lt;br /&gt;
WHERE s.sid = w.sid WHERE&lt;br /&gt;
  AND s.sql_address = sq.address(+) AND&lt;br /&gt;
  AND s.sql_hash_value = sq.hash_value(+) AND&lt;br /&gt;
  AND s.status = &#039;ACTIVE&#039; AND&lt;br /&gt;
ORDER BY s.last_call_et DESC;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 처리량 문제 (Throughput Issues) ====&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 시간당 트랜잭션 처리량 분석&lt;br /&gt;
SELECT &lt;br /&gt;
    TO_CHAR(begin_interval_time, &#039;YYYY-MM-DD HH24&#039;) as hour,&lt;br /&gt;
    (SELECT value FROM dba_hist_sysstat dhss2 &lt;br /&gt;
     WHERE dhss2.snap_id = dhs.snap_id  WHERE&lt;br /&gt;
       AND dhss2.stat_name = &#039;user commits&#039;) /  AND&lt;br /&gt;
    (EXTRACT(HOUR FROM (end_interval_time - begin_interval_time)) * 3600 + &lt;br /&gt;
     EXTRACT(MINUTE FROM (end_interval_time - begin_interval_time)) * 60) as tps&lt;br /&gt;
FROM dba_hist_snapshot dhs&lt;br /&gt;
WHERE begin_interval_time &amp;gt;= SYSDATE - 7 WHERE&lt;br /&gt;
ORDER BY begin_interval_time;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 리소스 고갈 문제 (Resource Exhaustion) ====&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 메모리 사용률 분석&lt;br /&gt;
SELECT &lt;br /&gt;
    component, &lt;br /&gt;
    current_size/1024/1024 as current_mb,&lt;br /&gt;
    max_size/1024/1024 as max_mb,&lt;br /&gt;
    (current_size/max_size)*100 as usage_pct&lt;br /&gt;
FROM v$memory_dynamic_components&lt;br /&gt;
WHERE max_size &amp;gt; 0&lt;br /&gt;
ORDER BY usage_pct DESC;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 문제 심각도 분류 ===&lt;br /&gt;
&lt;br /&gt;
==== 긴급도 매트릭스 ====&lt;br /&gt;
| 심각도 | 영향 범위 | 응답 시간 | 비즈니스 영향 |&lt;br /&gt;
|--------|-----------|-----------|---------------|&lt;br /&gt;
| P1 | 전체 시스템 | &amp;gt; 300% 증가 | 서비스 중단 |&lt;br /&gt;
| P2 | 특정 모듈 | 100-300% 증가 | 기능 제한 |&lt;br /&gt;
| P3 | 개별 기능 | 50-100% 증가 | 사용자 불편 |&lt;br /&gt;
| P4 | 미미한 영향 | &amp;lt; 50% 증가 | 성능 개선 여지 |&lt;br /&gt;
&lt;br /&gt;
== Wait Event 기반 근본 원인 분석 ==&lt;br /&gt;
&lt;br /&gt;
=== Wait Event 분류 및 진단 ===&lt;br /&gt;
&lt;br /&gt;
==== User I/O 관련 Wait Events ====&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- I/O 관련 대기 이벤트 상세 분석&lt;br /&gt;
SELECT &lt;br /&gt;
    event, &lt;br /&gt;
    total_waits, &lt;br /&gt;
    total_timeouts,&lt;br /&gt;
    time_waited,&lt;br /&gt;
    average_wait,&lt;br /&gt;
    time_waited/total_waits*1000 as avg_wait_ms&lt;br /&gt;
FROM v$system_event &lt;br /&gt;
WHERE wait_class = &#039;User I/O&#039; WHERE&lt;br /&gt;
  AND total_waits &amp;gt; 0&lt;br /&gt;
ORDER BY time_waited DESC;&lt;br /&gt;
&lt;br /&gt;
-- 파일별 I/O 통계&lt;br /&gt;
SELECT &lt;br /&gt;
    df.tablespace_name,&lt;br /&gt;
    df.file_name,&lt;br /&gt;
    fs.phyblkrd as blocks_read,&lt;br /&gt;
    fs.phyblkwrt as blocks_written,&lt;br /&gt;
    fs.readtim as read_time,&lt;br /&gt;
    fs.writetim as write_time,&lt;br /&gt;
    CASE WHEN fs.phyblkrd &amp;gt; 0 &lt;br /&gt;
         THEN fs.readtim/fs.phyblkrd*10 &lt;br /&gt;
         ELSE 0 END as avg_read_time_ms&lt;br /&gt;
FROM dba_data_files df, v$filestat fs&lt;br /&gt;
WHERE df.file_id = fs.file= WHERE&lt;br /&gt;
ORDER BY avg_read_time_ms DESC;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
**주요 I/O Wait Events:**&lt;br /&gt;
- `db file sequential read`: 인덱스 스캔, ROWID 액세스&lt;br /&gt;
- `db file scattered read`: Full Table Scan&lt;br /&gt;
- `direct path read`: 병렬 처리, LOB 액세스&lt;br /&gt;
- `log file sync`: 커밋 대기&lt;br /&gt;
&lt;br /&gt;
==== Concurrency 관련 Wait Events ====&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Lock 경합 분석&lt;br /&gt;
SELECT &lt;br /&gt;
    s1.sid as blocker_sid,&lt;br /&gt;
    s1.username as blocker_user,&lt;br /&gt;
    s2.sid as waiter_sid,&lt;br /&gt;
    s2.username as waiter_user,&lt;br /&gt;
    lo.object_id,&lt;br /&gt;
    do.object_name,&lt;br /&gt;
    lo.locked_mode,&lt;br /&gt;
    s2.seconds_in_wait&lt;br /&gt;
FROM v$locked_object lo, dba_objects do, v$session s1, v$session s2&lt;br /&gt;
WHERE lo.object_id = do.object_id WHERE&lt;br /&gt;
  AND lo.session_id = s1.sid AND&lt;br /&gt;
  AND s2.blocking_session = s1.sid; AND&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
**주요 Concurrency Wait Events:**&lt;br /&gt;
- `enq: TX - row lock contention`: 행 레벨 lock 경합&lt;br /&gt;
- `enq: TM - contention`: 테이블 lock 경합&lt;br /&gt;
- `latch: cache buffers chains`: Buffer Cache 경합&lt;br /&gt;
- `library cache lock`: 공유 SQL 영역 경합&lt;br /&gt;
&lt;br /&gt;
=== Wait Event 패턴 분석 ===&lt;br /&gt;
&lt;br /&gt;
==== 시간대별 Wait Event 트렌드 ====&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 시간대별 주요 Wait Event 분석 (AWR 기반)&lt;br /&gt;
SELECT &lt;br /&gt;
    TO_CHAR(s.begin_interval_time, &#039;YYYY-MM-DD HH24:MI&#039;) as snapshot_time,&lt;br /&gt;
    e.event_name,&lt;br /&gt;
    e.total_waits - LAG(e.total_waits) OVER (&lt;br /&gt;
        PARTITION BY e.event_name ORDER BY s.snap_id&lt;br /&gt;
    ) as waits_delta,&lt;br /&gt;
    ROUND((e.time_waited_micro - LAG(e.time_waited_micro) OVER (&lt;br /&gt;
        PARTITION BY e.event_name ORDER BY s.snap_id&lt;br /&gt;
    ))/1000000, 2) as time_waited_sec&lt;br /&gt;
FROM dba_hist_system_event e, dba_hist_snapshot s&lt;br /&gt;
WHERE e.snap_id = s.snap_id WHERE&lt;br /&gt;
  AND s.begin_interval_time &amp;gt;= SYSDATE - 1 AND&lt;br /&gt;
  AND e.wait_class != &#039;Idle&#039; AND&lt;br /&gt;
  AND e.event_name IN (&lt;br /&gt;
      &#039;db file sequential read&#039;,&lt;br /&gt;
      &#039;db file scattered read&#039;, &lt;br /&gt;
      &#039;log file sync&#039;,&lt;br /&gt;
      &#039;enq: TX - row lock contention&#039;&lt;br /&gt;
  )&lt;br /&gt;
ORDER BY snapshot_time, time_waited_sec DESC;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 시스템 리소스 분석 ==&lt;br /&gt;
&lt;br /&gt;
=== CPU 사용률 분석 ===&lt;br /&gt;
&lt;br /&gt;
==== OS Level CPU 분석 ====&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- CPU 사용률 히스토리 (AWR 기반)&lt;br /&gt;
SELECT &lt;br /&gt;
    TO_CHAR(s.begin_interval_time, &#039;YYYY-MM-DD HH24:MI&#039;) as time,&lt;br /&gt;
    os1.value as num_cpus,&lt;br /&gt;
    os2.value as load_avg,&lt;br /&gt;
    ROUND(os2.value/os1.value * 100, 2) as cpu_util_pct&lt;br /&gt;
FROM dba_hist_osstat os1, dba_hist_osstat os2, dba_hist_snapshot s&lt;br /&gt;
WHERE os1.snap_id = os2.snap_id WHERE&lt;br /&gt;
  AND os1.snap_id = s.snap_id AND&lt;br /&gt;
  AND os1.stat_name = &#039;NUM_CPUS&#039; AND&lt;br /&gt;
  AND os2.stat_name = &#039;LOAD&#039; AND&lt;br /&gt;
  AND s.begin_interval_time &amp;gt;= SYSDATE - 1 AND&lt;br /&gt;
ORDER BY time;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Oracle Process CPU 사용률 ====&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 세션별 CPU 사용률&lt;br /&gt;
SELECT &lt;br /&gt;
    s.sid, s.serial=, s.username, s.machine, s.program, s&lt;br /&gt;
    ss.value/100 as cpu_used_seconds,&lt;br /&gt;
    s.last_call_et as seconds_since_last_call&lt;br /&gt;
FROM v$session s, v$sesstat ss, v$statname sn&lt;br /&gt;
WHERE s.sid = ss.sid WHERE&lt;br /&gt;
  AND ss.statistic= = sn.statistic= AND&lt;br /&gt;
  AND sn.name = &#039;CPU used by this session&#039; AND&lt;br /&gt;
  AND ss.value &amp;gt; 0&lt;br /&gt;
ORDER BY ss.value DESC;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 메모리 사용률 분석 ===&lt;br /&gt;
&lt;br /&gt;
==== SGA 구성요소별 분석 ====&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- SGA 구성요소별 사용률&lt;br /&gt;
SELECT &lt;br /&gt;
    component,&lt;br /&gt;
    current_size/1024/1024 as current_mb,&lt;br /&gt;
    min_size/1024/1024 as min_mb,&lt;br /&gt;
    max_size/1024/1024 as max_mb,&lt;br /&gt;
    ROUND((current_size/max_size)*100, 2) as usage_pct,&lt;br /&gt;
    resize_ops,&lt;br /&gt;
    last_oper_type&lt;br /&gt;
FROM v$memory_dynamic_components&lt;br /&gt;
WHERE current_size &amp;gt; 0&lt;br /&gt;
ORDER BY current_mb DESC;&lt;br /&gt;
&lt;br /&gt;
-- Buffer Cache Hit Ratio 상세 분석&lt;br /&gt;
SELECT &lt;br /&gt;
    name,&lt;br /&gt;
    physical_reads,&lt;br /&gt;
    db_block_gets,&lt;br /&gt;
    consistent_gets,&lt;br /&gt;
    ROUND((1 - (physical_reads / (db_block_gets + consistent_gets))) * 100, 2) as hit_ratio&lt;br /&gt;
FROM v$buffer_pool_statistics;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== PGA 메모리 분석 ====&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 세션별 PGA 사용량&lt;br /&gt;
SELECT &lt;br /&gt;
    s.sid, s.serial=, s.username, s.program, s&lt;br /&gt;
    ROUND(p.value/1024/1024, 2) as pga_used_mb,&lt;br /&gt;
    ROUND(p2.value/1024/1024, 2) as pga_alloc_mb,&lt;br /&gt;
    ROUND(p3.value/1024/1024, 2) as pga_max_mb&lt;br /&gt;
FROM v$session s, v$process pr, v$sesstat p, v$sesstat p2, v$sesstat p3,&lt;br /&gt;
     v$statname sn, v$statname sn2, v$statname sn3&lt;br /&gt;
WHERE s.paddr = pr.addr WHERE&lt;br /&gt;
  AND s.sid = p.sid AND p.statistic= = sn.statistic= AND&lt;br /&gt;
  AND s.sid = p2.sid AND p2.statistic= = sn2.statistic= AND&lt;br /&gt;
  AND s.sid = p3.sid AND p3.statistic= = sn3.statistic= AND&lt;br /&gt;
  AND sn.name = &#039;session pga memory&#039; AND&lt;br /&gt;
  AND sn2.name = &#039;session pga memory max&#039; AND&lt;br /&gt;
  AND sn3.name = &#039;session uga memory max&#039; AND&lt;br /&gt;
  AND p.value &amp;gt; 1024*1024&lt;br /&gt;
ORDER BY pga_used_mb DESC;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SQL 레벨 근본 원인 분석 ==&lt;br /&gt;
&lt;br /&gt;
=== Top SQL 식별 및 분석 ===&lt;br /&gt;
&lt;br /&gt;
==== 리소스 소비량 기준 Top SQL ====&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- CPU 시간 기준 Top SQL&lt;br /&gt;
SELECT &lt;br /&gt;
    sql_id,&lt;br /&gt;
    child_number,&lt;br /&gt;
    executions,&lt;br /&gt;
    ROUND(cpu_time/1000000, 2) as cpu_time_sec,&lt;br /&gt;
    ROUND(elapsed_time/1000000, 2) as elapsed_time_sec,&lt;br /&gt;
    ROUND(cpu_time/executions/1000, 2) as avg_cpu_ms,&lt;br /&gt;
    disk_reads,&lt;br /&gt;
    buffer_gets,&lt;br /&gt;
    rows_processed,&lt;br /&gt;
    SUBSTR(sql_text, 1, 100) as sql_text_preview&lt;br /&gt;
FROM v$sql&lt;br /&gt;
WHERE executions &amp;gt; 0&lt;br /&gt;
  AND cpu_time &amp;gt; 0&lt;br /&gt;
ORDER BY cpu_time DESC&lt;br /&gt;
FETCH FIRST 20 ROWS ONLY;&lt;br /&gt;
&lt;br /&gt;
-- Logical I/O 기준 Top SQL&lt;br /&gt;
SELECT &lt;br /&gt;
    sql_id,&lt;br /&gt;
    executions,&lt;br /&gt;
    buffer_gets,&lt;br /&gt;
    ROUND(buffer_gets/executions, 2) as avg_lio_per_exec,&lt;br /&gt;
    disk_reads,&lt;br /&gt;
    ROUND(disk_reads/executions, 2) as avg_pio_per_exec,&lt;br /&gt;
    rows_processed,&lt;br /&gt;
    SUBSTR(sql_text, 1, 100) as sql_text_preview&lt;br /&gt;
FROM v$sql&lt;br /&gt;
WHERE executions &amp;gt; 0&lt;br /&gt;
ORDER BY buffer_gets DESC&lt;br /&gt;
FETCH FIRST 20 ROWS ONLY;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 실행 계획 분석 ===&lt;br /&gt;
&lt;br /&gt;
==== 비효율적인 실행 계획 패턴 식별 ====&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- Full Table Scan이 발생하는 SQL 식별&lt;br /&gt;
SELECT DISTINCT&lt;br /&gt;
    p.sql_id,&lt;br /&gt;
    COUNT(*) as fts_operations,&lt;br /&gt;
    s.executions,&lt;br /&gt;
    s.cpu_time/1000000 as cpu_sec,&lt;br /&gt;
    SUBSTR(s.sql_text, 1, 100) as sql_preview&lt;br /&gt;
FROM v$sql_plan p, v$sql s&lt;br /&gt;
WHERE p.sql_id = s.sql_id WHERE&lt;br /&gt;
  AND p.child_number = s.child_number AND&lt;br /&gt;
  AND p.operation = &#039;TABLE ACCESS&#039; AND&lt;br /&gt;
  AND p.options = &#039;FULL&#039; AND&lt;br /&gt;
  AND s.executions &amp;gt; 10&lt;br /&gt;
GROUP BY p.sql_id, s.executions, s.cpu_time, s.sql_text&lt;br /&gt;
ORDER BY cpu_sec DESC;&lt;br /&gt;
&lt;br /&gt;
-- 카디널리티 추정 오류 식별&lt;br /&gt;
SELECT &lt;br /&gt;
    sql_id, child_number, operation, object_name,&lt;br /&gt;
    cardinality as estimated_rows,&lt;br /&gt;
    last_cr_buffer_gets as actual_buffer_gets,&lt;br /&gt;
    CASE WHEN cardinality &amp;gt; 0 &lt;br /&gt;
         THEN ROUND(last_cr_buffer_gets/cardinality, 2)&lt;br /&gt;
         ELSE 0 END as actual_vs_estimated_ratio&lt;br /&gt;
FROM v$sql_plan_statistics_all&lt;br /&gt;
WHERE last_cr_buffer_gets &amp;gt; 0&lt;br /&gt;
  AND cardinality &amp;gt; 0&lt;br /&gt;
  AND ABS(LOG(10, last_cr_buffer_gets/cardinality)) &amp;gt; 1&lt;br /&gt;
ORDER BY actual_vs_estimated_ratio DESC;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 애플리케이션 레벨 분석 ==&lt;br /&gt;
&lt;br /&gt;
=== Connection Pool 분석 ===&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 세션 상태별 분포&lt;br /&gt;
SELECT &lt;br /&gt;
    status,&lt;br /&gt;
    COUNT(*) as session_count,&lt;br /&gt;
    ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER(), 2) as percentage&lt;br /&gt;
FROM v$session&lt;br /&gt;
WHERE type = &#039;USER&#039; WHERE&lt;br /&gt;
GROUP BY status&lt;br /&gt;
ORDER BY session_count DESC;&lt;br /&gt;
&lt;br /&gt;
-- 장시간 비활성 세션 식별&lt;br /&gt;
SELECT &lt;br /&gt;
    sid, serial=, username, machine, program, sid&lt;br /&gt;
    status, ROUND(last_call_et/3600, 2) as hours_inactive,&lt;br /&gt;
    logon_time&lt;br /&gt;
FROM v$session&lt;br /&gt;
WHERE type = &#039;USER&#039; WHERE&lt;br /&gt;
  AND status = &#039;INACTIVE&#039; AND&lt;br /&gt;
  AND last_call_et &amp;gt; 3600&lt;br /&gt;
ORDER BY last_call_et DESC;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 트랜잭션 패턴 분석 ===&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 장기 실행 트랜잭션 식별&lt;br /&gt;
SELECT &lt;br /&gt;
    s.sid, s.serial=, s.username, s.machine, s&lt;br /&gt;
    t.start_time,&lt;br /&gt;
    ROUND((SYSDATE - t.start_date) * 24 * 60, 2) as duration_minutes,&lt;br /&gt;
    t.used_ublk as undo_blocks_used,&lt;br /&gt;
    r.name as rollback_segment&lt;br /&gt;
FROM v$session s, v$transaction t, v$rollname r&lt;br /&gt;
WHERE s.taddr = t.addr WHERE&lt;br /&gt;
  AND t.xidusn = r.usn AND&lt;br /&gt;
  AND (SYSDATE - t.start_date) * 24 * 60 &amp;gt; 30&lt;br /&gt;
ORDER BY duration_minutes DESC;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 실전 진단 시나리오 ==&lt;br /&gt;
&lt;br /&gt;
=== 시나리오 1: 갑작스러운 전체 시스템 성능 저하 ===&lt;br /&gt;
&lt;br /&gt;
**진단 순서:**&lt;br /&gt;
1. **즉시 확인 사항**&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
   -- 현재 활성 세션 및 대기 이벤트&lt;br /&gt;
   SELECT event, count(*) as sessions&lt;br /&gt;
   FROM v$session_wait&lt;br /&gt;
   WHERE wait_class != &#039;Idle&#039; WHERE&lt;br /&gt;
   GROUP BY event&lt;br /&gt;
   ORDER BY sessions DESC;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. **시스템 리소스 확인**&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
   -- CPU 및 메모리 사용률 확인&lt;br /&gt;
   SELECT metric_name, value, metric_unit&lt;br /&gt;
   FROM v$sysmetric&lt;br /&gt;
   WHERE metric_name IN (&lt;br /&gt;
       &#039;Host CPU Utilization (%)&#039;,&lt;br /&gt;
       &#039;Current OS Load&#039;,&lt;br /&gt;
       &#039;Memory Usage (%)&#039;&lt;br /&gt;
   );&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. **AWR 스냅샷 생성 및 분석**&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
   -- 수동 AWR 스냅샷 생성&lt;br /&gt;
   EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();&lt;br /&gt;
   ```&lt;br /&gt;
&lt;br /&gt;
=== 시나리오 2: 특정 시간대 성능 저하 ===&lt;br /&gt;
&lt;br /&gt;
**원인 분석 절차:**&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- 문제 시간대의 Top Wait Events&lt;br /&gt;
SELECT &lt;br /&gt;
    event_name,&lt;br /&gt;
    wait_class,&lt;br /&gt;
    total_waits_delta,&lt;br /&gt;
    ROUND(time_waited_delta_micro/1000000, 2) as time_waited_sec&lt;br /&gt;
FROM (&lt;br /&gt;
    SELECT &lt;br /&gt;
        e.event_name,&lt;br /&gt;
        e.wait_class,&lt;br /&gt;
        e.total_waits - LAG(e.total_waits) OVER (&lt;br /&gt;
            PARTITION BY e.event_name ORDER BY e.snap_id&lt;br /&gt;
        ) as total_waits_delta,&lt;br /&gt;
        e.time_waited_micro - LAG(e.time_waited_micro) OVER (&lt;br /&gt;
            PARTITION BY e.event_name ORDER BY e.snap_id  &lt;br /&gt;
        ) as time_waited_delta_micro&lt;br /&gt;
    FROM dba_hist_system_event e, dba_hist_snapshot s&lt;br /&gt;
    WHERE e.snap_id = s.snap_id WHERE&lt;br /&gt;
      AND s.begin_interval_time BETWEEN &lt;br /&gt;
          TO_DATE(&#039;2024-01-15 14:00:00&#039;, &#039;YYYY-MM-DD HH24:MI:SS&#039;) AND&lt;br /&gt;
          TO_DATE(&#039;2024-01-15 16:00:00&#039;, &#039;YYYY-MM-DD HH24:MI:SS&#039;)&lt;br /&gt;
      AND e.wait_class != &#039;Idle&#039; AND&lt;br /&gt;
)&lt;br /&gt;
WHERE total_waits_delta &amp;gt; 0&lt;br /&gt;
ORDER BY time_waited_sec DESC;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== 자동화된 근본 원인 분석 도구 ==&lt;br /&gt;
&lt;br /&gt;
=== ADDM 보고서 자동 생성 스크립트 ===&lt;br /&gt;
&amp;lt;source lang=sql&amp;gt;&lt;br /&gt;
-- ADDM 보고서 생성 및 분석&lt;br /&gt;
DECLARE&lt;br /&gt;
    task_name VARCHAR2(30) := &#039;ADDM_ANALYSIS_&#039; || TO_CHAR(SYSDATE, &#039;YYYYMMDDHH24MI&#039;); task_name&lt;br /&gt;
    begin_snap NUMBER;&lt;br /&gt;
    end_snap NUMBER;&lt;br /&gt;
BEGIN&lt;br /&gt;
    SELECT MAX(snap_id) - 1, MAX(snap_id) &lt;br /&gt;
    INTO begin_snap, end_snap&lt;br /&gt;
    FROM dba_hist_snapshot;&lt;br /&gt;
    &lt;br /&gt;
    DBMS_ADDM.ANALYZE_DB(&lt;br /&gt;
        task_name =&amp;gt; task_name, task_name&lt;br /&gt;
        begin_snapshot =&amp;gt; begin_snap, begin_snapshot&lt;br /&gt;
        end_snapshot =&amp;gt; end_snap end_snapshot&lt;br /&gt;
    );&lt;br /&gt;
    &lt;br /&gt;
    -- 권고사항 조회&lt;br /&gt;
    FOR rec IN (&lt;br /&gt;
        SELECT finding_name, impact, message&lt;br /&gt;
        FROM dba_addm_findings &lt;br /&gt;
        WHERE task_name = task_name WHERE&lt;br /&gt;
        ORDER BY impact DESC&lt;br /&gt;
    ) LOOP&lt;br /&gt;
        DBMS_OUTPUT.PUT_LINE(&#039;Finding: &#039; || rec.finding_name);&lt;br /&gt;
        DBMS_OUTPUT.PUT_LINE(&#039;Impact: &#039; || rec.impact);&lt;br /&gt;
        DBMS_OUTPUT.PUT_LINE(&#039;Message: &#039; || rec.message);&lt;br /&gt;
        DBMS_OUTPUT.PUT_LINE(&#039;---&#039;);&lt;br /&gt;
    END LOOP;&lt;br /&gt;
END;&lt;br /&gt;
/&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[category:oracle]]&lt;/div&gt;</summary>
		<author><name>Jhwang327</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EB%B6%84%EC%84%9D_%EB%8B%A8%EA%B3%84&amp;diff=1607</id>
		<title>분석 단계</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EB%B6%84%EC%84%9D_%EB%8B%A8%EA%B3%84&amp;diff=1607"/>
		<updated>2025-10-22T06:24:15Z</updated>

		<summary type="html">&lt;p&gt;Jhwang327: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== [[분석 단계]] ===&lt;br /&gt;
==== [[산출물]] ====&lt;br /&gt;
::::# [[인터뷰 계획서]]&lt;br /&gt;
::::# [[인터뷰 결과서]]&lt;br /&gt;
::::# [[요구사항 정의서]]&lt;br /&gt;
::::# [[현행 시스템 분석서]]&lt;br /&gt;
::::## 별첨1)현행시스템분석서-DB아키텍처)-별첨1-현행_데이터파일현황.xlsx&lt;br /&gt;
::::## 별첨2)현행시스템분석서-DB아키텍처)-별첨1-현행_테이블스페이스현황.xlsx&lt;br /&gt;
::::# [[아키텍처 정의서]]&lt;br /&gt;
* ㅁㄴㅇㄹ호&lt;br /&gt;
==== [[주요 작업 TASK]] ====&lt;br /&gt;
# [[AS-IS 구조 분석 기술환경 파악]]&lt;br /&gt;
# [[요구사항 및 문제점 도출]]&lt;br /&gt;
# [[TO-BE 설계를 위한 기초자료 확보]]&lt;br /&gt;
&lt;br /&gt;
----&lt;/div&gt;</summary>
		<author><name>Jhwang327</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%EB%B6%84%EC%84%9D_%EB%8B%A8%EA%B3%84&amp;diff=1606</id>
		<title>분석 단계</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%EB%B6%84%EC%84%9D_%EB%8B%A8%EA%B3%84&amp;diff=1606"/>
		<updated>2025-10-22T06:23:20Z</updated>

		<summary type="html">&lt;p&gt;Jhwang327: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== [[분석 단계]] ===&lt;br /&gt;
==== [[산출물]] ====&lt;br /&gt;
# [[인터뷰 계획서]]&lt;br /&gt;
# [[인터뷰 결과서]]&lt;br /&gt;
# [[요구사항 정의서]]&lt;br /&gt;
# [[현행 시스템 분석서]]&lt;br /&gt;
## 별첨1)현행시스템분석서-DB아키텍처)-별첨1-현행_데이터파일현황.xlsx&lt;br /&gt;
## 별첨2)현행시스템분석서-DB아키텍처)-별첨1-현행_테이블스페이스현황.xlsx&lt;br /&gt;
# [[아키텍처 정의서]]&lt;br /&gt;
* ㅁㄴㅇㄹ호&lt;br /&gt;
==== [[주요 작업 TASK]] ====&lt;br /&gt;
# [[AS-IS 구조 분석 기술환경 파악]]&lt;br /&gt;
# [[요구사항 및 문제점 도출]]&lt;br /&gt;
# [[TO-BE 설계를 위한 기초자료 확보]]&lt;br /&gt;
&lt;br /&gt;
----&lt;/div&gt;</summary>
		<author><name>Jhwang327</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%ED%85%8C%EC%8A%A4%ED%8A%B83&amp;diff=1605</id>
		<title>테스트3</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%ED%85%8C%EC%8A%A4%ED%8A%B83&amp;diff=1605"/>
		<updated>2025-10-22T06:22:32Z</updated>

		<summary type="html">&lt;p&gt;Jhwang327: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=글쓰기 테스트=&lt;br /&gt;
&lt;br /&gt;
==제목==&lt;br /&gt;
=== ㅇㅇㅇㅇ ===&lt;br /&gt;
# 11111&lt;br /&gt;
# 하나&lt;br /&gt;
# 둘&lt;br /&gt;
# 둘2&lt;br /&gt;
# 다섯&lt;br /&gt;
# 넷&lt;br /&gt;
&lt;br /&gt;
4.셋&lt;br /&gt;
=== 333 ===&lt;br /&gt;
# ㅠ111&lt;br /&gt;
#@ 111&lt;/div&gt;</summary>
		<author><name>Jhwang327</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%ED%85%8C%EC%8A%A4%ED%8A%B83&amp;diff=1604</id>
		<title>테스트3</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%ED%85%8C%EC%8A%A4%ED%8A%B83&amp;diff=1604"/>
		<updated>2025-10-22T06:21:48Z</updated>

		<summary type="html">&lt;p&gt;Jhwang327: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=글쓰기 테스트=&lt;br /&gt;
&lt;br /&gt;
==제목==&lt;br /&gt;
&lt;br /&gt;
# 11111&lt;br /&gt;
# 하나&lt;br /&gt;
# 둘&lt;br /&gt;
# 둘2&lt;br /&gt;
# 다섯&lt;br /&gt;
# 넷&lt;br /&gt;
&lt;br /&gt;
4.셋&lt;br /&gt;
&lt;br /&gt;
===제목2===&lt;br /&gt;
&lt;br /&gt;
====제목3====&lt;/div&gt;</summary>
		<author><name>Jhwang327</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%ED%85%8C%EC%8A%A4%ED%8A%B83&amp;diff=1603</id>
		<title>테스트3</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%ED%85%8C%EC%8A%A4%ED%8A%B83&amp;diff=1603"/>
		<updated>2025-10-22T06:19:29Z</updated>

		<summary type="html">&lt;p&gt;Jhwang327: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;글쓰기 테스트2&lt;br /&gt;
&lt;br /&gt;
제목1&lt;br /&gt;
&lt;br /&gt;
# 하나]&lt;br /&gt;
# 둘&lt;br /&gt;
# 다섯&lt;br /&gt;
# 넷&lt;br /&gt;
&lt;br /&gt;
4.셋&lt;br /&gt;
&lt;br /&gt;
제목2&lt;br /&gt;
&lt;br /&gt;
제목3&lt;/div&gt;</summary>
		<author><name>Jhwang327</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%ED%85%8C%EC%8A%A4%ED%8A%B83&amp;diff=1602</id>
		<title>테스트3</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%ED%85%8C%EC%8A%A4%ED%8A%B83&amp;diff=1602"/>
		<updated>2025-10-22T06:17:45Z</updated>

		<summary type="html">&lt;p&gt;Jhwang327: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;글쓰기 테스트2&lt;br /&gt;
&lt;br /&gt;
제목1&lt;br /&gt;
&lt;br /&gt;
제목2&lt;br /&gt;
&lt;br /&gt;
제목3&lt;/div&gt;</summary>
		<author><name>Jhwang327</name></author>
	</entry>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=%ED%85%8C%EC%8A%A4%ED%8A%B83&amp;diff=1601</id>
		<title>테스트3</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=%ED%85%8C%EC%8A%A4%ED%8A%B83&amp;diff=1601"/>
		<updated>2025-10-22T06:17:31Z</updated>

		<summary type="html">&lt;p&gt;Jhwang327: 새 문서: 글쓰기 테스트1  제목1  제목2  제목3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;글쓰기 테스트1&lt;br /&gt;
&lt;br /&gt;
제목1&lt;br /&gt;
&lt;br /&gt;
제목2&lt;br /&gt;
&lt;br /&gt;
제목3&lt;/div&gt;</summary>
		<author><name>Jhwang327</name></author>
	</entry>
</feed>