ORACLE/ADMIN2009. 3. 13. 16:24
반응형
딕셔너리뷰에서
USER_SEGMENTS 에서 확인할수 있습니다.

SELECT SEGMENT_NAME, BYTES FROM USER_SEGMENTS where SEGMENT_TYPE=''TABLE''
에서 점유용량을 확인할수 있습니다.

//////////////////////////////////////////////////////////////////////////////////

위 delri님의 방법은 해당 Table에 할당되어 있는 크기를 측정하는 방법이며
만일 Table에 공간 할당은 되었으나 아직 (전혀)사용되지 않은 공간을 제외한 실
제 사용되고 있는
공간을 확인하실려면(즉 HWM 아래 공간)...

1. 해당 table을 analyze 해서

analyze table t_name compute statistics;

2. 해당 table의 blocks를 구한다.

select blocks from dba_tables where table_name =''T_NAME'';

==> blocks +1(segment header block) 이 해당 table이 사용중인 db block 갯수


위 계산에서 물론 사용된 후 delete에 의해 현재 완전히 비어 있는 block도 사용
고 있는 block으로 인식
하므로 완전히 비어 있는 block을 제거하기 위해서는
oracle8 이상인 경우 rowid는 아래처럼 구성되어 있기때문에

object fil block row
------ --- ------ ---
AAABPW AAF AAAAv1 AAA

1. select count(*)
from (select substr(rowid,1,15) from test group by substr(rowid,1,15) );
하면..HWM아래 할당은 되었지만 완전히 비어 있는 block을 빼고 조금이라도 사
용된 block의 갯수만 구함





예제)

1* analyze table costs compute statistics
SQL> /

Table analyzed.

SQL> select blocks from user_tables where table_name=''COSTS'';

BLOCKS
----------
2924 <---HWM 아래 block갯수


1 select count(*)
2 from
3* (select substr(rowid,1,15) from costs group by substr(rowid,1,15))
SQL> /

COUNT(*)
----------
2506 <---HWM 아래 block중 사용중인 block갯수

** 정리하면

Table의 공간(크기)이란 아래 3가지 관점에서 값이 다를수 있습니다.

1. 해당 Table에 할당된 크기
-Table에 할당되었지만 사용중 또는 미사용공간 전부 포함

2. HWM 아래 크기
- 할당된 공간중에서 full table scan시 검색하는 부분까지만의 크기
- 즉 HWM이후 공간은 아직 한번도 사용이 안된 new Block임.

3. HWM 아래중 완전히 비어 있는 block을 제외한 크기
- delete에 의해 block전체가 비어 있는 block을 제외한 크기

//////////////////////////////////////////////////////////////////////////////////

위의 HUMAN21님말대로 USER_SEGMENTS 의 BYTES는 실데이타 공간이 아니라 할당영
역을 나타냅니다.. 빈 블럭도 포함이 되는거죠..
만일 UNUSED 블럭을 제외한 실제 데이타 공간을 구하려면..아래와 같
이 구하시면 될것 같네요

select table_name, GREATEST(4, ceil(num_rows /
((round(((8192 - (ini_trans * 23)) *
((100 - pct_used) /100)) / avg_row_len)))) *
8192)/1024/1024
TableSize_Mbytes
from user_tables


위에서 8192 는 SHOW PARAMETER 의 DB_BLOCK_SIZE 입니다.
위의 문을 정확히 하기위해서는 ANALYZE TABLE은 꼭 해주셔야지 정확한 값이 구해지겠죠..


펌질한곳 : http://otn.oracle.co.kr/forum/forum_open_view.jsp?forum_seqno=20040907205724&forum_cate=ORCL
반응형

'ORACLE > ADMIN' 카테고리의 다른 글

index 정보 조회  (1) 2009.03.20
em 삭제하고 재 설치  (0) 2009.03.19
유용한 DICTIONARY 뷰 ..  (0) 2009.03.06
PCTFREE, PCTUSED  (0) 2009.02.25
oracle em 구성  (0) 2009.02.12
Posted by [PineTree]
OS2009. 3. 13. 14:59
반응형

Tuning TCP/IP TIME_WAIT For Systems With High Connection Rates
Applies To: VDE / DFE / DSE (all versions, all operating systems)

Description: When using the "netstat" command to look at open TCP/IP connections, a large number of connections in the TIME_WAIT state are observed. The system exhibits poor throughput possibly coupled with high CPU use on the VDE/DFE/DSE server.

TCP uses a special handshake to close completed sessions. The TIME_WAIT state is used to handle possible problems that may occur in the network relating to unreliable or delayed packet delivery. Accordingly, TCP holds connections for a temporary waiting period (TIME_WAIT) to ensure that any delayed packets are caught and not treated as new connection requests. The size of TIME_WAIT is supposed to be twice the maximum segment lifetime or twice the time a packet can remain alive on a particular IP network. For some operating systems, this can be as high as 4 minutes!

On busy systems, this can lead to a depleation of TCP port resources. Low throughput may occur due to many connections sitting in TIME_WAIT state.

Explanation/Workaround: OctetString recommends reducing the operating system setting for TIME_WAIT substantially. If VDE / DFE / DSE is the only server product on the system, this can be reduced to the operating system minimum of 15 or 30 seconds (depending on OS).

For Windows:
Use regedit and create a REG_DWORD named TcpTimedWaitDelay under

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TcpIp\Parameters

Set it to a decimal value of 30 which is for 30 seconds - the minimum.

For AIX:
To see the current TCP_TIMEWAIT value, run the following command:
/usr/sbin/no 뻕 | grep tcp_timewait

To set the TCP_TIMEWAIT values to 15 seconds, run the following command:
/usr/sbin/no 뻩 tcp_timewait =1

The tcp_timewait option is used to configure how long connections are kept in the timewait state. It is given in 15-second intervals, and the default is 1.

For Linux:
Set the timeout_timewait paramater using the following command:
/sbin/sysctl -w net.ipv4.vs.timeout_timewait=30

This will set TME_WAIT for 30 seconds.

For Solaris:
Set the tcp_time_wait_interval to 30000 milliseconds as follows:
/usr/sbin/ndd -set /dev/tcp tcp_time_wait_interval 30000


=================================================================================================

WebSphere Commerce Payments -고성능 환경의 조정
각 비즈니스 모델은 고유한 요구사항을 가지므로 WebSphere Commerce Payments 기능을 다소 다르게 이용합니다. 종종 주어진 비즈니스 환경에 대해 성능과 기능성을 극대화하기 위해 WebSphere Commerce Payments를 조정할 수 있습니다.

TCP/IP 소켓에 대한 대기 시간
WebSphere Commerce Payments에 대한 각 요청 시에 TCP 소켓이 TIME_WAIT 상태가 되고 몇 분 동안 해당 상태에 머물게 됩니다. 다량의 요청을 서비스하는 시스템의 경우, 다수의 소켓이 TIME_WAIT 또는 TIME_CLOSED 상태에 있으므로 요청이 거부됩니다(예: Cannot connect to WebSphere Commerce Payments 리턴 코드). 이 행위는 모든 TCP를 연결하는 데 예상된 것으로 반드시 필요합니다.

TCP 소켓은 소켓에서의 모든 차후 통신이 새로 바운드되는 소켓에 대한 새 통신으로 오해되지 않도록 보장하기 위해 일정한 시간 동안 TIME_WAIT 상태로 이동합니다. 이 시간은 이론적으로 2MSL(최대 세그먼트 수명의 두 배)입니다. 실제로는 TIME_WAIT 기본값이 Windows 운영체제 및 Solaris에서는 4분이고 AIX에서는 2분입니다. iSeries 시스템에서 기본값은 약 2분입니다. 사용자 운영체제에서 TIME_WAIT 값을 변경하면 대용량 사용자가 이러한 문제점을 줄일 수 있습니다. 다음은 Windows, AIX 및 Solaris 운영체제에서 간격을 재구성하는 방법의 예입니다.

예외:

대체 스택이 사용 중일 경우, 다른 방법이 필요할 수 있습니다.


레지스트리에서 다음을 찾으십시오.
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\tcpip\Parameters
\TcpTimeWaitDelay
이 항목이 Windows 레지스트리에 없는 경우, 아래 2단계에 따라서 항목을 작성해야 합니다.

이 항목을 새 DWORD 항목으로 편집하십시오
항목을 30 - 300(값은 초 수를 표시함) 범위의 임의의 값을 설정하십시오. 이 값을 30으로 설정할 것을 권장합니다.

no -o tcp_timewait=1
값(1)의 증가 단위는 15초입니다. 예를 들어, 1은 15초이고 2는 30초에 해당합니다. 값을 1 또는 2로 설정하는 것이 바람직합니다.


ndd -set /dev/tcp tcp_close_wait_interval 30000
값(30000)의 단위는 밀리초입니다.

관련 태스크

WebSphere Commerce Payments 성능 조정 매개변수
피드백

(C) Co/pyright IBM Corporation 1996, 2004.

=======================================================================

Windows 2000 server에서 가능합니다.

물론, 다른 버젼에서도 가능하겠지만, 제가 확인해본 곳이 W2K Server입니다.

System Registry중 TcpIp 옵션 설정에 SynAttackProtect항목을 추가할 수 있습니다.


-------------------------------- Registry File --------------------------------

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters]
"SynAttackProtect"=dword:1
"KeepAliveInterval"=dword:3e8
"KeepAliveTime"=dword:493e0

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

여기에서 첫 번째 SynAttack Protect가 바로 Syn Flood Attack 방지 옵션을 활설화할 것인지를

결정짓는 것입니다.

다음으로 KeepAliveInterval값은, Tcp에서 Keep Alive 옵션을 사용할 경우 Keep alive packet을

전송하는 시간 간격을 의미합니다.

마지막 KeepAliveTime은 Keep alive packet이 수신되어야 하는 시간의 최대 값을 의미합니다.

결국 KeepAliveInterval값보다는 큰 값으로 설정해야겠죠.

출처 : http://ariswear.com/new_blog/entry/Socket-TIMEWAIT-%EB%8C%80%EA%B8%B0%EC%8B%9C%EA%B0%84-%EC%84%A4%EC%A0%95-%EB%B3%80%EA%B2%BD%ED%95%98%EA%B8%B0?category=10&TSSESSIONariswearcomnewblog=78e085655f2789d73cdf9d485de8552f
반응형

