<?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=SQL_%ED%94%8C%EB%9E%9C_%EB%B3%80%EA%B2%BD_%EC%B6%94%EC%A0%81_%EB%B0%A9%EB%B2%95</id>
	<title>SQL 플랜 변경 추적 방법 - 편집 역사</title>
	<link rel="self" type="application/atom+xml" href="https://dbstudy.co.kr/w/index.php?action=history&amp;feed=atom&amp;title=SQL_%ED%94%8C%EB%9E%9C_%EB%B3%80%EA%B2%BD_%EC%B6%94%EC%A0%81_%EB%B0%A9%EB%B2%95"/>
	<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=SQL_%ED%94%8C%EB%9E%9C_%EB%B3%80%EA%B2%BD_%EC%B6%94%EC%A0%81_%EB%B0%A9%EB%B2%95&amp;action=history"/>
	<updated>2026-05-08T20:47:20Z</updated>
	<subtitle>이 문서의 편집 역사</subtitle>
	<generator>MediaWiki 1.39.10</generator>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=SQL_%ED%94%8C%EB%9E%9C_%EB%B3%80%EA%B2%BD_%EC%B6%94%EC%A0%81_%EB%B0%A9%EB%B2%95&amp;diff=59&amp;oldid=prev</id>
		<title>Oracle: 새 문서: Oracle에서 SQL Plan(실행 계획)이 변경되었는지 추적하는 것은 성능 문제를 사전에 감지하고 해결하기 위한 중요한 작업입니다. SQL Plan의 변경 여부를 추적하는 방법은 다음과 같습니다:  1. SQL ID를 기준으로 실행 계획 추적  	•	특정 SQL 문의 SQL_ID를 사용하여 실행 계획을 추적할 수 있습니다. 	•	실행 계획을 저장하고 비교하려면 V$SQL과 DBA_HIST_SQL_PLAN을 활용합니다....</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=SQL_%ED%94%8C%EB%9E%9C_%EB%B3%80%EA%B2%BD_%EC%B6%94%EC%A0%81_%EB%B0%A9%EB%B2%95&amp;diff=59&amp;oldid=prev"/>
		<updated>2024-11-23T01:36:53Z</updated>

		<summary type="html">&lt;p&gt;새 문서: Oracle에서 SQL Plan(실행 계획)이 변경되었는지 추적하는 것은 성능 문제를 사전에 감지하고 해결하기 위한 중요한 작업입니다. SQL Plan의 변경 여부를 추적하는 방법은 다음과 같습니다:  1. SQL ID를 기준으로 실행 계획 추적  	•	특정 SQL 문의 SQL_ID를 사용하여 실행 계획을 추적할 수 있습니다. 	•	실행 계획을 저장하고 비교하려면 V$SQL과 DBA_HIST_SQL_PLAN을 활용합니다....&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Oracle에서 SQL Plan(실행 계획)이 변경되었는지 추적하는 것은 성능 문제를 사전에 감지하고 해결하기 위한 중요한 작업입니다. SQL Plan의 변경 여부를 추적하는 방법은 다음과 같습니다:&lt;br /&gt;
&lt;br /&gt;
1. SQL ID를 기준으로 실행 계획 추적&lt;br /&gt;
&lt;br /&gt;
	•	특정 SQL 문의 SQL_ID를 사용하여 실행 계획을 추적할 수 있습니다.&lt;br /&gt;
	•	실행 계획을 저장하고 비교하려면 V$SQL과 DBA_HIST_SQL_PLAN을 활용합니다.&lt;br /&gt;
&lt;br /&gt;
예제: 현재 실행 계획 확인&lt;br /&gt;
&lt;br /&gt;
SELECT sql_id, plan_hash_value&lt;br /&gt;
FROM v$sql&lt;br /&gt;
WHERE sql_text LIKE &amp;#039;SELECT * FROM employees%&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	•	**PLAN_HASH_VALUE**는 실행 계획의 변경 여부를 확인하는 주요 기준입니다. 동일한 SQL이라도 PLAN_HASH_VALUE가 변경되면 실행 계획이 바뀐 것입니다.&lt;br /&gt;
&lt;br /&gt;
2. AWR 스냅샷에서 실행 계획 추적&lt;br /&gt;
&lt;br /&gt;
	•	AWR(Automatic Workload Repository)을 사용하여 SQL Plan의 히스토리를 추적할 수 있습니다.&lt;br /&gt;
	•	DBA_HIST_SQL_PLAN 뷰를 활용하면 이전에 실행된 계획을 조회하고 비교 가능합니다.&lt;br /&gt;
