database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 26668 게시물 읽기
No. 26668
v$sqltext 에 대해서...
작성자
까먹지마(까먹지마)
작성일
2006-05-07 21:24:45
조회수
5,277

v$sqltext 테이블에는 어떤 정보들이 들어가 있는 건가요 ?

칼럼을 보니까...

ADDRESS, HASH_VALUE, COMMAND_TYPE, PIECE, SQL_TEXT 가 있는데요...

클라이언트에서 서버로 날린 쿼리가 오라클 서버의 메모리에 일정한 영역에 저장된다는 의미인가요 ?

 

그렇다면, 클라이언트에서 무한대로 서로 다른 쿼리를 날렸을 경우에는...

메모리 영역이 모자랄 수 있는데, 이럴 때 오라클은 어떤 오류 메시지를 표시하고...

오라클 서버를 다시 기동하지 않고, 메모리 영역을 초기화 할수 있는 방법이 있는지요 ?

이 글에 대한 댓글이 총 5건 있습니다.

 

사용자가 수행한 SQL 쿼리는 Shared Pool에 파싱 정보등과 함께 저장됩니다.

ADDRESS 부분에 주소가 나와있죠?

오라클이 사용하는 메모리내에서의 상대 주소를 나타냅니다.

해당 위치로 메모리 덤프 해보시면 해당 데이터를 볼수 있죠.

 

물론, 중복된 쿼리면 메모리의 내용을 그대로 가져오기 때문에 관계 없지만..

말씀 하신것 처럼 서로 다른 쿼리가 많이 수행되어 메모리 영역이 부족하게 되면,

LRU 방식에 의해 예전 데이터는 삭제가 됩니다.

그러므로, 오류 같은 것은 나타내지 않습니다.

 

v$sqltext 뷰 보다는 v$sqlarea나 v$sql 뷰를 보세요. 좀 더 보기 쉽고 더 상세한 정보를 얻을수 있습니다.

 

그리고..해당 SQL문이 저장된 공유 풀을 비우시고 싶으시다면, 다음의 명령문을 쳐주세요.

ALTER SYSTEM FLUSH SHARED_POOL;

 

김병두(kirio1)님이 2006-05-08 09:09:31에 작성한 댓글입니다.

shared pool에 메모리가 부족할경우 ora-04031 에러를 발생시키면서

db 성능이 느려집니다.

 

이런경우는 대부분 1회성 sql 때문이며 매번 hard parsing을 하기 때문입니다.

 

이경우 메모리를 flush 시켜주는 방법이 있긴한데 그것 보다는 application을 수정하여 sql 문이 bind 변수를 사용 하게끔 해주는것이 좋습니다.

 

메모리 flush 명령어는 다음과 같습니다.

 

alter system flush shared_pool;

 

입니다.

나그네님이 2006-05-08 09:11:15에 작성한 댓글입니다. Edit

두 분의 답변글 정말 감사 드려요 ^^

요즘 모처럼 오라클에 다시 관심이 붙게 되었는데...

확실히 오라클 서버의 메카니즘을 이해하는 것이 오라클을 제대로 이해하는 것 같은 생각이 듭니다.

 

두분의 답변중에 이견이 있던데요...

Shared Pool 영역이 한계치에 오게 되면, 한분은 LRU방식에 의해서 최근에 사용되지 않은 데이터가 삭제 되고, 그러므로 오류가 발생하지 않는 다고 하셨고...

다른 한분은 ora-04031 에러를 발생시키면서 db 성능이 느려진다고 하셨는데...

 

어느 분이 말씀이 정확한지는 모르겠지만, 두 분도 각자의 경험에서 답글을 주셨기에 어쨋든 정말로 감사 드립니다.

 

한가지 답글중에서 좀더 구체적으로 여쭤 보고 싶은게 있어서요.

ADDRESS 부분에 주소가 오라클이 사용하는 메모리내에서의 상대 주소이고, 해당 위치로 메모리 덤프를 해 보면 해당 데이터를 볼 수 있다고 하셨는데요 ;;

 

메모리 덤프를 어떻게 하는건지요 ;;

현재 Window XP Professional 환경에서 NT용 오라클 9i를 설치해서 운영 중이 거든요...