'OS' 카테고리의 다른 글

OS별 NTP 설정  (0) 2010.01.07
find, grep을 조합한 검색  (0) 2009.01.07
Posted by [PineTree]
OS/LINUX2009. 3. 13. 14:49
반응형

Linux 성능 조정

서버의 성능을 향상시키기 위해 Linux 시스템을 사용자 정의해야 할 수 있습니다. 구성을 조정하는 데 필요한 팁이 아래에 나와 있습니다. 이러한 시스템이 변경되어 다음 제안을 사용하지 못하게 될 수 있으며 결과가 다를 수 있습니다.

성능 향상을 위해 변경사항을 작성하기 전에 현재 성능을 측정했는지 확인하십시오. 트랜잭션 비율, 응답 시간, 최대 동시 사용자 수 또는 몇몇 기타 성능 기준에 관심이 있는지 여부에 관계없이 변경사항 작성 전후에 성능 조정 매개변수 변경으로 인해 차이가 발생했는지 여부를 알 수 있을 정도로 정확하게 측정해야 합니다.

timeout_timewait 매개변수

timeout_timewait 값은 TCP/IP가 닫힌 연결을 해제하여 자원을 다시 사용하기 전에 경과되어야 하는 시간을 결정합니다. 닫기와 해제 사이의 이 간격은 TIME_WAIT 상태 또는 최대 세그먼트 지속 시간의 두배(2MSL) 상태로 알려져 있습니다. 이 시간 동안 클라이언트 및 서버로의 연결을 다시 여는 것이 새 연결을 설정하는 것보다 비용이 적게 듭니다. 이 항목의 값을 줄이면 TCP/IP는 닫힌 연결을 더욱 빨리 해제할 수 있으며 새 연결에 더 많은 자원을 제공합니다. TIME_WAIT 상태에 있는 여러 연결로 인해 발생한 낮은 처리량 때문에 실행 중인 응용프로그램에 빠른 해제, 새 연결 작성 또는 조정이 필요할 경우 이 매개변수를 조정하십시오.

기본값은 240초(4분)입니다.

최소 권장 값은 30초입니다. 다음 프로시저를 사용하여 값을 보거나 사용자 정의하십시오.

echo X > /proc/sys/net/ipv4/tcp_fin_timeout

여기서 X는 필요한 시간(초)으로 바뀝니다.

연결 백로그

수신 연결 요청의 버스트를 승인하기 위해 연결 백로그 값을 늘려야 할 수 있습니다. 동시에 많은 연결 요청이 수신될 경우 더 큰 값을 사용하면 지원될 수 있는 보류 연결 수가 증가되어 연결 장애를 줄일 수 있습니다.

다음 프로시저를 사용하여 값을 보거나 사용자 정의하십시오.

echo X > /proc/sys/net/core/netdev_max_backlog
echo X > /proc/sys/net/core/somaxconn

여기서 X는 버스트에서 예상되는 연결 요청 수보다 큽니다.

tcp_keepalive_time

tcp_keepalive_time 값은 TCP/IP가 대기 연결이 계속 원래 상태를 유지하는지 확인을 시도하는 빈도를 제어합니다. 이 시간 동안 활동이 없었을 경우 활성화 상태 지속 전송이 제출됩니다. 네트워크가 원래 상태를 유지하며 상대가 활성 상태일 경우 상대가 응답합니다. 손실된 상대에 대해 민감하게 되려는 경우(즉, 상대가 손실되었음을 더 빨리 인식해야할 경우) 이 값을 줄여 보십시오. 오랜 기간 동안 비활성 상태를 유지하는 연결은 공통이고 손실된 상대는 공통이 아닐 경우 이 값을 늘려 오버헤드를 줄여도 됩니다.

7,200초(2시간) 동안 대기 연결이 비활성 상태일 경우 Linux에서는 활성화 상태 지속 메시지를 전송하는 것이 기본값입니다. 종종 값에 1,800초를 선택하여 반쯤 닫힌 연결을 30분마다 감지합니다.

다음 프로시저를 사용하여 값을 보거나 사용자 정의하십시오.

echo X > /proc/sys/net/ipv4/tcp_keepalive_time

여기서 X는 필요한 시간(초)으로 바뀝니다.

tcp_keepalive_intvl 값

tcp_keepalive_intvl 값은 상대로부터 활성화 상태 지속 응답이 수신되지 않을 경우 TCP/IP에서 활성화 상태 지속 전송을 반복하는 빈도를 결정합니다. 응답이 없는 연속적인 활성화 상태 지속 전송 수가 tcp_keepalive_probes의 값을 초과할 경우 연결이 중단됩니다. 응답 시간이 길 것으로 예상될 경우 이 값을 늘려 오버헤드를 줄여야 할 수 있습니다. 상대가 손실되었는지 확인하는 데 소비되는 시간을 줄여야 할 경우 이 값 또는 tcp_keepalive_probes 값을 줄여 보십시오.

Linux에서는 활성화 상태 지속 메시지를 재전송하기 전에 75초 동안 활성화 상태 지속 응답을 대기하는 것이 기본값입니다. 종종 값에 15초를 선택하여 손실된 상대를 더 빨리 감지합니다.

다음 프로시저를 사용하여 값을 보거나 사용자 정의하십시오.

echo X > /proc/sys/net/ipv4/tcp_keepalive_intvl

여기서 X는 필요한 시간(초)으로 바뀝니다.

tcp_keepalive_probes 값

tcp_keepalive_probes 값은 TCP/IP가 기존 연결에 대한 수신확인되지 않은 활성화 상태 지속 메시지를 재전송하는 횟수를 결정합니다. 네트워크 품질이 낮을 경우 이 값을 늘려 효과적인 통신을 유지해야 할 수 있습니다. 네트워크 품질이 높을 경우 이 값을 줄여 상대가 손실되었는지 확인하는 데 걸리는 시간을 줄여도 됩니다.

Linux에서는 연결 중단을 결정하기 전에 9개의 수신확인되지 않은 활성화 상태 지속 메시지를 전송하는 것이 기본값입니다. 종종 값에 5를 선택하여 손실된 상대를 더 빨리 감지합니다.

다음 프로시저를 사용하여 값을 보거나 사용자 정의하십시오.

echo X > /proc/sys/net/ipv4/tcp_keepalive_probes

여기서 X는 필요한 수신확인되지 않은 활성화 상태 지속 재전송 수로 바뀝니다.

대용량 페이지 지원

가 상 기억장치를 관리하기 위해 대용량 페이지 지원을 사용하면 JVM(Java Virtual Machine)에서 대용량 힙을 관리하는 CPU 오버헤드를 줄일 수 있습니다. 이 지원을 사용하려면 대용량 페이지를 사용 가능하도록 시스템을 구성하고 가상 시스템을 시작할 때 -Xlp JVM 옵션을 지정해야 합니다.

대용량 페이지 지원을 사용 가능하게 하는 단계는 사용하는 Linux 분배에 따라 다릅니다. 일반적으로 sysctl.conf 파일을 편집하여 다음을 수행합니다.

  • 최대 Java 힙을 보유하는 데 필요한 대용량 페이지의 수 설정
  • 최대 Java 힙을 보유하도록 최대 공유 세그먼트 설정
  • 최대 Java 힙을 보유하도록 공유 메모리 총량 설정

그런 다음 프로그램을 낮은 가상 메모리 주소로 재배치하여 더 큰 힙에 더 많은 주소 공간을 제공하십시오.

대용량 페이지에 대한 지원 구성에 대한 자세한 정보는 Linux 문서를 참조하십시오.

반응형

'OS > LINUX' 카테고리의 다른 글

RedHat Linux Network 설정하기  (0) 2009.10.29
LINUX SWAP파일 추가하기  (0) 2009.09.07
RHEL 4 에 YUM 설치  (0) 2009.02.10
LINUX 해킹당했을 때 대처요령  (0) 2008.11.17
RPM src install  (0) 2008.06.24
Posted by [PineTree]
OS/WINDOWS2009. 3. 13. 14:45
반응형

Configuring Windows for high network connection rates

When a TCP/IP socket is closed, it goes into TIME_WAIT state before closing, for a period of time determined by the operating system. A socket in TIME_WAIT state cannot be reused; this can limit the maximum rate at which network connections can be created and disconnected.

The Java Client application normally closes the socket; if the application is on a different machine from the CICS Transaction Gateway, the limitation usually applies to the machine running the application. The symptoms of a machine that is reaching these limits include:

  • All of the TCP/IP resources of the operating system are in use, and requests for new connections fail. This causes JavaGateway open requests to fail intermittently, and throw a java.net.BindException.
  • Running the netstat -a command on the application machine shows a large number of sockets in TIME_WAIT state.
  • Performance deteriorates.

To improve the ability of the Windows operating system to deal with a high rate of network connections, add the following registry entries in

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters
TcpTimedWaitDelay
A DWORD value, in the range 30-300, that determines the time in seconds that elapses before TCP can release a closed connection and reuse its resources. Set this to a low value to reduce the amount of time that sockets stay in TIME_WAIT.
MaxUserPort
A DWORD value that determines the highest port number that TCP can assign when an application requests an available user port. Set this to a high value to increase the total number of sockets that can be connected to the port.

For example, a system making a large number of connection requests might perform better if TcpTimedWaitDelay is set to 30 seconds, and MaxUserPort is set to 32678. See the operating system documentation for more details.

반응형
Posted by [PineTree]
OS/HP-UX2009. 3. 13. 14:27
반응형

TIME_WAIT이 많이 발생하는 경우, 이 수치를 조절함으로서 해결가능

TIME_WAIT 설정 값 확인 기본 60000(60초)

# ndd -get /dev/tcp tcp_time_wait_interval<br /> <br />ex)TIME_WAIT 1초로 셋팅# ndd -set /dev/tcp tcp_time_wait_interval 1000
반응형

'OS > HP-UX' 카테고리의 다른 글

Glance  (0) 2009.01.21
HP-UX memory buffer 변경하는 방법  (0) 2009.01.20
[HP-UX ] 한글 입력하기.  (0) 2009.01.19
HP-UX Language 설정  (0) 2009.01.19
HP-UX NFS 설정하기  (0) 2009.01.19
Posted by [PineTree]
PineTree/T2009. 3. 12. 14:40
반응형
   -  Bermuda [Triangle]/ 서태지