&lt;br /&gt;
예제: SQL Plan 히스토리 추적&lt;br /&gt;
&lt;br /&gt;
SELECT sql_id, plan_hash_value, timestamp&lt;br /&gt;
FROM dba_hist_sql_plan&lt;br /&gt;
WHERE sql_id = &amp;#039;SQL_ID값&amp;#039;&lt;br /&gt;
ORDER BY timestamp;&lt;br /&gt;
&lt;br /&gt;
	•	**TIMESTAMP**를 기준으로 계획 변경 시점을 확인할 수 있습니다.&lt;br /&gt;
	•	AWR에서 주기적으로 스냅샷을 생성해야 SQL Plan 변경 이력을 확보할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
3. SQL Plan Baseline 활용&lt;br /&gt;
&lt;br /&gt;
	•	SQL Plan Baseline을 사용하면 특정 SQL에 대해 안정적인 실행 계획을 유지하고 변경을 감지할 수 있습니다.&lt;br /&gt;
	•	Baseline에 등록된 실행 계획과 현재 실행 계획을 비교할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
3.1 SQL Plan Baseline 확인&lt;br /&gt;
&lt;br /&gt;
SELECT sql_handle, plan_name, plan_hash_value&lt;br /&gt;
FROM dba_sql_plan_baselines&lt;br /&gt;
WHERE sql_text LIKE &amp;#039;SELECT * FROM employees%&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
3.2 Baseline과 현재 Plan 비교&lt;br /&gt;
&lt;br /&gt;
SELECT s.sql_id, b.plan_name, s.plan_hash_value&lt;br /&gt;
FROM v$sql s&lt;br /&gt;
JOIN dba_sql_plan_baselines b&lt;br /&gt;
ON s.sql_id = b.sql_handle&lt;br /&gt;
WHERE s.sql_id = &amp;#039;SQL_ID값&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
4. SQL Plan 변경 알림 설정&lt;br /&gt;
&lt;br /&gt;
	•	Oracle에서 SQL Plan이 변경되었을 때 경고를 받을 수 있도록 모니터링 스크립트를 작성할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
예제: SQL Plan 변경 모니터링 스크립트&lt;br /&gt;
&lt;br /&gt;
-- SQL Plan 변경 탐지&lt;br /&gt;
SELECT sql_id, COUNT(DISTINCT plan_hash_value) AS plan_change_count&lt;br /&gt;
FROM dba_hist_sql_plan&lt;br /&gt;
WHERE sql_id = &amp;#039;SQL_ID값&amp;#039;&lt;br /&gt;
GROUP BY sql_id&lt;br /&gt;
HAVING COUNT(DISTINCT plan_hash_value) &amp;gt; 1;&lt;br /&gt;
&lt;br /&gt;
	•	이 쿼리는 특정 SQL_ID에 대해 여러 Plan이 생성되었는지 확인합니다.&lt;br /&gt;
&lt;br /&gt;
5. SQL Plan Management(SPM) 사용&lt;br /&gt;
&lt;br /&gt;
	•	SPM은 SQL Plan 변경을 추적하고, 계획 고정을 통해 성능 저하를 방지합니다.&lt;br /&gt;