메모리 덤프를 한 내용을 보면, 왠지 고수의 길에 한 걸음 더 나아간 기분이 들 것 같아요 ^^

까먹지마(까먹지마)님이 2006-05-08 10:06:17에 작성한 댓글입니다.

공유 풀의 할당과 재사용에 대한 오라클 매뉴얼의 일부입니다.

------------------------------------------------------------

 

In general, any item (shared SQL area or dictionary row) in the shared pool remains until it is flushed according to a modified LRU algorithm. The memory for items that are not being used regularly is freed if space is required for new items that must be allocated some space in the shared pool. A modified LRU algorithm allows shared pool items that are used by many sessions to remain in memory as long as they are useful, even if the process that originally created the item terminates. As a result, the overhead and processing of SQL statements associated with a multiuser Oracle system is minimized.

김병두(kirio1)님이 2006-05-08 19:23:16에 작성한 댓글입니다.

그리고 전 블록 덤프를 dumpmem 이란 프로그램을 씁니다(찾아보세요)

오라클 내에서 메모리 덤프 하는 기능이 있는걸로 아는데..사용법을 잘 모르겠더군요..

다음과 같이 하면 됩니다.

 

SQL> select address,sql_text from v$sqlarea where rownum=1;

ADDRESS
--------
SQL_TEXT
----------------------------------------------------------------------------------------------------
13645E08
BEGIN       /* NOP UNLESS A TABLE OBJECT */       IF dictionary_obj_type = 'TABLE' AND sys.dbms_cdc_
publish.active > 0       THEN         sys.dbms_cdc_publish.change_table_trigger(dictionary_obj_owner
,dictionary_obj_name,sysevent);       END IF;       END;

 

address 에 13645E08 이 나오죠?

다음 처럼 명령을 내리고 내용을 보면

dumpmem oracle.exe:1600 0x13645E08-0x13645E12 aa.dmp

 

 