(좋은 이 화음에 다 숨어둔 모순 속으로)
갓 빌린 소설처럼 짓궂은 질문처럼
뚜렷한 답을 해줄 수는 없겠지
이지러진 눈망울로도 넌 그저 아름다운
터질듯한 내 마음 속의 눈빛은 불현듯 한 질투
I’m going down

여린 심박이 서로 다른 템포를 맞추고 있고
천상에서 그대가 눈뜰때
좋은 화음처럼 이 비가 그칠때
까진 All night long All night long

이 밤에 이 엄숙한 비겁자의
하늘과 나의 섬들 사이에
좋은 화음 이 까만 밤의 향기로서 파도에
나 숨어든 그 모순 속으로
언젠가의 꿈속처럼 뒤틀린 데자뷰로
어느새 나는 Pathos를 만들고
그 가득한 망상들로 뒤섞인 까만 밤

그럴듯한 이야기 속의 모순들
가득한 삼각 원들
I`m falling down
두 눈가의 눈물을 넘어선 후 어른이 됐죠
천상에서 그대가 눈뜰때
좋은 화음처럼 이 비가 그칠때
까진 All night long All night long
이 밤에 이 엄숙한 비겁자의
하늘과 나의 섬들 사이에

이 성스러운 바다
뒤바뀐 섬 타락한 마음
아름다운 존재 이 모순된 밤
풀릴듯한 내 안의 퍼즐
Bermuda Triangle

- Juliet / 서태지

Save me now 문을 열어다오
나 그때 가장 깊은 사랑을 했는지 몰라
언어로는 결코 전해질 수 없는
너와 나의 저 웜홀에

나는 소망해 바람을 만끽한
그날의 그 표정으로 노래해줄게
너의 웃음소리가 울려 퍼지고
이름 모를 그 애틋한 언덕으로
너는 나에게 호기심 가득한
그 예쁜 목소리로 속삭여줄래
나만의 언어로 나를 안아 줘봐
그 애틋한 언덕위로

저 하늘로 올라간 파란 저 별들의 폭발로
내 기억들조차 사라지고 없지만
(내 마음을) 나를 뛰게 한 두근거림은
지금 어디에 너는 어디에

저 파란 언덕에 어느 날 갑자기
저 별들이 하나일 때 여기로 와줘
그 마음 그대로 너를 기다릴게
그 애틋한 언덕 위로

저 하늘로 올라간 파란 저 별들의 폭발로
내 기억들조차 사라지고 없지만
(내 마음을) 나를 뛰게 한 두근거림은
지금 어디에 너는 어디에 있는 거니

부랑하던 구름들도 사라지고
이 언덕위에 오류가(조작된 기억들과)
순간의 거짓이라 할지라도
너를 기억하는걸
내 진실과(이 작은 온도 차이가)
이 기적이 하늘 위로 퍼지는 날 들려주렴

Save me now 문을 열어다오
나 그때 가장 깊은 사랑을 했는지 몰라
언어로는 결코 전해질 수 없는
너와 나의 저 웜홀에

- Coma / 서태지

오랜 시간이 지나가 버렸지
어떻게 난 아무런 기억들이
나질 않는 걸까
수많던 저 인파들 속에서
본 적없는 저 낯선 풍경이
나를 노려보네

높게 올려 쌓은 담
이 단절 속의 난
나의 꿈에 거짓을 고한 이후
그 향긋했던 약속의
이 도피처로 돌아온 나는
단 하루도 편히 잠들지 못했는걸

그 누구도 I Can't Keep Going
아무튼 난 저 인파에

저 인파속에 난 어째서
다시 상처를 입을까
You See The Lie?
눈을 감은 채
무리 속을 나 홀로 걷고 있어

무력함
저 TV가 내게 약속할 때
어차피 난
아무런 말도 못한 채
그저 웃지

높게 올려 쌓은 담
이 단절 속의 난
나의 꿈에 거짓을 고한 이후
그 향긋했던 약속의
이 도피처로 돌아온 나는
단 하루도 편히 잠들지 못했는걸


반응형
Posted by [PineTree]
ORACLE/OWI2009. 3. 9. 10:08
반응형

OracleRDBMS에선 여러가지 Lock 메커니즘을 사용하고 있다.

주로 다음과 같은 것들이 있다.

 

 ・Latch
 ・엔큐

 ・분산 Lock

 ・글로벌 Lock (OPS/RAC)

 

이 문서에서는 이것들 중에서도 Latch에 중점을 두고 기술합니다.

OracleRDBMS에 있어서 Latch의 실상과 Latch경합의 원인에 대해 설명함으로써 각각의 경합의 튜닝을 할수 있습니다.

 

1. Latch란???

 

Latch란 SGA안에 공유 데이터 구성을 보호하는 저레벨의 직렬화 메커니즘이다. Latch의 실상은 플랫폼에 따라 다르다. Latch은 획득 및 해방이 단시간의 행해지는 종류의 락입니다. Latch는 통상 복수의 프로세스가 같은 처리를 동시에 실행 하는 일을 방지하기 위해서 사용됩니다. Latch를 보관 유지하고 있는 프로세스가 이상종료(ABEND)했을 경우 각 Latch 관련된 크린업 프로시져에 의해 해방된다. Latch에는 데드락이 발생하지 않게 하기 위한 레벨이 관련되어 있습니다. 프로세스가 어떤 레벨의 Latch을 획득하면 그것을 보관한 상태로 그 이하 레벨의 Latch를 요구할 수가 없습니다.

 

2. Latch와 엔큐

 

엔큐는 Latch와는 다른 락  메카니즘입니다. 엔큐는 동시에 복수의 프로세스가 여러가지 방법으로 자원을 공유하는 일을 가능하게 합니다. Latch와 비교해 정교한 메카니즘입니다. 엔큐의 대표적인 예는 테이블에 대한 락입니다. 1개의 테이블에 대해 복수의 프로세스가 공유 모드나 공유행 배타 모드등에서 동시에 락을 획득할 수 있습니다. 엔큐를 요구했을 때 요구하는 락 모드가 이미 그 자원에 대해서 다른 세션이 취득하고 있는 락 모드와 호환성이 없는 경우 나중에 락을 요구한 프로세스는 대기 하게 됩니다만, 그 경우는 FIFO(First-In-First-Out)의 큐 대기라 합니다.

 

Oracle8i까지의 버젼에서는 대부분의 Latch에 대해 획득을 대기할 때에 대기하는 프로세스가 어떤 간격으로 sleeve와 리트라이를 반복하는 구조로 되어 있었습니다. 복수의 프로세스가 같은 Latch를 대기하고 있는 경우 해방 후에 최초로 리트라이를 한 프로세스에 획득이 허가되므로 엔큐와 같이  FIFO로의 획득은 보증되지 않습니다.

Oracle9i 이후의 버젼에서는 대부분의 Latch가 큐를 사용한 대기를 실시하도록 변경되었기 때문에 엔큐와 같게 FIFO로의 획득이 보증됩니다. 다만 각 버젼 모두 일부의 Latch로 예외적인 대기 방법을 취하는 경우가 있습니다.

 

3. Latch을 획득할 필요가 있는 케이스

 

SGA내의 자원을 사용할 때 프로세스는 Latch를 획득해 자원을 사용하는 동안은 Latch를 계속 보관 유지해 자원의 사용을 끝내면 Latch은 해방됩니다. 각 Latch은 Latch명에 의해 식별되어 각각이 다른 자원을 보호합니다. Latch의 조작은"test and set"등의 atomic인 명령으로 실시합니다. 다른 프로세스가 획득한 Latch에 의해 보호되는 코드를 실행하기 위해서는 그 Latch이 해방될 때까지 대기할 필요가 있습니다. 예를 들면, redo allocation, redo copy, archive control등의 Latch에 의해서 로그·버퍼나 어카이브(archive)처등의 공유되는 데이터 구조에의 동시 액세스를 막을 수 있습니다.


Latch의 획득이나 해방이 atomic인 명령으로 행해지기 때문에 1개의 프로세스만이 Latch을 획득 하는 것이 보증되어 획득/해방도 고속으로 실행됩니다. Latch을 획득하고 있는 프로세스가 이상종료(ABEND) 했을 경우 PMON에 의해 Latch은 클린 업 됩니다.

 

4. Latch의 대기 방법

 

Latch의 요구는 willing-to-wait 와 no wait 의 2개의 모드로 행해집니다. 통상은 willing-to-wait 모드로 요구되어 Latch을 획득할 수 있을 때까지 대기합니다. no wait 모드는 다수 있는 Latch의 하나를 획득할 수 있으면 되는 경우 등에 행해져  획득할 수 없는 경우는 다른 Latch이 요구됩니다.

 

Oracle8i까지의 버젼에서는 willing-to-wait로 요구한 Latch이 이미 다른 프로세스에 의해 획득되고 있었을 경우 복수 CPU 환경에 있어서는 나중에 Latch을  요구한 프로세스는 CPU를 획득한 채로 내부적으로 설정되어 있는 최대 회수까지 리트라이를 반복합니다.이 리트라이의 처리를 스핀이라고 부릅니다. 최대 회수 까지 스핀을 반복해도 Latch을 획득할 수 없는 경우 프로세스는 CPU를 해방해 sleeve 합니다. 최초의 sleeve 시간은 100분의 1초로 시간이 되면 다시 CPU를 획득해 Latch 획득을 리트라이 합니다(여기에서도 복수 CPU 환경에서는 스핀을 실시합니다).획득할 수 없으면 다시 sleeve 합니다만, sleeve 시간은  1회마다 배로 증가해 갈 것입니다.스핀을 실시하는 것으로 CPU에 부하가 걸립니다만, 복수 CPU 환경인 프로세스가 스핀중에 다른 CPU를 사용해 Latch 해방을 할 가능성이 있으므로 이러한 처리를 합니다.


Oracle9i 이후의 버젼에서는 Latch 의 대기 방법이 변경되었습니다. willing-to-wait로 요구한 Latch 이 이미 다른 프로세스에 의해 획득되고 있는 경우 복수 CPU 환경에 있어 스핀의 처리를 실시하는 점은 같습니다만, 스핀으로 획득할 수 없는 경우는 그 Latch의 대기 리스트에 그 프로세스의 정보를 추가해 sleeve 합니다. Latch이 해방되면 대기 리스트의 선두 프로세스에 통지가 행해지게 되어 있습니다.

 

5.Latch의 경합을 확인하는 방법

 

Latch 경합의 상황은 V$LATCH 및 V$LATCH_CHILDREN로 파악할 수 있습니다. V$LATCH의 행은 Latch명 마다의 각종 통계 정보의 값이 됩니다. Latch안에는 같은 이름을 가지는 Latch가 복수 존재하는「부모와 자식 Latch」이라고 불리는 타입의 것이 있습니다. V$LATCH에서는 그러한 통계 정보의 합계가 표시됩니다만, V$LATCH_CHILDREN에는 각 자식 Latch 마다의 통계 정보가 표시됩니다.

 

V$LATCH / V$LATCH_CHILDREN 의 주된 예 (*1) 
  

 GETS  willing-to-wait 모드의 요구로 획득한 회수
 MISSES  willing-to-wait 모드의 요구로 획득을 시도하고 1번째의 획득에 실패한 회수
 SPIN_GETS  willing-to-wait 모드의 요구로 획득을 시도하고 1번째의 획득에 실패한 후 sleeve 하지 않고 스핀만으로 획득할 수 있던 회수   
 SLEEP1  willing-to-wait 모드의 요구로 획득을 시도하고 1번째의 획득에 실패한 후 1회 sleeve 해 획득할 수 있던 회수
 SLEEP2  willing-to-wait 모드의 요구로 획득을 시도하고 1번째의 획득에 실패한 후 2회 sleeve 해 획득할 수 있던 회수
 SLEEP3  willing-to-wait 모드의 요구로 획득을 시도하고 1번째의 획득에 실패한 후 3회 sleeve 해 획득할 수 있던 회수
 SLEEPS   willing-to-wait 모드의 요구로 획득을 시도하고 1번째의 획득에 실패한 후 sleeve 한 회수의 합계
 WAITERS_WOKEN  Latch 해방시에 대기하고 있는 프로세스에 통지한 회수
 WAIT_TIME  (9.0-) Latch 획득까지의 대기 시간의 합계
 IMMEDIATE_GETS  no wait 모드의 요구로 획득한 회수
 IMMEDIATE_MISSES  no wait 모드의 요구로 획득에 실패한 회수

 

※ SLEEP4 - SLEEP11는 사용되고 있지 않습니다.

 

(*1): 릴리스 9.0.1까지의 「데이타베이스·레퍼런스」에서는 GETS/MISSES가 「대기가 되었다」의 요구, IMMEDIATE_GETS/IMMEDIATE_MISSES가 「대기 없음」의 요구라고 기재되어 있습니다만  기술 미스입니다.

 

릴리스 9.2이후는 GETS가 「대기 가능 모드로 요구된 회수」라고 기재되어 있습니다. 대기 가능    (willing-to-wait) 모드에서는 획득할 수 있을 때까지 대기하므로, 요구 회수와 획득 회수는 최종적으로는 동일해집니다만 GETS가 카운트 되는 것은 대기 가능 모드로 요구해 획득된 시점이므로, 이 문서의 기술이 엄밀한 의미에서는 올바릅니다.

 

Latch 히트율의 계산방법


Latch 히트율(1번째의 획득 시행으로 획득할 수 있던 비율)은 다음의 식에서 계산할 수 있습니다.

 

willing-to-wait 모드의 히트율 : (GETS - MISSES) /GETS
no wait 모드의 히트율     : IMMEDIATE_GETS/(IMMEDIATE_GETS + MMEDIATE_MISSES)

 

V$LATCH / V$LATCH_CHILDREN 에 의한 Latch 경합의 파악 


Oracle8i까지의 버젼에서는 willing-to-wait 모드로 요구해 대기하는 경우 각 프로세스가 sleeve    와 리트라이를 반복하기 때문에 sleeve 회수의 합계인 SLEEPS나, SPIN_GETS/SLEEP1/SLEEP2/SLEEP3의 값의 분포가 경합의 상황을 파악하는데 도움이 됩니다. 단 shared pool, library cache, library cache load lock의 3 종류의 Latch에 대해서는 Oracle9i 이후같은 큐를 사용한 대기 방법을 취하므로 WAITERS_WOKEN를 경합의 지표로 합니다.

 

Oracle9i 이후의 버젼에서는 큐를 사용한 대기를 하므로, sleeve의 합계 회수만으로는 경합의 상황을 파악하기에 불충분합니다. 대기 시간을 나타낸  WAIT_TIME열이 추가되었으므로 이것을 지표로 합니다.

 


반응형

'ORACLE > OWI' 카테고리의 다른 글

Oracle Wait Event 모니터링  (0) 2009.12.02
OWI를 활용한 shared pool 진단 및 튜닝  (0) 2009.06.30
Oracle에서 Latch 가 성능 저하의 원인이 아닙니다  (0) 2009.03.01
Enqueue 와 Latch  (0) 2009.03.01
Direct path read  (0) 2009.02.08
Posted by [PineTree]
ORACLE/ADMIN2009. 3. 6. 14:03
반응형

DICTIONARY(DICT) 뷰

 - 데이터 사전 및 동적 성능 뷰에 대한 정보를 알고 싶으면 DICTIONARY 뷰나
    DICT_COLUMNS 뷰를 조회하면 됩니다.

 - 조회 할 수 있는 모든 데이터사전의 테이블이름과 설명을 조회 할 수 있습니다.
   물론 설명은 영문으로 되어 있습니다.

 - 동의어인 DICT를 이용해서도 똑같은 정보를 조회 할 수 있습니다.

SQL> SELECT * FROM DICTIONARY WHERE table_name LIKE ’%INDEX%’;

SQL> SELECT * FROM DICT WHERE table_name LIKE ’%INDEX%’;


DICT_COLUMNS 뷰

 - 뷰를 질의하면 해당 데이터사전의 컬럼에대한 정보를 조회 할 수 있습니다.

SQL> SELECT * FROM DICT_COLUMNS WHERE TABLE_NAME LIKE ’%INDEX%’;


데이터사전 조회 예제 1)

SQL>SELECT * FROM dict
        WHERE table_name LIKE UPPER(’%&데이타사전%’);


데이터사전 조회 예제 2)

SET LINESIZE 160
SET PAGESIZE 100
COLUMN TABLE_NAME FORMAT A25
COLUMN COLUMN_NAME FORMAT A30
COLUMN COMMENTS FORMAT A80 word_wrapped
 
SELECT *
FROM dict_columns
WHERE table_name LIKE UPPER(’%&데이터사전%’);

 

◈ 아래 데이터사전 정보는 인터넷 정보를 참고했습니다.

* 오브젝트: USER_OBJECTS(OBJ)
   모든 오브젝트에 대한 정보를 지원
   오즈젝트 유형, 작성시간, 오브젝트에 사용된 최종 DDL 명령, alter, grant 및 revoke 등


* 테이블 : USER_TABLES (TABS)   테이블에 대한 정보


* 열 : USER_TAB_COLUMNS (COLS)   컬럼에 대한 정보


* 뷰 : USER_VIEWS   뷰에 대한 정보


* 동의어 : USER_SYNONYMS (SYN)


* 시퀀스 : USER_SEQUENCES (SEQ)


* 제약조건 : USER_CONSTARINTS


* 제약조건열 :  USER_CONS_COLUMNS ( 제약 조건을 가진 열에 대한 정보)


* 제약조건의 예외사항 : EXCEPTIONS  제약조건을 활성화시 에러사항에 대한 정보


* 테이블 주석 : USER_TAB_COMMENTS  테이블/뷰에 대한 주석


* 열 주석 : USER_COL_COMMENTS ( 열에 대한 주석)


* 인덱스 : USER_INDEXES (IND) ( 인덱스에 관한 정보)


* 인덱스 열 : USER_IND_COLUMNS  인덱스열에 대한 정보


* 클러스터 : USER_CLUSTERS (CLU)  클러스터와 관련된 정보


* 데이터베이스 링크 : USER_DB_LINKS  링크에 관련된 정보


* 스냅샷 : USER_SNAPSHOTS


* 스냅샷 로그 : USER_SNAPSHOT_LOGS


* 트리거 : USER_TRIGGERS


* 프로시저, 함수 및 패키지 : USER_SOURCE


* 코드 오류 : USER_ERRORS


* 테이블스페이스 : USER_TABLESPACES


* 영역 할당량 : USER_TS_QUOTAS
   테이블스레이스 단위로 사용자가 이용할 수 있는 영역의 최대크기와
   할당된 영역의 크기 파악에 대한 정보


* 세그먼트와 익스텐트 : USER_SEGMENTS 와 USER_EXTENTS


* 여유 영역 : USER_FREE_SPACE   현재 여유로 표시된 영역이 얼마인지에 대한 정보


* 사용자 : USER_USERS


* 자원 제한량 : USER_RESOURCE_LIMITS


* 테이블 권한 : USER_TAB_PRIVS


* 열 권한 : USER_COL_PRIVS


* 시스템 권한 : USER_SYS_PRIVS


* 사용자 본인 권한 USER_ROLE_PRIVS


  ================================================
    * 오라클 정보공유 커뮤니티 oracleclub.com
    * http://www.oracleclub.com
    * http://www.oramaster.net
    * 강좌 작성자 : 김정식 (oramaster _at_ naver.com)
  ================================================
반응형

'ORACLE > ADMIN' 카테고리의 다른 글

em 삭제하고 재 설치  (0) 2009.03.19
TABLE별 용량을 파악해보자!  (0) 2009.03.13
PCTFREE, PCTUSED  (0) 2009.02.25
oracle em 구성  (0) 2009.02.12
INSERT /*+ APPEND */ VS CTAS  (0) 2009.02.06
Posted by [PineTree]
ORACLE/TroubleShooting2009. 3. 3. 15:04
반응형

Applies to:

Oracle Server - Enterprise Edition - Version: 10.1.0.5 to 10.2.0.4
This problem can occur on any platform.

Symptoms

Database can crash many times if Automatic Shared Memory Management (ASMM) is used.

Database crashes many times with the following messages from alert_log:-

Tue Oct 28 13:20:35 2008
Errors in file /ora/product/10.2.0prd/admin/oradwprd/bdump/oradwprd_cjq0_1990.trc:
Tue Oct 28 13:22:03 2008
System State dumped to trace file
Tue Oct 28 13:41:45 2008
MMNL absent for 1310 secs; Foregrounds taking over
Tue Oct 28 13:41:52 2008
MMNL absent for 1256 secs; Foregrounds taking over
MMNL absent for 1256 secs; Foregrounds taking over
MMNL absent for 1256 secs; Foregrounds taking over
Tue Oct 28 14:25:28 2008
...
Tue Oct 28 20:16:50 2008
ksvcreate: Process(m000) creation failed
Tue Oct 28 20:21:32 2008
MMNL absent for 1311 secs; Foregrounds taking over
Tue Oct 28 20:45:05 2008

The AWR report during the time the crash happens shows the following:-

Cache Sizes
~~~~~~~~~~~ Begin End
---------- ----------
Buffer Cache: 1,280M 1,568M Std Block Size: 8K
Shared Pool Size: 720M 432M Log Buffer: 15,148K

Load Profile
~~~~~~~~~~~~ Per Second Per Transaction
--------------- ---------------
Redo size: 1,031.15 6,487.12
Logical reads: 15,843.66 99,674.56
Block changes: 3.61 22.70
Physical reads: 1,975.69 12,429.32
Physical writes: 454.90 2,861.83
User calls: 53.04 333.65
Parses: 2.14 13.45
Hard parses: 0.44 2.79
Sorts: 1.91 12.00
Logons: 0.03 0.18
Executes: 3.74 23.55
Transactions: 0.16

% Blocks changed per Read: 0.02 Recursive Call %: 43.94
Rollback per transaction %: 7.99 Rows per Sort: ########

Instance Efficiency Percentages (Target 100%)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Buffer Nowait %: 97.12 Redo NoWait %: 100.00
Buffer Hit %: 94.80 In-memory Sort %: 99.10
Library Hit %: 84.79 Soft Parse %: 79.23
Execute to Parse %: 42.89 Latch Hit %: 95.30
Parse CPU to Parse Elapsd %: 10.35 % Non-Parse CPU: 62.73

Shared Pool Statistics Begin End
------ ------
Memory Usage %: 14.69 25.80
% SQL with executions>1: 83.47 43.38
% Memory for SQL w/exec>1: 69.04 43.09

Top 5 Timed Events Avg %Total
~~~~~~~~~~~~~~~~~~ wait Call
Event Waits Time (s) (ms) Time Wait Class
------------------------------ ------------ ----------- ------ ------ ----------
latch: library cache 125 14,869 ###### 33.3 Concurrenc
latch: shared pool 553 13,177 23828 29.5 Concurrenc
read by other session 1,653,348 8,455 5 18.9 User I/O
CPU time 4,353 9.7
db file sequential read 841,956 3,000 4 6.7 User I/O

Cause

Huge contention for shared pool and library cache latches are seen from AWR report during the problem period.

Also the shared pool size is getting shrinked during the problem as evident from AWR.

This is because of dynamic memory allocation with in SGA.

As Automatic SGA is used, the repeated shrink / growth in the shared pool and buffer cache would happen and that could cause lot of waits in sessions.

Because of Auto SGA, the shared pool is shrinked during the problem and thats why the contention is seen across the shared pool which caused the database crash.

From the systemstate dumps it is shown Location from where latch is held:  ksucrp:
The function is used to Create and initialise a process.
The process cannot be initialized due to lack of memory.

All the messages seen in alert log are the indication of lack of memory available in shared pool.

Bug 6528336 seems to have caused the problem.

Solution

To disable Auto SGA.

sga_target=0

Configure memory components separately for shared pool and buffer cache.

shared_pool_size=<value>M

db_cache_size=<value>M

반응형
Posted by [PineTree]
ORACLE/TUNING2009. 3. 3. 13:57
반응형

원본 출처 http://www.oracleclub.com/article/23893

[ 출처 ]
1. 10g Optimizer개념 및 통계치 생성 방법,SQL Tuning 방법
http://www.dbguide.net/club/board/download.jsp?maskname=274&fileName=10g+Optimizer+to+public.pdf

2.  10g 자동화 통계정보 수집에 관하여... [2008/05/11 Update]
http://blog.naver.com/sungeunn/120051268815

3.  어떤 STATISTICS_LEVEL 을 사용할 것인가 ?
http://cafe.naver.com/prodba/9293

4. 메타링크
  4.1 Two types of automatic statistics collected in 10g [ 559029.1  ]
  4.2 How to Disable Automatic Statistics Collection in 10G ? [ 311836.1 ]
5. 10G References [ STATISTICS_LEVEL ]
  http://download.oracle.com/docs/cd/B19306_01/server.102/b14237/initparams211.htm#REFRN10214

 [ 결론 ]
1. System 통계정보는 따로 생성 하지 않는다.
    어느 시간이 최적인지 모른다. DBA 가 알수 있으면 정기적으로 생성해서 활용한다.
2. 자동 통계정보 수집(CBO) 는 disable 하고, 수동으로 통계정보를 생성한다.
   운영 중에 통계정보 생성으로 인해 업무의 성능 저하를 사전에 예방하자.
3. STATISTICS_LEVEL = TYPICAL 로 유지 하자

4. 자동 통계정보 수집 대상은 User Objects,  Sys/System Object 가 대상이다.

  
[ 요약 ]

  대상  설명   TATISTICS_LEVEL=BASIC  STATISTICS_LEVEL=TYPICAL
 System Statistics  System 성능 ( CPU, DISK )    
 Fixed Objects Statistics  DBMS 성능 ( X$, V$)    
 Dictionary Statistics  SYS/SYSTEM USER TABLE  자동 수집되지 않는다.  자동 수집된다.
 User Table Statistics
 일반 유저 TABLE  자동 수집되지 않는다  자동 수집된다.
 

통계정보의 종류
: 크게 4가지로 구분할 수 있다.
[ 1.System Statistics ]
: 개요 - System Statistics 는 System Hardware 의 I/O, CPU 의 특성을 분석하여
         Optimizer 가 CPU Costing 을 계산할 때 사용하는 정보로써,
         이를 기반으로 Optimizer 가 임의의 SQL에 대한 실행 계획을 수립할 때
         이를 기반으로 계산하게 된다.
  수행주기 - 초기 1회
             시스템 자원의 변경이 생겼을 경우 ( Memory, CPU, I/O 등 )
  9i - 처음 소개된 개념이고, DBA가 수동으로 수집 하지 않으면 기본적으로
       존재하지 않는 정보이다. 기본적으로 I/O Model로 비용산정
       System Statistics 정보가 있으면 Optimizer 가 비용 산정을 CPU Model 로 하고,
       System Statistics 정보가 없다면 Optimizer 가 비용 산정을 I/O Model 로 한다.
  10G - System Statistics 정보를 수집 하지 않는다면 Noworkload System Statistics 가
       사용된다. 10G 에서는 Optimizer 가 비용 산정을 CPU Model 로 한다. [ Default ]
       [ CPUSPEEDNW, IOSEEKTIM, IOTFRSPEED 로 구성된다. ]
       수동으로 System Statistics 수집 시에는 Workload System Statistics 라고 한다.
       결론적으로 운영 시스템의 최적의 System Statistics 를 생성하여, 적절히
       적용 하여 사용하는 것이 최선이나, 보통은 NoWorkload System Statistics 를
       그대로 사용한다.
 주의사항 :
RAC 에서 NODE 가 서로 같은 시스템 사양을 같지 않을 경우에는
       System Statistics 를 Node 별로 나누어 관리 되지 않으므로 전체 System 의
       대표성을 가지는 Node 에서 수행을 한다.
       특히 위와 같은 결정을 하기 위해서는, 각각의 Node 별로 통계치를 생성해
       보고 비교해 본 후에 결정할 수 있다.
       노드의 사양이 동일한 경우 가장 일반적인 Node 에서 수행한다.  

실습
: 시스템 통계정보는 Optimizer 가 실행 계획 세움에 있어서 지대한 영향을
  미치므로, 항상 기존의 시스템 통계자료를 백업 후 진행 하자.
  OLTP 와 OLAP 성 통계정보를 생성하고, IMPORT 해보자

 
-- 1. 시스템 통계정보 확인
SELECT * FROM SYS.AUX_STATS$ ;
SNAME                          PNAME                    PVAL1 PVAL2
------------------------------ -------------------- --------- ------------------------------
SYSSTATS_INFO                  STATUS                         COMPLETED
SYSSTATS_INFO                  DSTART                         02-13-2009 13:33
SYSSTATS_INFO                  DSTOP                          02-13-2009 13:33
SYSSTATS_INFO                  FLAGS                        0
SYSSTATS_MAIN                  CPUSPEEDNW                1489
SYSSTATS_MAIN                  IOSEEKTIM                   10
SYSSTATS_MAIN                  IOTFRSPEED                4096
SYSSTATS_MAIN                  SREADTIM
SYSSTATS_MAIN                  MREADTIM
SYSSTATS_MAIN                  CPUSPEED
SYSSTATS_MAIN                  MBRC
SYSSTATS_MAIN                  MAXTHR
SYSSTATS_MAIN                  SLAVETHR

13 rows selected.

-- 2. 기존 통계정보 백업 받을 테이블 생성
SQL> execute DBMS_STATS.CREATE_STAT_TABLE(’SYS’,’ORIGIN’,’USERS’);
PL/SQL procedure successfully completed.
-- 기존 통계정보 백업
SQL> execute DBMS_STATS.EXPORT_SYSTEM_STATS(stattab =>’ORIGIN’, STATID =>’ORIGIN’,STATOWN =>’SYS
PL/SQL procedure successfully completed.
-- 백업 받은 시스템 통계정보 데이타 확인
SQL> SELECT STATID, C1, C2, C3 FROM ORIGIN ;
--  C1 = COMPLETED     --> 수집 완료


-- 3. 시스템 통계정보 수집
-- 사전에 JOB PROCESS 확인 ( 1보다 커야 한다.)
SQL> show parameters job_queue

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
job_queue_processes                  integer     0
SQL> alter system set job_queue_processes = 5 ;
System altered.

SQL> show parameters job_queue
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
job_queue_processes                  integer     5

 

-- 4.  OLTP 성 시스템 통계정보 수집하기
-- OTLP용 시스템 통계정보 생성을 위한 통계정보 테이블 생성
-- OWNER, TABLE 이름, TABLESPACE 이름 순
SQL> execute DBMS_STATS.CREATE_STAT_TABLE(’SYS’,’OLTP’,’USERS’);
PL/SQL procedure successfully completed.
--  지금 부터 INTERVAL 로 지정된 시간 동안 시스템 통계정보를 생성 하라..
--  2분동안 시스템 통계정보를 수집 하라
SQL> execute DBMS_STATS.GATHER_SYSTEM_STATS(GATHERING_MODE =>’INTERVAL’,INTERVAL=> 2, STATTAB => ’OLTP’, STATID => ’OLTP’);
PL/SQL procedure successfully completed.
-- 시스템 통계정보 수집 확인
SQL> select STATID, C1, C2, C3 from OLTP;
STATID               C1                             C2                             C3
-------------------- ------------------------------ ------------------------------ ------------------------------
OLTP                 AUTOGATHERING                  02-24-2009 08:54               02-24-2009 08:56
OLTP
--  C1 = AUTOGATHERING --> 수집 중
--  C1 = COMPLETED     --> 수집 완료 로 변경된다. [ 2분 경과 후 ]

--  10분동안 시스템 통계정보를 수집 하라 [앞서 수행한 2분동안 통계정보는 Update 된다.  ]
execute DBMS_STATS.GATHER_SYSTEM_STATS(GATHERING_MODE =>’INTERVAL’,INTERVAL=> 10, STATTAB => ’OLTP’, STATID => ’OLTP’);
-- 시스템 통계정보 수집 확인
SQL> select STATID, C1, C2, C3 from OLTP;
STATID               C1                             C2                             C3
-------------------- ------------------------------ ------------------------------ ------------------------------
OLTP                 AUTOGATHERING                  02-24-2009 08:56               02-24-2009 08:58
OLTP
--  C1 = AUTOGATHERING --> 수집 중

-- 시스템 통계정보 수집 중지 하기 [ gathering_mode=>’STOP’ ]
SQL> execute DBMS_STATS.GATHER_SYSTEM_STATS(GATHERING_MODE =>’STOP’,INTERVAL=> 10, STATTAB => ’OLTP’, STATID => ’OLTP’);

-- 시스템 통계정보 수집 확인
SQL> select STATID, C1, C2, C3 from OLTP;
--  C1 = AUTOGATHERING --> 수집 중
--  C1 = COMPLETED     --> 수집 완료 [ 강제로 중지 하여도 COMPLETED 로 나온다. ]

 

--  5. OLAP 성 시스템 통계정보 수집하기
SQL> execute DBMS_STATS.CREATE_STAT_TABLE(’SYS’,’OLAP’,’USERS’);
PL/SQL procedure successfully completed.
execute DBMS_STATS.GATHER_SYSTEM_STATS(GATHERING_MODE =>’INTERVAL’,INTERVAL=> 2, STATTAB => ’OLAP’, STATID => ’OLAP’);
SQL> SELECT STATID, C1, C2, C3 FROM OLAP ;

STATID               C1                             C2                             C3
-------------------- ------------------------------ ------------------------------ ------------------------------
OLAP                 COMPLETED                      02-24-2009 09:04               02-24-2009 09:06
OLAP
-- C1 => AUTOGATHERING -- 수집 중
-- C1 => COMPLETED     -- 수집 완료 로 변경된다.  [ 2분 경과 후 ]

 

-- 6. 생성한 OLAP_STATS 시스템 통계정보 IMPORT 하기
-- 기존 통계정보 삭제
execute DBMS_STATS.DELETE_SYSTEM_STATS ;
-- 기존 통계정보를 삭제 하면,
-- SYSSTATS_INFO.DSTART 와 SYSSTATS_INFO.DSTOP 값만 DELETE 시점으로 변경된다.
SQL> select  * from sys.aux_stats$;
SNAME                          PNAME                    PVAL1 PVAL2
------------------------------ -------------------- --------- ------------------------------
SYSSTATS_INFO                  STATUS                         COMPLETED
SYSSTATS_INFO                  DSTART                         02-24-2009 09:08
SYSSTATS_INFO                  DSTOP                          02-24-2009 09:08

-- OLTP 시스템 통계정보 IMPORT 하기
execute DBMS_STATS.IMPORT_SYSTEM_STATS(stattab =>’OLTP’, STATID =>’OLTP’,STATOWN =>’SYS’);
-- Import 된 시스템 통계정보 확인
-- OLTP 시스템 통계정보를 수행한 시간으로 SYSSTATS_INFO.DSTART 와 SYSSTATS_INFO.DSTOP
-- 값이 변경되어 진다.
SQL> select * from sys.aux_stats$ ;
SNAME                          PNAME                    PVAL1 PVAL2
------------------------------ -------------------- --------- ------------------------------
SYSSTATS_INFO                  STATUS                         COMPLETED
SYSSTATS_INFO                  DSTART                         02-24-2009 08:56
SYSSTATS_INFO                  DSTOP                          02-24-2009 08:58


-- 7. 다시 원복 하기
SQL> execute DBMS_STATS.DELETE_SYSTEM_STATS ;
PL/SQL procedure successfully completed.

SQL> execute DBMS_STATS.IMPORT_SYSTEM_STATS(stattab =>’ORIGIN’, STATID =>’ORIGIN’,STATOWN =>’SYS’);
PL/SQL procedure successfully completed.

SQL> select * from sys.aux_stats$ ;
SNAME                          PNAME                    PVAL1 PVAL2
------------------------------ -------------------- --------- ------------------------------
SYSSTATS_INFO                  STATUS                         COMPLETED
SYSSTATS_INFO                  DSTART                         02-13-2009 13:33
SYSSTATS_INFO                  DSTOP                          02-13-2009 13:33
--  SYSSTATS_INFO.DSTART 와 SYSSTATS_INFO.DSTOP 로 ORIGIN 으로 변경됨


-- 8. 수동으로 시스템 통계정보 생성하기 [ 파라미터 개별 설정 ]
-- 기존 시스템 통계정보 삭제 하기
execute DBMS_STATS.DELETE_SYSTEM_STATS ;
-- CPUSPEED 설정
-- CPUSPEED : Wait time to read single block, in milliseconds
SQL> execute DBMS_STATS.SET_SYSTEM_STATS(PNAME =>’CPUSPEED’, PVALUE=>400);
PL/SQL procedure successfully completed.
-- CPUSPEED 값 변경 확인
SQL> select * from sys.aux_stats$ WHERE PNAME =’CPUSPEED’;
SNAME                          PNAME                    PVAL1 PVAL2
------------------------------ -------------------- --------- ------------------------------
SYSSTATS_MAIN                  CPUSPEED                   400
-- SREADTIM 설정
-- SREADTIM : wait time to read single block, in milliseconds
SQL> execute DBMS_STATS.SET_SYSTEM_STATS(PNAME =>’SREADTIM’, PVALUE=>100);
PL/SQL procedure successfully completed.
-- SREADTIM 값 변경 확인
SQL> select * from sys.aux_stats$ WHERE PNAME =’SREADTIM’;
SNAME                          PNAME                    PVAL1 PVAL2
------------------------------ -------------------- --------- ------------------------------
SYSSTATS_MAIN                  SREADTIM                   100

 

-- 9. 원복 하기
SQL> execute DBMS_STATS.DELETE_SYSTEM_STATS ;
PL/SQL procedure successfully completed.

SQL> execute DBMS_STATS.IMPORT_SYSTEM_STATS(stattab =>’ORIGIN’, STATID =>’ORIGIN’,STATOWN =>’SYS’);
PL/SQL procedure successfully completed.

-- 원복 결과 확인
SQL> select * from sys.aux_stats$ ;

SNAME                          PNAME                    PVAL1 PVAL2
------------------------------ -------------------- --------- ------------------------------
SYSSTATS_INFO                  STATUS                         COMPLETED
SYSSTATS_INFO                  DSTART                         02-13-2009 13:33
SYSSTATS_INFO                  DSTOP                          02-13-2009 13:33

 

[ 2.Fixed Objects Statistics ]
  개요 - 
Dynamic Performance View와 같이 fixed view(x$ tables)에 대한 통계치는
          Manual 한 Gathering 이 필요하다. 이 Fixed Objects Statistics 는
          Database 의 Activity 를 기록하게 되므로 database 가 일반적인 운영 상태
          일때 gathering  하여야 한다.
          일반적으로 Fixed Object Statistics 통계치는 V$ view 를 조회하는
          사용자 Query에 필요하다.
  수행주기 - 초기 1회
             추가적인 Application 이나 변경으로 동시 사용자 등의 변경 발생시
  주의사항 - 자동화 대상이 아니다. [ 자동으로 Fixed Object의 통계정보가 생성되지 않는다. ]
             RAC 에서는 아직 Fixed Objects Statistics 를 Instance 별로 구분하지
             않기 때문에, 가장 부하가 많은 Node(Instance)에서 통계치를 조사한다.

 
실습
: Fixed Object 통계정보는 DBMS 성능에 지대한 영향을 미치므로,
  항상 기존의 Fixed Object 통계정보를 백업 후 진행 하자.
  OLTP 와 OLAP 성 Fixed Object 통계정보를 생성하고, IMPORT 해보자

 

-- 1. 기존의 Fixed Object 통계정보 백업 테이블 생성   
SQL> execute DBMS_STATS.CREATE_STAT_TABLE(’SYS’,’FIX_ORIGIN’,’USERS’);           
-- EXPORT_FIXED_OBJECTS_STATS 를 통한 백업 수행
SQL> execute DBMS_STATS.EXPORT_FIXED_OBJECTS_STATS(stattab =>’FIX_ORIGIN’,STATID =>’FIX_ORIGIN’,STATOWN =>’SYS’);
PL/SQL procedure successfully completed.

 

-- 2. 신규로 Fixed Object 통계정보 테이블 생성  
SQL> execute DBMS_STATS.CREATE_STAT_TABLE(’SYS’,’FIX_NEW’,’USERS’); 
-- 신규 Fixed Object 통계정보 수집
SQL> execute DBMS_STATS.GATHER_FIXED_OBJECTS_STATS(’SYS’,’FIX_NEW’,’SYS’);
BEGIN DBMS_STATS.GATHER_FIXED_OBJECTS_STATS(’SYS’,’FIX_NEW’,’SYS’); END;

*
ERROR at line 1:
ORA-20000: Insufficient privileges to analyze an object in Fixed Ob
ORA-06512: at "SYS.DBMS_STATS", line 13578
ORA-06512: at "SYS.DBMS_STATS", line 13892
ORA-06512: at "SYS.DBMS_STATS", line 14420
ORA-06512: at line 1

SQL> execute DBMS_STATS.GATHER_FIXED_OBJECTS_STATS(’FIX_NEW’);
PL/SQL procedure successfully completed.

 

-- 3. 기존 Fixed Object 통계정보 확인 하기
SQL>  select table_name, to_char(last_analyzed, ’yyyymmdd hh24:mi:ss hh24:mi:ss’)
      from dba_tab_statistics
      where table_name like ’X$%’ ;

TABLE_NAME                     TO_CHAR(LAST_ANALYZED,’YYY
------------------------------ --------------------------
X$KQFTA                       
X$KQFVI                       
X$KQFVT                       
X$KQFDT                       


-- 4. 신규 Fixed Object 통계정보 IMPORT
--  FIXED TABLE 의 통계정보 삭제
SQL> execute DBMS_STATS.DELETE_FIXED_OBJECTS_STATS ;
PL/SQL procedure successfully completed.
-- 신규 Fixed Object 통계정보 Import
SQL> execute DBMS_STATS.IMPORT_FIXED_OBJECTS_STATS(stattab =>’FIX_NEW’, STATID =>’FIX_NEW’,STATOWN =>’SYS’);
PL/SQL procedure successfully completed.


-- 5. 신규 Fixed Object 통계정보 확인 하기
SQL>  select table_name, to_char(last_analyzed, ’yyyymmdd hh24:mi:ss hh24:mi:ss’)
      from dba_tab_statistics
      where table_name like ’X$%’ ;

TABLE_NAME                     TO_CHAR(LAST_ANALYZED,’YYY
------------------------------ --------------------------
X$KQFTA                        20090224 09:50:34 09:50:34
X$KQFVI                        20090224 09:50:34 09:50:34
X$KQFVT                        20090224 09:50:34 09:50:34
X$KQFDT                        20090224 09:50:34 09:50:34
...
일부는 last_analyzed 가 Update 되지 않는다.
Note that the database can decide not to collect stats for objects
that were either never used or are totally volatile.

 

6. Fixed Object 통계정보 원복 하기
SQL> execute DBMS_STATS.DELETE_FIXED_OBJECTS_STATS ;
PL/SQL procedure successfully completed.

SQL> execute DBMS_STATS.IMPORT_FIXED_OBJECTS_STATS(stattab =>’FIX_ORIGIN’, STATID =>’FIX_ORIGIN’,STATOWN =>’SYS’);
PL/SQL procedure successfully completed.

-- 복원된 정보 확인 하기
SQL > select table_name, to_char(last_analyzed, ’yyyymmdd hh24:mi:ss hh24:mi:ss’)
      from dba_tab_statistics
      where table_name like ’X$%’ ;

 
[ 3.Dictionary Statistics ]
  개요 - DBMS_STATS.GATHER_DICTIONARY_STATS 를 이용하여 Sys, System Schema 의
        Object를 Gathering 한다. 이 procedure 는 또한 DRSYS 나 CTX user Schema의
        Object 도 함께 Gathering 한다.
  수행주기 - 초기 1회
             Database Object(사용자 Table, PL/SQl, User생성) 의 변경이 있는 경우
            
실습
: Dictionary 통계정보는 DBMS 성능에 지대한 영향을 미치므로,
  항상 기존의 Dictionary 통계정보를 백업 후 진행 하자.
  OLTP 와 OLAP 성 Dictionary 통계정보를 생성하고, IMPORT 해보자

 

-- 1. 기존의 Dictionary 통계정보 통계정보 백업 테이블 생성   
SQL> execute DBMS_STATS.CREATE_STAT_TABLE(’SYS’,’SYS_ORIGIN’,’USERS’);
PL/SQL procedure successfully completed.
-- EXPORT_DICTIONARY_STATS 를 통한 백업 수행
SQL>  execute DBMS_STATS.EXPORT_DICTIONARY_STATS(stattab =>’SYS_ORIGIN’,STATID =>’SYS_ORIGIN’,STATOWN =>’SYS’);
PL/SQL procedure successfully completed.


-- 2. 신규로 Dictionary 통계정보 테이블 생성  
SQL> execute DBMS_STATS.CREATE_STAT_TABLE(’SYS’,’SYS_NEW’,’USERS’); 
PL/SQL procedure successfully completed.
-- 신규 Dictionary 통계정보 수집
SQL> execute DBMS_STATS.GATHER_DICTIONARY_STATS(’SYS_NEW’);
PL/SQL procedure successfully completed.

 

3. 신규 Dictionary 통계정보 확인 하기
SQL>   select table_name, to_char(last_analyzed, ’yyyymmdd hh24:mi:ss hh24:mi:ss’)
       from dba_tab_statistics
       where table_name like ’%$’
       order by 2
....
X$LOGMNR_OBJ$                  20090224 10:07:20 10:07:20
X$LOGMNR_TABCOMPART$           20090224 10:07:20 10:07:20
X$LOGMNR_USER$                 20090224 10:07:20 10:07:20
SUMDELTA$
SDO_TOPO_DATA$
...
일부는 last_analyzed 가 Update 되지 않는다.
Note that the database can decide not to collect stats for objects
that were either never used or are totally volatile.


4. Dictionary 통계정보 IMPORT 하기
SQL> execute DBMS_STATS.DELETE_DICTIONARY_STATS ;
PL/SQL procedure successfully completed.
-- 신규 Fixed Object 통계정보 Import
SQL> execute DBMS_STATS.IMPORT_DICTIONARY_STATS(stattab =>’SYS_NEW’, STATID =>’SYS_NEW’,STATOWN =>’SYS’);
PL/SQL procedure successfully completed.

-- IMPORT 된  Dictionary 통계정보 확인 하기
SQL>   select table_name, to_char(last_analyzed, ’yyyymmdd hh24:mi:ss hh24:mi:ss’)
       from dba_tab_statistics
       where table_name like ’%$’
       order by 2;
SRS$                           20081229 22:00:05 22:00:05
X$LOGMNR_ATTRIBUTE$            20090224 10:07:19 10:07:19
X$LOGMNR_COLTYPE$              20090224 10:07:19 10:07:19
X$LOGMNR_IND$                  20090224 10:07:19 10:07:19
X$LOGMNR_COL$                  20090224 10:07:19 10:07:19
X$LOGMNR_DICT$                 20090224 10:07:19 10:07:19
==> 테스트 에서는 실제로 Dictionary 통계정보를 가진 Table Count 가 오히려 줄어들었다.
      
5. Fixed Object 통계정보 원복 하기
SQL> execute DBMS_STATS.DELETE_DICTIONARY_STATS ;
PL/SQL procedure successfully completed.

SQL> execute DBMS_STATS.IMPORT_DICTIONARY_STATS(stattab =>’SYS_ORIGIN’, STATID =>’SYS_ORIGIN’,STATOWN =>’SYS’);
PL/SQL procedure successfully completed.

-- 복원된 정보 확인 하기
SQL>   select table_name, to_char(last_analyzed, ’yyyymmdd hh24:mi:ss hh24:mi:ss’)
       from dba_tab_statistics
       where table_name like ’%$’
       order by 2;

 

[ 4.User Table Statistics ]
: 사용자의 Object 에 대한 통계치 수집은 10G 에서 기본적인 GATHER_STATS_JOB 을
이용한다. 이 JOB 은 기존 DATA의 10% 이상의 변경이 있거나, 오랫동안 통계치가
변경되지 않거나, 통계치가 없거나 한 Object 에 대한 Gathering 을 수행한다.
또한 분석하는 순서 역시 우선순위 순으로 수행한다.
만약 Object 에 많은 Data 가 Load 되거나 변경이 있는 경우에는  Manual 하게
수행한다.
- 10G 에서 말하는 자동 통계정보 수집 기능(Automatic Statistics) 의 대상은
  1. AWR(Automactic Workload Repository)
   - 분석, Self-Tuing 및 일반적인 Tuning 을 목적으로 하는 자료로
     특정 시간 동안 데이타 베이스에서 발생한 여러 가지 상황 정보를 이른다.
     Wait Events, Latces, Enqueues, Cpu Consumption, SGA Compoenent, PGA 등에
     대한 자료 이다.
      ’STATISTICS_LEVEL’ 에 의해서 수집되는 자료의 LEVEL 이 결정된다.
     AWR 정보는 디폴트로 7일간 보관한다. [ SYSAUX TABLESPACE 에 ]
    
  2. CBO(Cost-Based Optimizer)
   - Database 의 Object 즉,  Application 및 Oracle Internal (Sys/System) 유저의
     Table, Index 에 대한 통계정보 수집
     이 수집된 정보는 Optimizer 가 수행계획 수립 시에 의해 사용된다.
     GATHER_STATS_JOB 에 의해서 수집 된다. [DB 생성시 자동 생성됨]
     Optimizer historical 통계정보는 디폴트로 31일간 보관한다.
     STATISTICS_LEVEL=BASIC 이면 CBO 통계정보가 수집되지 않는다.
        - Automatic Optimizer Statistics Collection
        - Object level Statistics  
     [ SYSAUX TABLESPACE 에 ]  
    
-- SYSAUX 사용 현황 파악 하기
 SELECT occupant_name, space_usage_kbytes FROM V$SYSAUX_OCCUPANTS;
 1. SM/AWR 
  - AWR 정보 수집
  - AWR 정보 수집 옵션 확인
    SQL>  SELECT DBID, RETENTION, TOPNSQL  FROM DBA_HIST_WR_CONTROL ;
          DBID RETENTION                      TOPNSQL
    ---------- ------------------------------ ----------
    2466823093 +00007 00:00:00.0              DEFAULT
    보존 변경은 dbms_workload_repository.modify_snapshot_settings 를 통해서 가능
   
    -- AWR 정보 한달 보관주기로 변경 [ 60*24*31 = 44640 분 ]
    SQL> EXECUTE DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(retention => 44640 );
    PL/SQL procedure successfully completed.
    -- 변경되 AWR 정보 확인
    SQL> SELECT DBID, RETENTION, TOPNSQL  FROM DBA_HIST_WR_CONTROL ;
   
          DBID RETENTION                      TOPNSQL
    ---------- ------------------------------ ----------
    2466823093 +00031 00:00:00.0              DEFAULT

 2. SM/ADVISOR
    SQL Tuning Advisor, SQL Access Advisor, ADDM 이 사용하는 정보 저장소

 3. SM/OPTSTAT    
    - 구버전(Old) Optimizer 통계정보 저장소
    - SM/OPTSTAT 저장 기간 확인
      SQL> select dbms_stats.get_stats_history_retention from dual;
      GET_STATS_HISTORY_RETENTION
      ---------------------------
                               31
      ==> Default 로 31일
    -- 10일로 조절
    SQL> exec dbms_stats.alter_stats_history_retention(10);
    PL/SQL procedure successfully completed.

    SQL> select dbms_stats.get_stats_history_retention from dual;
    GET_STATS_HISTORY_RETENTION
    ---------------------------
                         10
    -- 원복
    SQL> exec dbms_stats.alter_stats_history_retention(31);
    PL/SQL procedure successfully completed.

  4. SM/OTHER
     - Alert History 등의 저장소


--  STATISTICS_LEVEL PARAMETER
    : Database 와 OS 의 통계정보의 수집 Level 을 제어 하는 파라미터
    1.Typical
      - Default, 일반적인 환경에 가장 적합
    2. ALL
      - typical + Timed OS Statistics + Plan Execution Statistics
    3. BASIC
      - 아래 기능을에 필요한 중요한 통계정보를 수집 할 수 없다.
        - AWR
        - ADDM
        - All Server-Generated Alerts
        - Automatic SGA Memory Management
        - Automatic Optimizer Statistics Collection
        - Object level Statistics
        등...
           
 
실습 : 여기서 말하는 자동 통계수집 이란 CBO 에 대한 것을 이른다.
     - 1. 자동 통계수집일정을 확인하고
     - 2. 자동 통계수집을 Disable 해보자
     - 3. 통계정보 백업 / 복구 하기 
     - 4. 특정 테이블 통계수집 중지 하기
 
-- 1.1 자동통계정보 수집 확인 하기
SQL >  select job_name, job_type, program_name, schedule_name, job_class
      from dba_scheduler_jobs
       where job_name =’GATHER_STATS_JOB’;
JOB_NAME             JOB_TYPE         PROGRAM_NAME         SCHEDULE_NAME                  JOB_CLASS
-------------------- ---------------- -------------------- ------------------------------ ------------------------------
GATHER_STATS_JOB                      GATHER_STATS_PROG    MAINTENANCE_WINDOW_GROUP       AUTO_TASKS_JOB_CLASS

-- 1.2 자동통계정보 수집 시 실행 되는 Program 확인
SQL> select program_Action from dba_scheduler_programs where program_name =’GATHER_STATS_PROG’;

PROGRAM_ACTION
--------------------------------------------------
dbms_stats.gather_database_stats_job_proc


--  1.3 자동통계정보 수집 시 스케줄 확인
SQL> select * from dba_scheduler_wingroup_members where window_group_name =’MAINTENANCE_WINDOW_GROUP’;

WINDOW_GROUP_NAME              WINDOW_NAME
------------------------------ ------------------------------
MAINTENANCE_WINDOW_GROUP       WEEKNIGHT_WINDOW
MAINTENANCE_WINDOW_GROUP       WEEKEND_WINDOW

 

--  1.4 자동통계정보 수집 시 스케줄 상세 확인
SQL> select window_name, repeat_interval, duration
     from dba_scheduler_windows
     where window_name in (’WEEKNIGHT_WINDOW’,’WEEKEND_WINDOW’);

WINDOW_NAME          REPEAT_INTERVAL                                                                  DURATION
-------------------- -------------------------------------------------------------------------------- --------------------
WEEKNIGHT_WINDOW     freq=daily;byday=MON,TUE,WED,THU,FRI;byhour=22;byminute=0; bysecond=0            +000 08:00:00
WEEKEND_WINDOW       freq=daily;byday=SAT;byhour=0;byminute=0;bysecond=0                              +002 00:00:00

-- 매주 월,화,수,목,금요일은 밤 10시에 8시간 동안 수행 된다.
-- 토요일 0시에 수행되어 이틀 동안 수행된다.

 

-- 2.1 자동통계정보 수집 중지
-- STATISTICS_LEVEL=BASIC 이면 자동통계정보 수집(CBO)
SQL> select job_name, state from dba_scheduler_jobs where job_name =’GATHER_STATS_JOB’;

JOB_NAME             STATE
-------------------- ---------------
GATHER_STATS_JOB     SCHEDULED

SQL> exec dbms_scheduler.disable(’GATHER_STATS_JOB’);

PL/SQL procedure successfully completed.

SQL> select job_name, state from dba_scheduler_jobs where job_name =’GATHER_STATS_JOB’;

JOB_NAME             STATE
-------------------- ---------------
GATHER_STATS_JOB     DISABLED

 

-- 2.2 자동통계정보 수집 재설정
SQL> exec dbms_scheduler.enable(’GATHER_STATS_JOB’);

PL/SQL procedure successfully completed.

SQL> select job_name, state from dba_scheduler_jobs where job_name =’GATHER_STATS_JOB’;

JOB_NAME             STATE
-------------------- ---------------
GATHER_STATS_JOB     SCHEDULED

 

-- 3.1 통계정보 백업 / 복구 하기
-- 유저 테이블 통계정보 백업 받을 테이블 생성하기
SQL> execute dbms_stats.create_stat_table(’SYS’,’USER_STATS’,’USERS’);
PL/SQL procedure successfully completed.
-- SCOTT 유저 테이블 통계정보 백업 받기
SQL> execute dbms_stats.export_schema_stats(’SCOTT’,’USER_STATS’,’SCOTT’,’SYS’);
PL/SQL procedure successfully completed.
-- 백업된 SCOTT 유저의 통계정보 확인
SQL> select STATID, C1, C2, C4, D1 from  USER_STATS ;


-- 3.2 신규로 유저 테이블 통계정보 생성
SQL> execute dbms_stats.gather_schema_stats(ownname=>’SCOTT’, ESTIMATE_PERCENT  => DBMS_STATS.AUTO_SAMPLE_SIZE,-
     GRANULARITY => ’AUTO’, DEGREE => null, METHOD_OPT => ’FOR ALL COLUMNS SIZE 1’, -
     CASCADE => TRUE );
-- 신규로 유저 테이블 통계정보 확인
select OWNER,TABLE_NAME,PARTITION_NAME,LAST_ANALYZED
from  dba_tab_statistics
WHERE OWNER=’SCOTT’
ORDER BY LAST_ANALYZED DESC ;  
-- 날짜에 주목하자

 

-- 3.3 유저 테이블 통계정보 원복하기
SQL> exec dbms_stats.delete_schema_stats(’SCOTT’);
PL/SQL procedure successfully completed.

SQL> exec dbms_stats.import_schema_stats(’SCOTT’,’USER_STATS’,’USER_STATS’,’SYS’);
PL/SQL procedure successfully completed.
 
-- 3.4 신규로 유저 테이블 통계정보 확인
select OWNER,TABLE_NAME,PARTITION_NAME,LAST_ANALYZED
from  dba_tab_statistics
WHERE OWNER=’SCOTT’
ORDER BY LAST_ANALYZED DESC ;  
-- 날짜에 주목하자

 

-- 4.1 특정 테이블 통계수집 중지 하기
-- 수동으로 통계정보 수집 하여 LAST_ANALYZED  Update 하기
SQL>  execute dbms_stats.gather_schema_stats(ownname=>’SCOTT’, ESTIMATE_PERCENT  => DBMS_STATS.AUTO_SAMPLE_SIZE,-
     GRANULARITY => ’AUTO’, DEGREE => null, METHOD_OPT => ’FOR ALL COLUMNS SIZE 1’, -
      CASCADE => TRUE );
PL/SQL procedure successfully completed.
-- 4.2 신규로 유저 테이블 통계정보 확인
select OWNER,TABLE_NAME,PARTITION_NAME,LAST_ANALYZED
from  dba_tab_statistics
WHERE OWNER=’SCOTT’
ORDER BY LAST_ANALYZED DESC ;  
-- 날짜에 주목하자

-- 특정 테이블 통계정보 수집 막기
SQL> execute dbms_stats.lock_table_stats(’SCOTT’,’T1’);
PL/SQL procedure successfully completed.

-- 특정 테이블 통계정보 수집 막음 확인
SQL> SELECT owner, table_name, stattype_locked
     FROM dba_tab_statistics
     WHERE OWNER=’SCOTT’
     and stattype_locked is not null;
    
OWNER                          TABLE_NAME                     STATT
------------------------------ ------------------------------ -----
SCOTT                          T1                             ALL


-- 확인을 위해서 수동으로 통계정보 수집 하여 LAST_ANALYZED  Update 하기
SQL> execute dbms_stats.gather_schema_stats(ownname=>’SCOTT’, ESTIMATE_PERCENT  => DBMS_STATS.AUTO_SAMPLE_SIZE,-
> GRANULARITY =>’AUTO’, DEGREE => null, METHOD_OPT => ’FOR ALL COLUMNS SIZE 1’, -
> CASCADE => TRUE );
PL/SQL procedure successfully completed.

SQL>  select OWNER,TABLE_NAME, to_char(last_analyzed, ’yyyymmdd hh24:mi:ss hh24:mi:ss’)
      from  dba_tab_statistics
      WHERE OWNER=’SCOTT’
     and table_name in (’T1’,’EMP’,’DEPT’);

OWNER                          TABLE_NAME                     TO_CHAR(LAST_ANALYZED,’YYY
------------------------------ ------------------------------ --------------------------
SCOTT                          DEPT                           20090224 11:37:57 11:37:57
SCOTT                          EMP                            20090224 11:37:57 11:37:57
SCOTT                          T1                             20090224 11:32:53 11:32:53

==> Lock 되어진 T1 에 대해서는 테이블 통계정보가 생성되지 않았음을 확인

반응형
Posted by [PineTree]