&lt;br /&gt;
5.1 SQL Plan 고정(Baseline 생성)&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
  DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(sql_id =&amp;gt; &amp;#039;SQL_ID값&amp;#039;);&lt;br /&gt;
END;&lt;br /&gt;
&lt;br /&gt;
5.2 SQL Plan 변경 감지&lt;br /&gt;
&lt;br /&gt;
	•	DBA_SQL_PLAN_BASELINES를 주기적으로 확인하여 새로운 Plan이 등록되었는지 확인합니다.&lt;br /&gt;
&lt;br /&gt;
SELECT sql_handle, plan_name, plan_hash_value, enabled&lt;br /&gt;
FROM dba_sql_plan_baselines&lt;br /&gt;
WHERE sql_handle = &amp;#039;SQL_HANDLE값&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
6. SQL Plan 변경 이력 비교&lt;br /&gt;
&lt;br /&gt;
	•	DBMS_XPLAN.DISPLAY를 사용해 현재 Plan과 이전 Plan을 비교.&lt;br /&gt;
&lt;br /&gt;
예제: 실행 계획 출력&lt;br /&gt;
&lt;br /&gt;
-- 현재 실행 계획 출력&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(sql_id =&amp;gt; &amp;#039;SQL_ID값&amp;#039;));&lt;br /&gt;
&lt;br /&gt;
-- 저장된 계획 출력&lt;br /&gt;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_AWR(&amp;#039;SQL_ID값&amp;#039;, plan_hash_value =&amp;gt; &amp;#039;PLAN_HASH값&amp;#039;));&lt;br /&gt;
&lt;br /&gt;
7. SQL Plan 비교를 위한 사용자 정의 스크립트&lt;br /&gt;
&lt;br /&gt;
	•	실행 계획의 주요 요소를 비교하는 스크립트를 작성.&lt;br /&gt;
&lt;br /&gt;
예제: 실행 계획 주요 요소 비교&lt;br /&gt;
&lt;br /&gt;
SELECT a.operation, a.options, a.object_name, a.object_type&lt;br /&gt;
FROM dba_hist_sql_plan a&lt;br /&gt;
WHERE a.sql_id = &amp;#039;SQL_ID값&amp;#039;&lt;br /&gt;
AND a.plan_hash_value IN (&amp;#039;PLAN_HASH1&amp;#039;, &amp;#039;PLAN_HASH2&amp;#039;)&lt;br /&gt;
ORDER BY a.id, a.position;&lt;br /&gt;
&lt;br /&gt;
8. SQL Monitoring 활용&lt;br /&gt;
&lt;br /&gt;
	•	Oracle Real-Time SQL Monitoring으로 SQL Plan 변경 시점 감지.&lt;br /&gt;
&lt;br /&gt;
예제: 실시간 SQL Plan 확인&lt;br /&gt;
&lt;br /&gt;
SELECT sql_id, plan_hash_value, status&lt;br /&gt;
FROM v$sql_monitor&lt;br /&gt;
WHERE sql_id = &amp;#039;SQL_ID값&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
9. 플랜 변경 자동화 감지&lt;br /&gt;
&lt;br /&gt;
	•	PL/SQL 프로시저를 활용해 주기적으로 Plan을 감지하고 로그를 남기거나 알림을 설정.&lt;br /&gt;
&lt;br /&gt;
BEGIN&lt;br /&gt;
  FOR rec IN (&lt;br /&gt;
    SELECT sql_id, COUNT(DISTINCT plan_hash_value) AS plan_count&lt;br /&gt;
    FROM dba_hist_sql_plan&lt;br /&gt;
    GROUP BY sql_id&lt;br /&gt;
    HAVING COUNT(DISTINCT plan_hash_value) &amp;gt; 1&lt;br /&gt;
  ) LOOP&lt;br /&gt;
    DBMS_OUTPUT.PUT_LINE(&amp;#039;SQL_ID: &amp;#039; || rec.sql_id || &amp;#039; Plan Change Detected&amp;#039;);&lt;br /&gt;
  END LOOP;&lt;br /&gt;
END;&lt;br /&gt;
&lt;br /&gt;
10. Oracle Enterprise Manager(OEM) 활용&lt;br /&gt;
&lt;br /&gt;
	•	OEM을 통해 SQL Plan 변경을 실시간으로 추적하고 경고를 설정.&lt;br /&gt;
	•	SQL Monitoring 기능에서 SQL_ID를 등록하여 Plan 변경 시 알림을 받도록 설정.&lt;br /&gt;
&lt;br /&gt;
요약&lt;br /&gt;
&lt;br /&gt;
	•	SQL Plan 변경 감지의 핵심 요소:&lt;br /&gt;
	1.	SQL_ID와 PLAN_HASH_VALUE를 기준으로 변경 추적.&lt;br /&gt;
	2.	AWR 및 SPM을 활용하여 히스토리 관리.&lt;br /&gt;
	3.	Baseline을 사용해 안정적인 Plan 유지.&lt;br /&gt;
	4.	DBMS_XPLAN과 모니터링 스크립트를 사용해 변경 비교.&lt;br /&gt;
	5.	OEM 및 SQL Monitoring을 통한 실시간 감지.&lt;br /&gt;
&lt;br /&gt;
이러한 방법을 통해 실행 계획 변경을 효과적으로 추적하고 데이터베이스 성능 문제를 사전에 방지할 수 있습니다.&lt;/div&gt;</summary>
		<author><name>Oracle</name></author>
	</entry>
</feed>