00000000h: F0 F8 D6 13 F0 F8 D6 13 10 5E 64 13 10 5E 64 13 ; 淙?淙?.^d..^d.
00000010h: 18 5E 64 13 18 5E 64 13 20 5E 64 13 20 5E 64 13 ; .^d..^d. ^d. ^d.
00000020h: 28 5E 64 13 28 5E 64 13 30 5E 64 13 30 5E 64 13 ; (^d.(^d.0^d.0^d.
00000030h: 38 5E 64 13 38 5E 64 13 00 00 01 50 00 00 00 00 ; 8^d.8^d....P....
00000040h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000050h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
00000060h: 00 00 00 00 01 00 00 00 00 00 01 00 00 00 00 00 ; ................
00000070h: A8 5E 64 13 00 00 00 00 20 5D 64 13 01 00 00 00 ; ?d..... ]d.....
00000080h: 00 00 00 00 00 00 00 00 90 5E 64 13 90 5E 64 13 ; ........?d.?d.
00000090h: 00 00 00 00 9C 5E 64 13 9C 5E 64 13 00 00 00 00 ; ....?d.?d.....
000000a0h: FE 9D F0 D0 00 00 00 00 00 00 00 00 00 00 00 00 ; ?爪............
000000b0h: 01 00 00 00 00 00 00 00 00 78 6A 05 08 09 18 19 ; .........xj.....
000000c0h: 00 00 00 00 00 00 00 00 01 01 00 00 00 00 00 00 ; ................
000000d0h: 00 00 00 00 42 45 47 49 4E 0A 20 20 20 20 20 20 ; ....BEGIN.     
000000e0h: 2F 2A 20 4E 4F 50 20 55 4E 4C 45 53 53 20 41 20 ; /* NOP UNLESS A
000000f0h: 54 41 42 4C 45 20 4F 42 4A 45 43 54 20 2A 2F 0A ; TABLE OBJECT */.
00000100h: 20 20 20 20 20 20 49 46 20 64 69 63 74 69 6F 6E ;       IF diction
00000110h: 61 72 79 5F 6F 62 6A 5F 74 79 70 65 20 3D 20 27 ; ary_obj_type = '
00000120h: 54 41 42 4C 45 27 20 41 4E 44 20 73 79 73 2E 64 ; TABLE' AND sys.d
00000130h: 62 6D 73 5F 63 64 63 5F 70 75 62 6C 69 73 68 2E ; bms_cdc_publish.
00000140h: 61 63 74 69 76 65 20 3E 20 30 0A 20 20 20 20 20 ; active > 0.    
00000150h: 20 54 48 45 4E 0A 20 20 20 20 20 20 20 20 73 79 ;  THEN.        sy
00000160h: 73 2E 64 62 6D 73 5F 63 64 63 5F 70 75 62 6C 69 ; s.dbms_cdc_publi
00000170h: 73 68 2E 63 68 61 6E 67 65 5F 74 61 62 6C 65 5F ; sh.change_table_
00000180h: 74 72 69 67 67 65 72 28 64 69 63 74 69 6F 6E 61 ; trigger(dictiona
00000190h: 72 79 5F 6F 62 6A 5F 6F 77 6E 65 72 2C 64 69 63 ; ry_obj_owner,dic
000001a0h: 74 69 6F 6E 61 72 79 5F 6F 62 6A 5F 6E 61 6D 65 ; tionary_obj_name
000001b0h: 2C 73 79 73 65 76 65 6E 74 29 3B 0A 20 20 20 20 ; ,sysevent);.   
000001c0h: 20 20 45 4E 44 20 49 46 3B 0A 20 20 20 20 20 20 ;   END IF;.     
000001d0h: 45 4E 44 3B 00 00 00 00 31 01 00 80 EC 5D 64 13 ; END;....1..d.
000001e0h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................
000001f0h: 18 00 08 00 98 9E DB 13 98 9E DB 13 04 60 64 13 ; ....삛?삛?.`d.
00000200h: 04 60 64 13 0C 60 64 13 0C 60 64 13 14 60 64 13 ; .`d..`d..`d..`d.
00000210h: 14 60 64 13 1C 60 64 13 1C 60 64 13 24 60 64 13 ; .`d..`d..`d.$`d.
00000220h: 24 60 64 13 2C 60 64 13 2C 60 64 13 00 00 00 02 ; $`d.,`d.,`d.....

 

위 처럼 SQL_TEXT에 나오는게 보이실 겁니다. 그럼 ^^

 

 

Dictionary View, Dynamic Performance View, 세그먼트 헤더 블록 구조, 데이터 블록의 헤더, ITL과 로우 Locking의 원리, Free Space 관리 방법, Extent 공간 광리 방법, Undo Segment의 구조와 Read Consistency의 원리 등등 많은 오라클 internal에 대한 이슈가 있습니다.

 

 

 

저 부분들을 공부 하시다 보면 그냥 글로만 보고 이해 했던 원리들이 눈에 보이게 됩니다.

실제 V$SQLAREA란 다이나믹 퍼포먼스 뷰도 X$ 로 시작하는 기본 테이블을 호출하는 거죠.

그 테이블은 위 처럼 메모리의 특정한 부분을 읽어 오는 역할을 합니다.

위와 같은 특별한 사실들을 많이 알 수 있게 되죠..

생각 있으심 한번 해 보심이~

김병두(kirio1)님이 2006-05-08 19:31:31에 작성한 댓글입니다.
이 댓글은 2006-05-08 19:50:51에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
26673오라클에서 숫자만 검색할려면 어떻게 하나요??? [2]
문상옥
2006-05-08
4652
26670imp 할 때 error가 발생합니다. [1]
이수정
2006-05-08
2550
26669select 하면 테이블이 없다고 나옴... [1]
^^
2006-05-08
1076
26668v$sqltext 에 대해서... [5]
까먹지마
2006-05-07
5277
26667데이타 합해서 정리하는거 질문 좀... [4]
이진웅
2006-05-07
1703
26666트리거에서 where문에 만족하는 값이 없는경우... [6]
김종욱
2006-05-07
3589
26665date 형식 비교하는 방법? [2]
이진웅
2006-05-07
3303
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2018 DSN, All rights reserved.
작업시간: 0.075초, 이곳 서비스는
	PostgreSQL v10.4로 자료를 관리합니다