ORACLE/ORACLE TOOL2009. 11. 23. 10:19
반응형

시 스템 개발·운영시에 다양한 소프트웨어나 솔루션을 도입해 구축하게 된다. 이때 어떠한 솔루션을 도입하느냐에 따라 시스템의 성패가 좌우된다. 또한 다양한 툴의 구매도 그 목적에 따라 해당 업무의 효율성을 높일 수도 있고 효과를 주지 못하는 경우도 있다. 이 글에서는 데이터베이스를 이용하는 개발 프로젝트에서 필수 불가결한 툴인 데이터베이스 클라이언트 툴 가운데 웨어밸리의 Orange for Oracle(이하 오렌지) 제품의 기술적인 기능에 대해 알아보고자 한다. 오렌지 도입시 판단의 기준에 도움이 되길 바란다.


1990년대부터 데이터베이스 시장이 급성장하면서 오라클 개발지원 도구 시장에 먼저 선보인 외산 제품들은 국내 고객에게 쉽게 파고들었다. 하지만 국내 제품이 아닌 탓에 사용자는 사용상의 불편함이나 비용 측면의 불리한 점이 있더라도 눈감고 외산 제품을 사용할 수밖에 없었다. 웨어밸리 오렌지는 국내 기술로 개발된 오라클 개발 지원 및 튜닝 툴로, 사용자의 요구사항에 맞춰 기능을 추가할 수 있다는 점이 가장 돋보이는 매력이다.

뒷방 신세로 전락되는 툴

많은 기업에서 오라클 데이터베이스 지원 툴을 구매하고도 6개월 아니 1년이 지나면 단지 구매 리스트에만 등재돼 있을 뿐 현업에서는 사용하지 않아 사장되는 경우를 종종 볼 수 있다. 이것은 툴의 기능에 대한 잘못된 판단으로 적절하게 구매하지 못한 이유도 있겠지만, 구매 후 잘 활용할 수 있도록 교육이 되지 않는 이유가 크다. 이러한 측면에서 볼 때 오렌지는 지금도 매월 1회씩의 무료 교육을 실시해 사용자들이 오렌지를 업무에 잘 활용하도록 유도한다.


필자의 경우 튜닝 작업이나 시스템 아키텍처를 수립하기 위해 고객과 함께 작업을 할 때, 오렌지의 기본 기능만을 사용하거나 아예 사용하지 않는 고객도 많이 봤다. 이러한 경우 고객에게 몇 가지 유용한 기능을 알려주면 대부분의 고객 반응은 ‘아니, 이런 기능도 있었군요’란 놀란 표현이 나온다. 결국 수 십 가지 기능 중에 사용자가 알고 사용하는 기능은 극히 일부이며, 편리하게 사용할 수 있는 기능이 있는데도 불구하고 적절하게 사용하지 못하고 있어 구매 후 교육 여부도 구매시 꼭 생각해 볼 점이다.

툴 구매시 가장 고려할 점

그럼 툴을 구매하고자 할 때 가장 고려해야 할 점은 무엇일까? 앞서 언급한 사후 교육, 사용자 요구사항 적용 등도 있겠지만 가장 먼저 생각해 볼 수 있는 것은 ‘툴의 기능성이다. 기본적으로 적용하고자 하는 업무에 툴이 갖고 있는 기능이 얼마나 적합한가에 따라 잘 활용되는 도구로써 사용될 가능성이 높아지기 때문이다.

오렌지의 4가지 버전과 특징

오렌지는 2001년 12월 12일 1.0버전 출시 이후 현재 3.1버전까지 오라클 데이터베이스 기반의 개발 및 DBA 툴로 선보이고 있다. 최초 오렌지의 개발자는 DBMS 튜닝 및 디자인을 하는 사람으로, 현업에서 작업 중에 비효율적인 매뉴얼 작업들을 자동화하기 위해 오렌지를 만들었다. 이렇게 만들어진 오렌지는 많은 튜너 및 컨설턴트의 피드백을 받아 사용자 중심의 툴로 설계된 것이 가장 큰 특징이다. 지금의 오렌지 3.1버전은 개발 지원 기능 및 튜닝 지원 툴, 모니터링 툴도 제공된다.


오렌지는 오라클 데이터베이스를 기반으로 하는 시스템을 구축할 경우, 개발자가 SQL을 작성하고 데이터를 조회, 등록, 수정 및 PL/SQL 개발 등을 하는데 많은 기능을 제공한다. 또한 DBA의 주요 작업인 데이터베이스 모니터링을 쉽게 할 수 있는 모니터링 기능도 제공한다(DBA 에디션).


오렌지는 사용 용도별로 크게 4가지로 나눠 구분할 수 있다. 스탠더드 에디션(Standard Edition), DBA 에디션, Reorg 에디션, Trusted 에디션으로 나눠지는데, 2005년 3월에 Reorg 에디션을 추가로 구성했다. 사실 Reorg 에디션이라고 해서 특별히 Table, Index, Tablespace 등의 reorg 작업을 오렌지가 직접 해주는 것이 아니라 오라클의 DBMS_REDEFINITION 패키지를 이용해 온라인 reorg 절차를 간편하게 작업할 수 있도록 지원해 주는 것이다. 또한 Trusted 에디션은 사전 등록된 내부 결제 프로세스를 거친 SQL만을 수행할 수 있도록 하는 기능을 갖춘 사전 보안 감시용이라 할 수 있다.


Trusted 에디션의 경우 고객의 업무 프로세스와 연계해 구성되어 사용하는 것이므로 제품 구입시 고려할 사항이 스탠더드 에디션, DBA 에디션과 현격하게 다르기에, 이글에서는 고객이 주로 사용하는 스탠더드 에디션, DBA 에디션만을 설명하도록 하겠다.

개발자 위한 오렌지 스탠더드 에디션

다음의 <표 1>과 같이 스탠더드 에디션은 오라클 데이터베이스를 기반으로 개발할 때 필요한 많은 기능들을 제공한다. 그리고 DBA 에디션은 데이터베이스 시스템의 전반적인 작업 및 모니터링 작업을 수행할 때 필요한 기능들을 갖추고 있다.

<표 1> 오렌지의 개발자 지원 기능
구분 개발자 지원 기능
SQL 툴 다양한 방식의 데이터 조회 및 SQL의 수행 지원, 멀티 탭으로 여러 SQL 동시 작업 가능, 미리 생성된 SQL을 호출해 수행할 수 있는 Named SQL 기능, 다양한 출력, SQL 포맷팅 등을 지원함
Schema Browser 16가지 타입의 데이터베이스 오브젝트에 대한 조회 및 상세 참조 지원, 타입 별로 실행할 수 있는 메뉴 지원
Query Builder GUI 화면으로 Drag & Drop 방식의 SQL의 작성을 지원함
PL/SQL 툴 Package, Procedure, Function의 작성 지원, 다양한 템플릿을 지원하며 PL/SQL 디버깅 기능 포함
Description 툴 데이터베이스 내 오브젝트의 상세 정보를 참조할 수 있는 기능, 또한 오브젝트를 재 생성할 수 있는 스크립트 생성 기능도 지원
Table Editor 테이블의 데이터를 쉽게 조회해 Form 형식으로 변경/삭제할 수 있는 기능
Plan 툴 SQL의 튜닝 작업시 실행계획 및 Trace, trace out 분석 및 테이블, 인덱스의 통계 정보를 볼 수 있는 기능 지원. 특히 오라클의 tkprof를 사용하지 않고 이보다 더 많은 정보를 제공하는 trace 분석 엔진 지원
Trace 툴 Session trace의 output인 trace file을 가독성 있는 포맷으로 보여주는 방식
Database Information 데이터베이스의 system parameter, hidden parameter, system 통계치, sga정보, log file, control file 등의 일반 정보를 확인하는 기능
Network Conf 툴 클라이언트의 SQLNET Service(tnsnames.ora)를 설정, 변경, 테스트하는 기능
Export/Import 툴 오라클 데이터베이스로부터 데이터의 export/import 기능 지원
File Editor 개발자 PC의 텍스트 파일 편집을 지원
Loader Data Loading/Unloading 기능 지원, 엑셀 혹은 텍스트 자료를 손쉽게 Loading/Unoloading. 오렌지 자체 Loader 엔진 이용
Lock/Latch Monitor Database Lock 및 블럭킹된 세션 및 오브젝트 정보 제공, OPS/RAC 지원
Transaction Monitor 수행 중인 트랜잭션의 롤백세그먼트 사용량, DML의 양에 대한 정보 제공
SQL Monitor SQL Area 내의 정보 분석 제공, Buffer gets, buffer gets/exec, execution, disk reads, elapsed time별로 조회 가능. 또한 실제 SQL text를 이용해 검색 가능
Session Monitor 데 이터베이스에 접속되어 있는 모든 세션들의 정보 제공, 세션의 100여 가지 통계정보 중 5개를 선택해 표시하는 옵션, 상세 조사가 필요한 세션에 대핸 trace 생성 기능, Kill session 기능, 현재 사용하는 SQL display 기능
Data Dictionary 툴 오라클 내부의 딕셔너리 테이블을 카테고리 별로 구분해 제공, 카테고리 별로 참고하고자 하는 딕셔너리 테이블을 쉽게 검색하여 참고할 수 있는 기능
ERP Monitor
대표적으로 고객의 요청에 의해 추가된 기능으로 Oracle Applications(ERP)를 사용하는 경우 ERP의 기본적인 부분에 대한 모니터링 기능


Step-In 기능으로 직관적 정보 분석이 가능

오렌지는 개발부터 가장 가볍고 빠르게 수행될 수 있어야 한다는 전제 하에 제작됐으며, 성능이 느린 화면은 개발시부터 자체 튜닝 대상이 되어 집중적으로 관리됐다. 오렌지의 개발 언어는 Visual C++를 이용했고, 오라클 OCI 인터페이스를 사용한다. 또한 디스크 공간도 매뉴얼을 포함해 약 20MB 정도만 사용할 뿐이다. 다만 오렌지의 빠른 성능을 보장하기 위해서 오렌지에서 사용하는 뷰(view)를 데이터베이스에 생성해야 하는데, 이 작업을 하는 것은 ‘Orange Configuration Admin’을 통해서 쉽게 생성할 수 있다. 하지만 이 작업은 오라클 데이터베이스의 내부 사용 User인 SYS user로 접속해서 수행해야 하기 때문에 데이터베이스 관리자의 허가 하에 작업할 수 있다. 처음 오렌지를 사용할 때는 이것이 다소 제약사항이지만, 스탠더드 에디션인 경우에는 ‘Orange Configuration Admin’을 돌리지 않아도 대부분의 기능은 사용이 가능하다.


화면 간의 작업 및 동작은 멀티 쓰레드 방식으로 구현돼 여러 개의 창에서 동시에 작업할 수 있으며, 오래 수행되는 쿼리를 기다리지 않고 다른 작업을 할 수 있다는 것이 장점이다. 또한 데이터베이스로의 접속도 여러 개의 세션을 맺을 수 있어서 많은 작업을 한 번에 할 수 있게 디자인됐다. 게다가 많은 컨설턴트들의 오랜 노하우가 담겨 있어 개발자, DBA는 작업시 편리한 작업환경에서 오렌지를 사용할 수 있다. 이러한 예는 오렌지 곳곳에서 찾아 볼 수 있다.


SQL monitor에서 특정 SQL을 찾은 후, 현재 이 SQL을 사용하는 세션을 찾는 Step-In 기능은 현업에서 시스템 분석시 많이 사용하는 방법이다. 또한 DBA 에디션의 Health Check 기능은 간단하면서도 기본적으로 점검해야 하는 부분을 많은 컨설턴트가 아이디어 및 개인의 노하우를 집약시킨 것이다. 물론 Report & Graph 기능에 이미 정의되어 있는 스크립트 구성을 보면 노하우를 쉽게 느낄 수 있을 것이다.


그리고 <표 1>에서 나열한 많은 툴 간에 Step-In 작업이 가능해 직관적인 정보 분석이 가능하다. 관심 있는 정보에서 더블 클릭이나 오른쪽 버튼을 누르면 상세 정보 창으로 전이되어 빠르게 자세한 정보를 확인할 수 있다. <화면 1>은 오렌지가 제공하는 툴 간의 Step-In을 보여주고 있다. 이러한 Step-In 기능은 실제 업무에서 작업하는 경우 참고 정보를 확인하기 위한 최적의 툴로 연동하는 기능이다.

<화면 1> 오렌지 툴 간의 Step-In 기능
 

 

 



고객 맞춤형 툴로 변신 가능한 ‘오렌지’

마지막으로 오렌지의 일반적인 측면 중 가장 돋보이는 것은 국내에서 개발한 툴이므로 사용자의 요구사항을 적극적으로 수용할 수 있다는 점이다. 여타 다른 툴들은 외산이므로 제공되는 기능만을 사용할 뿐 추가적인 요구 사항을 요청할 방법이 없다. 다만 오렌지의 경우에는 사용자가 필요한 기능을 개발자와 협의해 점차 고객에게 편리한 툴로 만들 수 있다는 것이다. 사실 오렌지를 개발한 웨어밸리 홈페이지(www.warevalley.com)에는 고객과 개발자의 통신 채널이 있으며 활발하게 Q&A를 진행하고 있다.


그 중 한 예가 ERP 모니터 기능으로 오라클 애플리케이션(ERP)을 사용하는 고객의 요청사항에 의해 만들어진 기능이다. 이는 ERP 관리 작업을 할 때 기본적으로 모니터링을 해야 하는 항목에 대한 화면을 항상 보게 되는데, 오렌지를 이용한 모니터링과 함께 하게 되므로 불편할 사항이 있었다. 이에 대해 고객이 적극적인 요청을 해서 오렌지에 상기 기본 모니터링을 할 수 있는 ERP 모니터 기능을 추가하게 된 것이다. 그러므로 고객이 꼭 필요하다고 느끼고 생각하는 기능에 대해서는 향후에도 추가적인 Add-on이 될 수 있다.

오렌지 탄생 실화

오렌지 개발의 핵심 목표는 가볍고, 빠르고, 쉽게 사용할 수 있는 툴을 만든다는 목표 아래 만들어 졌다. 상상을 해보라. 오렌지의 instance monitor(9개의 그래프)는 단 하나의 SQL로 구현됐다.
오렌지의 탄생은 처음 툴을 만들려고 만들어진 것은 아니다. 데이터베이스 컨설팅을 하던 초기 개발자가 자신이 작업하는 것을 자동화하기 위해 2000년부터 2001년 사이 약 1년간 ‘오렌지’라는 이름으로 만들어 졌다. 그 이후 2001년 12월 정식 ‘오렌지’라는 제품으로 탄생했다. 오렌지라는 이름은 그가 오렌지를 그냥 좋아했기 때문이란다.
그 후 웨어밸리의 한 개발자가 오라클 연동한 클라이언트 툴을 혼자 만들어 보기 위해 ‘토마토’라는 것을 만들었다. 결국 토마토는 오렌지의 기능을 강화하기 위해 오렌지에 흡수됐고, 그 이름을 Report & Graph 툴이라고 했다. 가볍고, 빠르고, 쉽게 사용할 수 있는 툴로 개발될 수밖에 없는 이유는 국내 개발 환경을 잘 아는 개발자의 땀이 묻어 있기 때문이다.

개발자 측면의 유용한 기능들

이제까지는 오렌지의 일반적인 구조에 대해 알아봤다. 그럼 개발자 측면에서의 오렌지 기능들에 대해 살펴보자. 개발자가 주로 하는 작업은 SQL의 작성, 데이터 로딩, 데이터 확인, 데이터 수정, PL/SQL 프로그램 작성 등으로, 오렌지는 이러한 작업 활동을 수행할 수 있는 기능들을 제공한다.


SQL 툴에서 지원되는 기능으로 SQL의 조회 결과를 엑셀로 저장하는 기능은 기본적으로 지원되며 그리드 출력, 텍스트 출력을 지원한다. 그리고 멀티 탭을 지원해 여러 SQL 작업을 동시에 할 수 있다. 이 SQL 툴에서는 필자가 자주 사용하는 기능으로는 SQL 툴의 Action 메뉴에 Recall Named Script 기능인데, 자주 사용되는 SQL 스크립트를 선택해서 수행할 수 있다. 핫 키로 Ctrl+R을 누르면 쉽게 저장된 SQL을 수행할 수 있다(필자의 경우에는 Named Script를 종류별로 잘 정리해 약 200여개의 스크립트를 업무에 필요시 바로바로 사용한다). 이 SQL 툴에서 특별히 지원되는 기능으로 SQL 포맷 기능이 있는데, 이는 정돈되지 않는 SQL을 가지런하게 정돈해주는 기능이다. 특히 이 기능은 튜닝 작업을 할 때 SQL Area에서부터 악성 SQL을 추출해 작업하는 경우에 더욱 편리하다. SQL Area에서 추출한 SQL들은 주로 작성된 SQL의 형태가 아닌 무작위로 보여주는데, 이 SQL 포맷 기능은 버튼 한 번의 클릭으로 보기 어렵게 되어 있는 SQL을 잘 정돈해준다. SQL*Navigator에도 이러한 기능이 있는데 비교해 본다면 오렌지가 그다지 훌륭하게 포맷되지는 않지만 무료로 제공된다는 데에서 매력이 있다.


SQL 툴에서 SQL을 작성하다 보면 여러 번의 수정 및 테스트를 하게 된다. 이때 여러 번 수정된 것을 취소하고 싶을 때는 Undo 기능을 이용해 변경 전의 값으로 돌리는데, 오렌지의 경우는 무한 undo가 지원된다. 이는 SQL을 처음 작성한 시점까지 undo할 수 있다는 것으로. undo가 제한적으로 지원되는 경우(예, MS-Word)에는 undo를 하다가 더 이상 안 될 때 난처할 경우가 발생하는 단점을 없애준다.


개발자들이 많이 사용하는 또 다른 기능 중에 하나는 로더(Loader)이다. 프로젝트의 개발 단계에서 레거시 데이터를 오라클 데이터베이스로 로딩할 때 사용하게 된다. 또한 현재 오라클 데이터베이스에서 데이터를 Un-loading하는 기능도 지원된다. 로더를 이용해 데이터를 로딩할 수 있는 포맷으로는 .csv, .xls, .txt file 등을 지원하므로, 다양한 소스의 데이터 로딩이 가능하다. 반대의 경우인 Unload 역시 상기 지원되는 포맷으로 Un-loading이 가능하다.


개발자들이 SQL을 작성하거나 PL/SQL을 작성할 때 모든 구문을 알고 작업하는 것이 아니므로, 자주 오라클 매뉴얼을 참조해봐야 하는데, 이러한 불편을 없애기 위해 오렌지에서는 DML, DDL, PL/SQL, PL/SQL Control structure, Pseudo column, SQL Function 등의 템플릿을 지원해 매뉴얼 참조 없이 손쉽게 SQL이나 PL/SQL의 작성을 도와준다.



PL/SQL 툴의 독특한 기능 ‘Source Control’

개발자 관련 오렌지 툴 중의 PL/SQL 툴은 독특한 기능이 있다. 이는 오라클 내의 PL/SQL을 작성할 때 편리하게 작업할 수 있는 환경을 지원한다. 이 PL/SQL 툴의 독특한 기능으로 Source Control이 있는데, 기존의 PL/SQL을 수정할 때 다른 개발자와의 동시 수정을 예방하고 어떤 사용자가 현재 어떤 PL/SQL을 수정하고 있는지 알 수 있는 checkout list를 지원한다. Checkout list는 다른 개발자가 동일 PL/SQL을 Check-In한 정보를 보여 준다.


<화면 2>는 checkout list 버튼을 눌렀을 때, 현재 PL/SQL을 수정하고 있는 사용자의 IP-address와 컴퓨터 이름이 나타난다. 만약 자신이 수정하고자 하는 PL/SQL이 이미 다른 개발자로부터 checkout이 됐다면, PL/SQL 툴에서는 이 PL/SQL을 수정할 수 없다. 만약 일반적인 툴이라면 이러한 제약사항 없이 사용하게 되어 두 명의 개발자가 동시에 소스를 수정해 혼란이 발생하게 될 것이다. 만약 다른 개발자가 동시에 작업하고 있다면 IP-address 및 컴퓨터 이름을 통해 어떤 개발자인지 알 수 있고, 전화 등의 통신 채널을 통해 작업 정지나 잔업 협의를 통해 계속 진행할 수 있을 것이다.

<화면 2> Checkout list

PL/SQL 툴의 다른 큰 특징으로는 디버거(Debugger) 기능이다. 일반적인 컴파일러와 유사한 형태로 PL/SQL(procedure, function) 등을 수행 스텝 별로 디버깅할 수 있다. 이 디버거 기능도 다른 외산 제품들은 고가로 팔고 있으나 오렌지는 기본으로 제공하고 있으니 이 또한 큰 장점이라 할 수 있다. 물론 이 PL/SQL 디버거 기능이 C++ 등의 디버거처럼 화려한 기능을 제공하지는 않지만, 기본적은 기능(변수 참조, Step into, Step over, Breakpoirt 등)은 지원한다. PL/SQL 툴에서 procedure, function을 컴파일할 때 컴파일 에러가 발생하게 되면 status 창에 오라클 에러 번호와 에러 메시지를 보여주는데, 이 에러 번호를 더블 클릭하면 그 에러가 발생한 PL/SQL의 부분으로 커서(cursor)를 이동시킨다. 이 기능은 개발자가 빠르게 에러의 위치를 파악하고 수정할 수 있도록 한다.


개발자의 데이터베이스 관련 툴을 사용하는 목적 중의 하나는 데이터베이스 내의 오브젝트를 참조하는 경우이다. 어떤 테이블이 있는지 해당 테이블에 어떤 컬럼이 있는지, 또한 제약사항, 인덱스 등을 확인하는 경우가 있다. 이렇듯 개발자가 SQL 작성시 참조하는 DB 오브젝트의 정보를 손쉽게 확인할 수 있는 스키마 브라우저 기능은 약 16개의 오브젝트를 윈도우의 탐색기와 같이 참조할 수 있도록 지원해 동시에 창을 열고 쉽게 다른 오브젝트를 참고할 수 있다. 물론 스키마 브라우저에서 16개 오브젝트를 검색하며 오른쪽 버튼을 누르면 그 오브젝트에 대한 작업을 할 수 있는 메뉴가 나타난다. 만약 constraint tab에서 오른쪽 버튼을 누르게 되면 ‘Describe, Add constraint, Enable Constraint, Disable Constraint, Drop object’ 등의 연관된 메뉴를 보여준다. 이는 각각의 오브젝트 타입에 따라 필요한 작업을 바로 할 수 있게 하는 기능이다.



DBA 측면의 유용한 기능들

DBA를 위한 기능은 스탠더드 에디션보다 DBA 에디션에 많다. DBA 에디션은 <표 1>과 같이 스탠더드 에디션의 모든 기능에 Space Manager, Security Manager, Instance Monitor, Graph & Report, Health Check, Analyze Manager, Log Miner가 있다.


스탠더드 에디션과 DBA 에디션의 차이는 DBA 기능은 주로 데이터베이스 전체 범위의 모니터링이나 점검, 전체 레벨의 작업을 지원하는 툴들이 대부분이라는 것이다. 가장 대표적인 DBA 지원 툴은 ‘Instance Monitor’이다. 이 툴은 데이터베이스 전반적인 상태를 표시해 주는데, 크게 9가지 부분으로 나눠져 있다. Buffer Cache Hit Ratio, Library/Dictionary Cache Hit Ratio, Connection 수, Active Transactions, Shared Pool Size usage, I/O block per Second, Redo size, Parse/Execution, Wait event 등을 한 눈에 볼 수 있게 주기적으로 그래프를 그려준다. 이 9가지 그래프들은 서로 시간적으로 연결돼 있어 한 그래프의 위치를 선택하면 나머지 8개의 그래프에 시간을 함께 보여줌으로 같은 시간의 정보를 비교해 점검해 볼 수 있다. 이전의 오렌지 2.0 버전에서는 로깅 기능이 없어서 현재 상태의 정보만을 볼 수 있었고 오렌지를 정지했다가 다시 사용할 때는 이전에 모니터링 결과는 무시되고 새로이 모니터링을 해야 했는데, 3.0 버전부터는 로깅 기능도 생겨서 정상적일 때와 부하가 있을 때의 상태를 비교해 볼 수 있다.


이 인스턴스 모니터는 데이터베이스의 전체적인 뷰를 확인하고자 할 때 사용한다. 특별히 이 인스턴스 모니터로부터 다른 Action은 취할 수 없고 현상만 보게 되지만 간단히 시스템의 상태를 보기에는 무리가 없다. 특히 wait event는 옵션 쪽에서 사용자가 특별히 관심 있는 오라클 wait event를 지정할 수 있어 사용자의 편의성을 갖추고 있다.

<화면 3> Instance Monitor의 사용화면

두 번째로 소개할 DBA의 툴 중에 Space Manager가 있다. 이것은 데이터베이스의 테이블 스페이스, 데이터 파일들의 사용량, redo log의 현황, 롤백 세그먼트의 현황을 확인하는 기능을 제공한다. <화면 4>는 각각의 오브젝트가 물리적으로 데이터 파일의 어떤 위치에 몇 개의 extent로 구성되어 있는지 맵 형식으로 한 눈에 보여준다. 이 화면을 통해서 데이터 파일(테이블 스페이스)이 얼마나 조각화가 됐는지 손쉽게 파악할 수 있으며 오브젝트의 실제 저장 위치를 확인 할 수 있다. 다만 블럭의 맵을 그릴 때 약간의 시간이 걸린다는 아쉬움이 남는다(여러 번 튜닝을 했다고는 하는데, 작업량 자체가 많은 관계로 쉽게 빨라지지 않는 것 같다).

<화면 4> Space Manager 데이터 파일 맵

상세한 정보를 제공하는 세그먼트 인포 탭

그리고 <화면 5>와 같이 세그먼트 인포 탭을 보게 되면 해당 오브젝트가 할당 받은 공간 중에 얼마만큼의 블럭을 사용하고 있고, 얼마만큼의 여유 블럭이 있는지 확인할 수 있다. 세그먼트 Usage 바 차트를 보면 진한 파란색, 파란색, 연한 파란색, 하얀색 등으로 구분되어 있는데, 블럭의 사용 정도에 따라 색깔을 달리해 정확한 정보를 시각적으로 보여준다. 이 정보를 이용해 이미 할당 받은 공간의 내부 사용량을 점검함으로써 추가적인 공간 할당이 언제쯤 필요하게 될지 판단하는데 도움이 된다. 보통은 이미 할당한 공간은 모두 사용하는 것으로 간주하고 테이블 스페이스의 공간 할당 계획을 수립하게 되는데, 좀 더 자세한 정보를 이용해 상세한 공간 할당 계획을 수립할 수 있다. 이러한 기능은 여타 다른 툴에서는 찾아보기 어려운 상세한 정보를 제공하는 기능이다.
<화면 5> Space Manager 세그먼트 인포

DBA 에디션에서 빈번히 사용되는 기능 중 하나로 Health Check 기능을 꼽을 수 있는데, 이는 데이터베이스의 전반적인 점검 부분들을 한 번에 점검해 HTML 형식의 리포트를 생성해 준다. 크게 General, SGA, Wait Event, I/O, Space, Access Type, MTS, OPS(RAC)의 8가지로 나뉘며, 각각의 부문별로 점검해야 하는 통계량 및 데이터베이스 운영 내역을 검토해 점검 리포트를 생성한다. 리포트에는 각각의 점검 내역에 대한 자세한 가이드도 제공되어, 문제점이 발견됐을 경우 어떠한 조치를 취해야 하는지 DBA가 쉽게 알 수 있다. 이 Health Check 기능에서 점검하는 점검 리스트들은 데이터베이스 튜닝 및 컨설팅 경험이 있는 여러 명의 노하우가 집약되어 만든 것이다.


그러므로 Instance Monitor와 Health Check 기능을 통해서 데이터베이스 관리자는 관리하고 있는 데이터베이스 상태와 일일 점검 작업을 손쉽게 수행할 수 있다. 다만 오렌지에서 제공되는 기능은 고객의 환경 및 상황에 만족되지 않을 수 있다. 즉, 오렌지에서 이미 정의된 내용이 아닌 고객의 환경에 관련한 점검이 필요한 경우에는 Instance Monitor와 Health Check 기능으로도 점검이 되지 않는다. 이러한 고객의 특화된 부분을 위해 Graph & Report 툴을 제공한다. 이 Graph & Report는 개발 초기에 ‘토마토’라고 불리었고, 오렌지와는 별도로 개발되다가 오렌지의 한 개 툴로서 통합됐다.


Graph & Report에서는 Health Check에서 수행되지 않는 다양한 점검 스크립트가 미리 정의돼 있으며, 사용자가 직접 새로운 스크립트를 정의할 수 있는 User Define Group을 통해 원하는 스크립트를 생성해 모니터링하고 이를 차트로 표현될 수 있도록 제공한다.


DBA 에디션에서 제공되는 Log miner 툴은 오라클의 log miner 기능을 이용해 이미 수행된 작업들에 대한 상세 내역을 편리하게 확인할 수 있다. 이 log miner 사용자에게 오라클 log miner package의 사용법을 숙지하지 않더라도 손쉽게 데이터베이스 작업 이력을 확인해 볼 수 있다.

<표 2> 오렌지의 DBA 지원 기능
구분 DBA 지원 기능
Space Manager Tablespace, Datafile의 물리적인 저장 공간 할당 정보 제공. 테이블스페이스 추가, 변경, 데이터 파일 추가 변경 지원, 특히 세크먼트 인포에서는 할당된 익스텐트 내부의 블럭들의 사용 정도를 상세하게 보여줌
Security Manager User, Role, Privilege, Profile 등의 권한 관리 기능 제공
Instance Monitor 데이터베이스의 기본적인 SGA 모니터링 기능 제공, 9개의 기본적인 차트를 지원하며 특히 wait event는 사용자가 선정해 구성 가능하다. 히스토리 관리를 위해 로깅기능 제공
Graph & Report 특정 SQL의 반복 수행을 이용한 그래프 작성 제공, User Define SQL의 수행 및 그래프 작성 제공
Health Check 10여명의 컨설턴트에 의해 선별된 데이터베이스의 기본적인 Health Check 및 Report 제공, OPS, RAC, MTS 관련 지원
Analyze Manager Table, Index에 대한 통계치 생성 및 관리 기능 제공, 특히 대량의 통계치 생성 작업시 테이블의 크기나 건수에 따라 완전분석(compute)이나 예측분석(estimate)이 가능
Log Miner Redo log/ Archive log에 대한 Log miner 분석을 쉽게 할 수 있는 기능 제공


튜너 측면의 유용한 기능들

오렌지의 태생이 튜너의 작업 지원을 위해서 개발됐다는 것은 이미 앞에서 언급했다. 즉, 튜너의 작업시 필요한 많은 기능이 오렌지에는 포함되어 있다.

SQL 튜닝에 강력한 기능을 갖고 있는 '오렌지'

오라클 데이터베이스 관련 튜닝이라고 하면 크게 두 가지로 나눌 수 있는데, 하나는 데이터베이스 튜닝이고 나머지는 SQL 튜닝이라 할 수 있다. 오렌지는 후자의 SQL 튜닝에 강력한 기능들을 많이 갖고 있으며, 전자인 데이터베이스 튜닝 기능도 보유하고 있다. 앞서 설명한 개발자 기능, DBA 기능에도 데이터베이스 튜닝을 위한 점검 기능이 포함되어 있으며, 특히 SQL Monitor, Instance Monitor, Session Monitor, Transaction Monitor, Lock Monitor는 데이터베이스 튜닝시에 자주 사용되는 기능이다.


SQL Monitor에서는 데이터베이스에 다양한 옵션을 이용해 부하를 많이 주는 SQL을 찾을 수 있으며, Instance Monitor에서는 주된 병목 현상이 어떤 부분에서 발생하는지 쉽게 확인할 수 있다. Session Monitor에서는 데이터베이스에 접속한 세션들의 작업 내역을 데이터베이스 통계치 기준으로 자원을 많이 사용하는 세션들을 편리하게 점검할 수 있다. 여기에서는 SQL을 튜닝하는 것을 중점적으로 설명하겠다.

대표적 튜닝 지원 기능 ‘Plan 툴’

대표적인 튜닝 지원 기능으로는 ‘Plan 툴’이라고 할 수 있다. Plan 툴은 개별 SQL의 수행 계획(Execution Plan)을 보여주며, 수행 계획의 각 단계별로 위치하는 오브젝트의 정보를 손쉽게 확인해 볼 수 있다. 단지 더블 클릭만으로 테이블의 컬럼 정보, 인덱스 정보, 그리고 테이블의 통계치 등을 확인해 볼 수 있다. 또한 하나의 SQL에 포함되어 있는 모든 테이블과 인덱스 정보를 수집할 수 있다. 물론 이러한 static 정보만을 갖고 정확한 튜닝 결과를 도출 할 수 없다. 이에 Plan 툴에서는 실시간 SQL Trace 기능을 지원한다. 오라클에서 SQL trace를 생성해 이 trace file을 실시간으로 읽기 편한 포맷으로 분석해 사용자에게 제공한다. 10046 이벤트를 이용한 여러 레벨의 trace를 지원하며, SQL 내부에 있는 bind 변수 값, wait event 및 실제 수행되는 시간을 정확하게 분석할 수 있다.



오라클의 tkprof 없이 자체 엔진으로 trace file을 분석한다?

오렌지를 사용하지 않는 경우에는 SQL의 trace를 걸어서 trace file을 확인하고, 오라클에서 제공하는 tkprof를 이용해 포맷팅을 해서 trace 결과를 확인하는 5∼6단계의 작업이 필요하나, plan 툴의 실시간 trace 기능을 사용하면 버튼 하나로 모든 작업이 완료돼 빠르게 튜닝 작업을 할 수 있다. 여기서 오렌지의 특이한 점은 trace file을 분석하기 위해서 오라클의 tkprof를 사용하지 않고 자체적으로 엔진을 만들어 trace file을 분석하는 것이다. 이렇게 자체적으로 엔진을 만들어서 사용하는 까닭은 오라클 서버의 tkprof를 이용해 분석하는 경우, 서버에 tkprof를 수행할 수 있도록 셸 프로그램 등을 구성해야 하는 구조적인 문제(오렌지는 서버에 에이전트가 없는 가벼운 구조이다)와 클라이언트 반응 시간, Wait Event 정보와 같은 더 많은 분석 정보를 주기 위해서다.


SQL 튜닝을 하는 과정에 하나의 SQL을 여러 방법으로 수정해 보고 작업하게 되는데, Plan 툴에서는 멀티 탭 기능을 이용해 여러 개의 SQL 버전을 만들어서 튜닝 작업을 할 수 있다. 물론 이런 변형된 SQL들을 각각 trace를 할 수 있으며, 이러한 모든 결과는 Workspace 개념으로 저장 및 로드할 수 있다(PTD 파일로 저장이 된다). 이 Workspace 개념은 개발자와 튜너와의 통신 수단으로 사용되곤 한다. 개발자가 개발한 SQL의 성능이 나오지 않을 경우에는 1차적인 Trace 및 통계정보를 workspace로 저장해 튜너에게 튜닝 요청을 하게 되면, 튜너는 이 workspace를 로드해 바로 튜닝 작업을 진행할 수 있으며 튜닝이 완료되면 수정된 SQL과 이에 따른 trace 정보를 다시 개발자에게 workspace로 저장해 전달할 수 있다.

<화면 6> Plan 툴

이 Plan 툴에서는 Run time execution plan을 보여준다는 것도 특징이다. SQL이 수행되는 과정은 크게 『파싱 | 바인딩 |수행』으로 나뉘는데, 지금까지는 실행 계획을 파싱 단계에서 수립해 수행했다. 그런데 오라클 데이터베이스 9i 버전부터는 bind peeking이라는 기능이 있어서 바인딩 단계에서 변수 값을 이용해 새로이 실행 계획을 생성하는 것이다.


그러므로 수행 계획만을 체크했을 때와는 달리 실제 수행 계획이 달라지는 경우가 종종 있다.


이러한 차이점은 개발자나 튜너를 황당하게 만드는데, 이렇게 차이가 나는 실행 계획은 확인시켜 줄 수 있다. Plan 툴의 내부 기능인 Trace를 독립적인 Trace 툴로 제공하고 있는데, 이는 Trace를 오라클 전체적인 방법으로 수행하거나, 이미 trace가 생성되어 있는 경우 이 파일을 분석하는 형태로 사용하기 때문에 추가된 것이다. 또한 포맷팅된 결과로 볼 수도 있지만 종종 로우 파일(Raw file) 형태의 참조가 필요한 경우를 대비해 로우 파일의 참조도 지원한다.



미래의 오렌지에 대한 기대

지금까지 오렌지가 개발자, DBA, 튜너에게 어떠한 기능을 제공하는지에 대해 알아봤다. 이 글에서 언급한 내용이 오렌지의 모든 기능은 아니지만, 자칫 매뉴얼처럼 될 것을 우려해 오렌지가 갖고 있는 기능 중에 사용자들이 가장 많이 사용하고 많은 도움을 주는 기능 위주로 설명해 오렌지를 선택하고자 하는 고객에게 객관적인 정보가 됐으면 하는 바람이다.


오렌지 역시 버전이 업그레이드되며 사용자 중심의 기능들이 많이 추가됐다. 하지만 앞으로 좀 더 해야 할 일이 많은 것 역시 현재의 숙제이다. 오라클 9i, 오라클 10g, 그리고 2005년 8월 말에 출시될 오라클 10g R2의 새로운 기능들을 사용자들이 손쉽게 접근하고 활용할 수 있는 그러한 오렌지로 변신해야 할 것이다. 아직까지는 오라클 8, 오라클 8i, 그리고 오라클 9i를 지원하는데 머물러 있기 때문에, 향후 1∼2년 이내에 오라클 10g의 장점을 표현해 주지 못한다면 시장에서의 입지는 좁아질 것이다.


오라클 10g에서 제공되는 기본 기능에는 AWR(Automatic Workload Repository), ADDM(Automatic Database Diagnostic Manager) 등이 있다. 이 기능들은 데이터베이스의 운영 상태, 문제점, 병목 현상의 원인 등을 모니터링 툴이 없어도 될 정도의 데이터를 제공한다. 이렇게 풍부한 데이터를 어떻게 효율적으로 사용자에게 제공하느냐가 다음 버전 오렌지의 발전에 계기가 될 것이다.


출처 :




오라클 데이터베이스 환경에서 쉽고, 빠르게 개발의 효율성과 생산성을 높이고, 성능의 최적화를 구현하는 어플리케이션 개발 및 성능 튜닝 툴


제품목적
SQL과 PL/SQL개발 및 튜닝, 모니터링을 빠르고 쉽게 할 수 있는 인터페이스를 제공함으로써 사용자의 생산성을 향상 시킨다.

사용대상
ORACLE DB를 액세스 하기 위한 SQL(Structured Query Language), PL/SQL을 작성하는 개발자와 SQL 튜닝과 모니터링을 하는 DBA

운영환경
  • CPU : Pentium 133 이상
  • 메모리: 64 MB 이상
  • Software Platform: Windows 9x/NT/Me/2000/xp
  • SQL*Net 최소 : 8.0.5, 권장 : 8.1.7 이상 (http://otn.oracle.co.kr/software/)
  • Oracle RDBMS: Oracle 7.3 이상
  • Disk Space : 10MB

Orange 특장점
  • 현업 개발자들이 요구하는 핵심기능에 충실
  • 뛰어난 인터페이스
  • 오라클 경력이 많은 컨설턴트들의 실전을 통해 검증된 방법 및 interface 제공
  • 모든 기능이 통합형으로 제공
  • 순수 국내기술
    • 사용자들의 추가 요구사항에 신속한 대응
    • 한글 매뉴얼 및 HELP 제공
    • 기술축적에 따라 저렴한 가격으로 다양한 DB TOOL software 제공

Architecture



제품종류
  • Standard Edition
    • Schema Browser
    • Query Builder
    • SQL Tool
    • PL/SQL Tool
    • Description Tool
    • Table Editor
    • Plan Tool
    • Trace Tool
    • Database Information
    • Network Configuration Tool
    • Expert Tool
    • Import Tool
    • File Editor
    • Loader
    • Latch Monitor
    • Transaction Monitor
    • ERP Monitor
    • SQL Monitor
    • Session Monitor
    • Lock Monitor
    • Data Dictionary Tool
  • DBA Edition
    • Space Manager
    • Security Manager
    • Instance Monitor
    • Graph & Report
    • Health Check
    • Analyze Manager
    • Log Miner
  • Reorg Edition
    • Reorg Manager
      dbms_redefinition 패키지를 사용하여 테이블 온라인 REORG 및 REORG 대상 추출

  • Trusted Edition
    DB 사용자가 의도적으로 외부유출을 목적으로 데이터를 액세스하거나 또는 비의도적인 실수에 의하여 문제가 발생하는 것을 사전에 차단하기 위하여 DB 액세스 시 사전 등록된 내부결재 프로세스를 거친 SQL만 실행하도록 하는 기능을 갖춘 사전 보안감시용 툴
반응형
Posted by [PineTree]
ORACLE/ADMIN2009. 11. 20. 17:22
반응형


리스너 포트 1525 em포트 1082

 emca -config dbcontrol db -repos recreate -SID ora11gr2 -PORT 1525 -ORACLE_HOME /u0/app/ora11gr2/product/11gr2/db_1 -DBCONTROL_HTTP_PORT 1082

반응형

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

sqlplus 환경 설정  (0) 2009.12.09
oracle 권한확인  (0) 2009.12.04
DBLINK시 LOB CLOB 컬럼오류 해결  (0) 2009.11.20
logminer + 불완전 복구  (0) 2009.11.19
Index Coalesce VS. Shrink  (0) 2009.11.06
Posted by [PineTree]
ORACLE/ADMIN2009. 11. 20. 13:50
반응형

-- DB링크를 만든다.

CREATE DATABASE LINK DB링크명
CONNECT TO scott IDENTIFIED BY tiger USING 'DB링크명';

 

-- 원격테이블의 컬럼에 clob 혹은 long과 같은 데이터 타입이 존재한다.
select * from 원격테이블@DB링크명
where rownum = 1
-- 에러가 발생한다.  ORA-22992:원격테이블로부터 선택된 LOB위치를 사용할 수 없습니다.


-- 따라서 로컬에 원격지의 테이블을 만들고 그대로 만들어 준다.
create table temp_원격테이블
as
select * from 원격테이블@DB링크명
where 1=2;

-- 그리고나서 원격지 테이블을 그대로 insert해온다.
insert into temp_원격테이블
select * from 원격테이블@DB링크명


-- 이제 로컬테이블로 되어 있다.
select * from temp_원격테이블
where rownum = 1;


반응형

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

oracle 권한확인  (0) 2009.12.04
emca 재구성  (0) 2009.11.20
logminer + 불완전 복구  (0) 2009.11.19
Index Coalesce VS. Shrink  (0) 2009.11.06
REDO log buffer 캐쉬의 튜닝 및 REDO Latch 경합의 해결 방법  (0) 2009.11.06
Posted by [PineTree]
ORACLE/ADMIN2009. 11. 19. 14:29
반응형

logminer사용하기~!! 


1. 파라미터 파일에 dictionary file 이 생성될 위치를 지정한다.

    utl_file_dir="d:\oracle"    -->> spfile을 사용할 경우 alter system set utl_file_dir='c:\oracle\ora92\logminer') scope=sfpile; 을 사용하여 dict파일을 생성될 위치를 생성해주면 된다!!

 


2. db 를 restart 한다.


  SQL> shutdown immediate

  SQL> startup

 


4. dbms_logmnr_d.build 를 사용하여 dictionary file을 생성시킨다.


   SQL> execute dbms_logmnr_d.build('dir_file','c:\oracle\ora92\logminer);

 

   PL/SQL 처리가 정상적으로 완료되었습니다.

 

 

 

5. 분석할 아카이브 로그파일및 리두로그파일을 추가시킨다.

 

   SQL>  execute dbms_logmnr.add_logfile('d:\oracle\oradata\ocp\redo01.log',dbms_logmnr.new);

 

    PL/SQL 처리가 정상적으로 완료되었습니다.

 

 

 

 

 

< 참조문서: 분석을 위한 Redo log 지정하기 >

   dictionary file을 생성하였으면 이제 redo log를 분석할 수 있다.
   첫 단계로, 분석하고 싶은 log file을 ADD_LOGFILE procedure를 이용하여
   지정한다. procedure의 parameter로 NEW / ADDFILE / REMOVEFILE 등의 상수를
   이용한다. 값을 지정하지 않을 경우 default로 ADDFILE이 배정된다.

   각 상수의 값은 다음과 같다.

 - NEW : 1
 - ADDFILE : 3
 - REMOVEFILE : 2

 

   1. sqlplus를 사용해서 Oracle Instance를 기동한다.
  SQL> startup

 

   2. dbms_logmnr.add_logfile procedure에 NEW parameter를 지정함으로써
       log의 리스트를 만든다. log는 online redo log file이거나 archived
       log file 중에서 지정해야 하고 일반 filie을 지정할 경우 error가 발생한다.

      SQL> exec dbms_logmnr.add_logfile('/home2/o8ii/oradata/o8ii/redo01.log',1);

 

   3. log 리스트에 첨가하는 작업
      SQL> exec dbms_logmnr.add_logfile('/home2/o8ii/oradata/o8ii/redo02.log',3);

 

   4. log 리스트에서 삭제하는 방법
      SQL> exec dbms_logmnr.add_logfile('/home2/o8ii/oradata/o8ii/redo02.log',2);

 


6. 분석 시점을 지정한다.

    SQL> execute dbms_logmnr.start_logmnr(dictfilename=>'d:\oracle\dir_file',-
       starttime=>to_date('2005/08/09 15:55:10','RRRR/MM/DD HH24:MI:SS'),-
       endtime=>to_date('2005/08/09 16:05:10','RRRR/MM/DD HH24:MI:SS') );

 

    PL/SQL 처리가 정상적으로 완료되었습니다.

 

또는 파일 이름을 지정하면 된다!!~!! 시점을 지정해서 검색도 가능하다!!!

 


7. v$logmnr_contents  를 조회하여 원하는 정보를 추출한다.

     
   SQL> alter session set nls_date_format='RRRR/MM/DD:HH:MI:SS';

 

 

   SQL> col seg_owner for a10


   SQL> col username for a10

 

   SQL> col sql_redo for a30

                                                                                                                                                                                                                                       
                                                                                                                                                                                                                                                                                    
    SQL> select timestamp,seg_owner,username, sql_redo from v$logmnr_contents
             where sql_redo like '%drop%';

TIMESTAMP              SEG_OWNER     USERNAME                 SQL_REDO                                                                                                                                                                                                                                     
------------------- ---------          --------------------- ---------------                                                                                                                                                                                                               
2005/08/09:03:57:33 SYS                  SYS                          drop table emp900;

 

 

 

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

 

 

 

 

로그마이너를 통해 원하는 시점의 log정보를 검색해서 내가 어느 시점에 파일을 drop시켰는지 변경했는지를 알 수 있다!!

그 후 데이터베이스의 테이블을 불완전 복구하면 원하는 시점으로 테이블을 복구 할 수 있다!

예를 들어 내가 2008년 7월 22일 15:00:00 시에 scott의 emp테이블을 drop했을경우 나는 오프라인 백업데이터를 가져와 그 시점까지만 복구하면 drop하기 바로전까지 복구 할 수 있는 것이다

 

1.백업된 파일은 내 데이터 베이스로 복사해온다...

 

2.불완전 복구작업을 수행할 때 가장 중요한 포인트 중에 하나는 마지막 오프라인 백업된 모든 데이터 파일들을 현재 경로로 복사해야 한다는 것입니다.

이때 ctl파일이나 redo파일등은 복사할 필요 없고, 데이터 파일이 깨진 것이므로 모든 데이터 파일만 복사하면 된다.

 

불완전 복구 방법에서는 특정 파일만 재 설치해서는 모든 데이터를 과거 특정시점으로 되돌릴 수 없기 때문에 반드시 모든 데이터를 과거 시점으로 복구해야 하기 때문이다!!!

 

 

 

3.startup mount

 

4.SQL> set autorecovery on --->> recover database 실행하여 아카이브 적용시 자동으로 auto를 적용시켜줌

 

5.SQL> recover database until time '2008-07-22 15:33:00';

 

6.SQL> alter database open; until time을 사용하여 복구해서 datafile의 scn이 다르기 때문에 resetlogs를 사용하여 강제로 scn과 모든 상태정보값을 초기화 시킨 후 오픈하여야 한다~!

 

7.SQL> alter database open resetlogs;

 

 

 


ORACLE10G 에서 추가된 LOGMINER 의 기능
======================================

출처:한국오라클 불리틴

 

PURPOSE
-------
이 자료는 Oracle10g version에 추가된 LogMiner 기능에 대해 설명한다.

 

Explanation
-----------
Oracle10g LogMiner 에서는 아래의 기능들이 추가되었다.


1.  LogMiner in a Shared Server Environment

 

기존에는 Dedicated mode에서만 logminer실행이 가능했으나 Oracle10g 에서는 MTS 환경에서도 logminer의 실행이 가능하다.


2.  Support for Index Organized Tables

 

Logminer 는 IOT 에 대해서도 Logminer를 통해서 정확한 record 변화를 찾을 수 있다. Oracle9i 까지는 Logminer에서 IOT 를 지원하지 못했다.


3.  Support for new datatypes

 

LogMiner 10g 에서는 아래의 data type을 redo/undo transaction에서 정확히 반영하게 되었다.  즉, 아래의 parameter가 새로

지원된다.

 

  - LONG
  - Multibyte CLOB
  - NCLOB


4.   SQL_REDO/SQL_UNDO without rowids - NO_ROWID_IN_STMT

 

DBMS_LOGMNR.START_LOGMNR procedure실행시에 NO_ROWID_IN_STMT option을 추가할 수 있다. 이 기능은

v$logmnr_contents view의 SQL_REDO 와 SQL_UNDO column에서 rowid 를 나타내지 않도록 하는 option이다.

이 rowid 를 나타내지 않으면 이 sql들을 rowid 가 다른 환경에서도 사용할 수 있으므로 더 유용하다.  logminer 기능을  object가

원래 있는 db가 아닌 다른 db에서 실행할 때 이 기능을 이용하여 rowid 가 아닌 primary key 등에 의해 sql 을 적용할 수 있다.

 

[예제]

SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(-
         OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + -
         DBMS_LOGMNR.NO_ROWID_IN_STMT);

 

5.  Removing a logfile from the LogMiner session

 

Oracle9i 까지는 Logminer session을 실행하여 log file이나 archiving file을 add한 후에는 list 에서 삭제할 수가 없었다. 

Oracle10g 부터는 add한 file을 삭제할 수 있는 기능이 추가되었다.

이 기능은 다음과 같이 DBMS_LOGMNR.REMOVE_LOGFILE()를 이용하여 가능하다.

[예제]

SQL>  EXEC DBMS_LOGMNR.REMOVE_LOGFILE(LOGFILENAME => '/oracle/logs/log2.f');


만약 위와 같이 logfile을 삭제한 후에 바로 v$logmnr_contents view를 조회하면
아래와 같이 ora-1306 error가 발생한다. 그러므로 다시 DBMS_LOGMNR.START_LOGMNR 를
실행한 후 조회해야 한다.


SQL>  select count(*) from v$logmnr_contents;
 select count(*) from v$logmnr_contents
                      *
ERROR at line 1:
ORA-01306: dbms_logmnr.start_logmnr() must be invoked before selecting from
v$logmnr_contents

 

Reference Documents
-----------------
<Note:249001.1>


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

반응형
Posted by [PineTree]
ORACLE/ADMIN2009. 11. 6. 13:57
반응형
delete from t1 where c1 = 'GRACE';

이와 같은 방식으로 random으로 많은 양의 데이터가 삭제될 경우,
인덱스의 leaf block이 드문드문하게 채워져 있게 된다. (Index Fragmentaion)

물론, 장기적으로는 삭제된 공간은 재활용 될 수 있지만
인덱스는 sorting 되어야 한다는 특징에 의하여
Key 값이 들어갈 수 있는 자리가 정해져 있으므로 삭제된 공간을 재활용하지 못할 수 있다.

[Oracle Virus] - 왜 Index가 불필요하게 커지는가? 를 참조하면, 위 내용을 이해할 수 있다.

이 경우,

INDEX OFFLINE REBUILD
INDEX ONLINE REBUILD
INDEX SHRINK
INDEX COALESCE
를 통해 fragmentation 된 leaf 블록들을 정리한다.

이중, coalesce와 shrink는 Oracle 10g부터 동일한 방법(delete + insert)으로 수행되고,
Leaf block 간의 key 값을 compact 하는 것이므로 index의 높이에는 변화가 없다.

단, coalesce는 compact를 통해 확보된 index의 Free block들을 반환하지 않으므로,
Index의 fragmentation을 정리하지만 Index의 크기는 변하지 않는다. 

반면, Shrink는 compact를 통해 확보된 index의 Free Block들을 반환하고 HWM를 조정하므로
Index의 Fragmentation을 정리함과 동시에 Index의 크기를 줄인다.

# Coalesce TEST
 

-- Create Table
drop table t1 purge;

create table t1(c1 number, c2 varchar(10));

insert into t1
select level, 'GRACE'
from dual
connect by level <= 10000;

commit;

-- Create index on C1 column
create index t1_idx on t1(c1);

-- See Index Structure
analyze index t1_idx validate structure;

select height, blocks, lf_blks, br_blks, btree_space, pct_used
from index_stats;

-- t1_idx 는 총 32블록으로 이루어져 있으며, 21개 leaf block에
-- 176,032Byte의 공간을 사용하고 있다.

HEIGHT     BLOCKS    LF_BLKS    BR_BLKS BTREE_SPACE   PCT_USED
---------- ---------- ---------- ---------- ----------- ----------
         2         32         21          1      176032         86
 
-- Delete 25% of rows
 
delete t1 WHERE mod(c1,4) = 1;
 
commit;
 
-- View before and after value of redo size
set serveroutput on
 
exec print_table('-
select n.name, s.value -
from v$mystat s, v$statname n -
where s.statistic# = n.statistic# -
and n.name = ''redo size''');
 
NAME                          : redo size
VALUE                         : 6196312
 
-- Coalesce the index
 
alter index t1_idx coalesce;
 
-- View before and after value of redo size
exec print_table('-
select n.name, s.value -
from v$mystat s, v$statname n -
where s.statistic# = n.statistic# -
and n.name = ''redo size''');
 
NAME                          : redo size
VALUE                         : 6543908

--Coalesce 를 통해 347,596Bytes의 Redo가 발생하였다.

 
-- See Index Structure
analyze index t1_idx validate structure;
 
select height, blocks, lf_blks, br_blks, btree_space, pct_used
from index_stats;
 
-- coalesce 후에도 t1_idx 는 총 32블록으로 이루어짐은 변화가 없고
-- leaf block의 수가 21-> 16개로 변화하였다.
-- 136,032 Byte의 공간을 사용하고 있다.
 
HEIGHT     BLOCKS    LF_BLKS    BR_BLKS BTREE_SPACE   PCT_USED
---------- ---------- ---------- ---------- ----------- ----------
         2         32         16          1      136032         83

# Shrink TEST 

-- Create Table
drop table t1 purge;
 
create table t1(c1 number, c2 varchar(10));
 
insert into t1
select level, 'GRACE'
from dual
connect by level <= 10000;
 
commit;
 
-- Create index on C1 column
create index t1_idx on t1(c1);
 
-- See Index Structure
analyze index t1_idx validate structure;
 
select height, blocks, lf_blks, br_blks, btree_space, pct_used
from index_stats;
 
-- t1_idx 는 총 32블록으로 이루어져 있으며, 21개 leaf block에
-- 176,032Byte의 공간을 사용하고 있다.

HEIGHT     BLOCKS    LF_BLKS    BR_BLKS BTREE_SPACE   PCT_USED
---------- ---------- ---------- ---------- ----------- ----------
         2         32         21          1      176032         86
 
-- Delete 25% of rows
 
delete t1 WHERE mod(c1,4) = 1;
 
commit;
 
-- View before and after value of redo size
set serveroutput on
 
exec print_table('-
select n.name, s.value -
from v$mystat s, v$statname n -
where s.statistic# = n.statistic# -
and n.name = ''redo size''');
 
NAME                          : redo size
VALUE                         : 9655888
 
alter index t1_idx shrink space compact;
 
-- View before and after value of redo size
exec print_table('-
select n.name, s.value -
from v$mystat s, v$statname n -
where s.statistic# = n.statistic# -
and n.name = ''redo size''');
NAME                          : redo size
VALUE                         : 10071192
 
-- Shrink space compact 시에 415,304 Byte의 Redo가 발생하였다.
-- Coalesce 시 발생한 347,596Bytes보다 더 많은 양의 Redo가 발생하였다.
 
-- See Index Structure
analyze index t1_idx validate structure;
 
select height, blocks, lf_blks, br_blks, btree_space, pct_used
from index_stats;
 
-- Shrink space compact 수행 후는 coalesce 와 같은 결과를 보인다.
-- t1_idx 는 총 32블록으로 이루어짐은 변화가 없고
-- leaf block의 수가 21-> 16개로 변화하였다.
-- 136,032 Byte의 공간을 사용하고 있다.
 
HEIGHT     BLOCKS    LF_BLKS    BR_BLKS BTREE_SPACE   PCT_USED
---------- ---------- ---------- ---------- ----------- ----------
         2         32         16          1      136032         83
 
shrink space 명령을 수행한다.
 
exec print_table('-
select n.name, s.value -
from v$mystat s, v$statname n -
where s.statistic# = n.statistic# -
and n.name = ''redo size''');
NAME                          : redo size
VALUE                         : 10071872
 
-- SHRINK SPACE the index
ALTER INDEX t1_idx SHRINK SPACE;
 
exec print_table('-
select n.name, s.value -
from v$mystat s, v$statname n -
where s.statistic# = n.statistic# -
and n.name = ''redo size''');
 
NAME                          : redo size
VALUE                         : 10081736
 
-- Shrink space 시에 9,634 Byte의 Redo가 발생하였다.
-- Shrink space compact 후 shrink space를 수행하므로
-- coalesce 보다는 더 많은 양의 Redo가 발생한다
 
-- See Index Structure
analyze index t1_idx validate structure;
 
select height, blocks, lf_blks, br_blks, btree_space, pct_used
from index_stats;
 
-- Shrink space 수행 후, t1_idx 는 총 32-> 24블록으로 줄어들었다.
-- Free Block들이 Tablespace로 반환되었음을 알 수 있다.

HEIGHT     BLOCKS    LF_BLKS    BR_BLKS BTREE_SPACE   PCT_USED
---------- ---------- ---------- ---------- ----------- ----------
         2         24         16          1      136032         83
 
출처 : http://graceoracle.tistory.com/
반응형
Posted by [PineTree]
ORACLE/TUNING2009. 11. 6. 13:53
반응형


현재 많은 종류의 Oracle 튜닝 책에 Update, Delete 시의 parallel operation 관련하여
Partition 이 되어 있지 않으면 single mode 로 처리된다고 되어 있다.
하지만 이것이 맞는말인가?
하나씩 테스트를 해보자
테스트 환경은 Oracle 10g R2(10.2.0.3) 버젼이다.

테스트 시나리오
--고객테이블(100 만건) 의 고객영문명에 serial update 와 parallel update 를 한번씩 한다.
--고객테이블은 파티션이 되지않은 테이블이다.

1.update test

/**************serial update 시작******************/
alter session disable parallel dml; -- parallel 을 disable 한다.

update tb_cus set cus_enm = '1'; -- 100만건 update(17초)

commit;


아래는 trace 결과 이다.
trace 결과 가 깨지는 점을 이해하기 바란다.

Call Count CPU Time Elapsed Time Disk Query Current Rows
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Parse 1 0.000 0.001 0 0 0 0
Execute 1 16.410 16.999 845 27205 1032475 1000000
Fetch 0 0.000 0.000 0 0 0 0
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Total 2 16.410 17.001 845 27205 1032475 1000000

Elapsed Time for Client(sec.): 17.000
Misses in library cache during parse: 0
Optimizer goal: FIRST_ROWS
Parsing user: SI31041 (ID=387)

Rows Row Source Operation
------- ---------------------------------------------------
0 STATEMENT
0 UPDATE TB_CUS (cr=27205 pr=845 pw=0 time=16998894 us)
1000000 TABLE ACCESS FULL TB_CUS (cr=27133 pr=845 pw=0 time=1000149 us)

/**************parallel update 시작******************/

alter session enable parallel dml; -- parallel 을 enable 한다.

update /*+ parallel(tb_cus 8) */ tb_cus set cus_enm = '1'; -- 100만건 update(8.7초)

commit;



Call Count CPU Time Elapsed Time Disk Query Current Rows
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Parse 1 0.000 0.000 0 0 0 0
Execute 1 0.170 8.700 0 6 1 1000000
Fetch 0 0.000 0.000 0 0 0 0
------- ------ -------- ------------ ---------- ---------- ---------- ----------
Total 2 0.170 8.701 0 6 1 1000000

Elapsed Time for Client(sec.): 8.701
Misses in library cache during parse: 0
Optimizer goal: FIRST_ROWS
Parsing user: SI31041 (ID=387)

Rows Row Source Operation
------- ---------------------------------------------------
0 STATEMENT
8 PX COORDINATOR (cr=6 pr=0 pw=0 time=8791448 us)
0 PX SEND QC (RANDOM) :TQ10000 (cr=0 pr=0 pw=0 time=0 us)
0 UPDATE TB_CUS (cr=0 pr=0 pw=0 time=0 us)
0 PX BLOCK ITERATOR (cr=0 pr=0 pw=0 time=0 us)
0 TABLE ACCESS FULL TB_CUS (cr=0 pr=0 pw=0 time=0 us)


2.delete test

update 테스트 결과 와 같이 parallel 옵션 사용시 전혀문제 없었음.
delete 테스트 결과는 생략함.


-- 테스트시 재미있는점은 PARALLEL 적용시에 TRACE 결과의 ROWS 에 DOP 수가 나온다는 점이다.
--일종의 버그인것 같다.

3.결론
파티션 되지않은 테이블을 update, delete 할때 parallel 옵션의 적용은 문제가
전혀 없는것으로 드러남.
V$PX_PROCESS 나 GV$PX_SESSION 등의 뷰에서도 정상적으로 Parallel Process 가 관찰되었다.
Parallel 관련 wait event 도 발생됨 .
따라서 최소한 10g 의 parallel 관련서적들은 모두 위의 테스트 결과대로
파티션되지 않은 테이블에 parallel update, delete는 적용되는걸로 수정하여야 한다.
하지만 테스트를 안해보고 서적을 집필한 저자나 출판사의 잘못만은 아니다.
왜냐하면 오라클 10g R2 Data Warehousing Guide 의 25-58에는 분명히 아래와 같이 적용불가능 하다고 나와 있다.

Parallel updates and deletes work only on partitioned tables.
If you are performing parallel UPDATE, MERGE, or DELETE operations, the DOP isequal to or less than the number of partitions in the table.

오라클 매뉴얼도 참조서적에 불과하다.
언제나 의심해보고 테스트를 해보아야 하는것을 잊지말자.

편집후기 :
Parallel DML은 내부적으로 쿼리변환(각각의 slave 쿼리가 Granule 단위로 쪼개짐)에 관계된다. 그런데 조나단루이스저서(cost base~) 의 9장을 참조해보면 쿼리변환과 관계해서 기능의 생명주기를 beta --> 처음으로 공식화 하는상태 -->최종상태 로 나타내고있다.
그런데 파티션 되지 않은 테이블의 parallel update, delete는 아직도 beta 상태인것 같다.
다시말하면 기능은 구현되어 있지만 여러가지문제들로 인하여 공식화 하지 않은상태라는 것이 필자의 생각이다.
참고로 11g 의 매뉴얼에도 10g 와 마찬가지로 공식적으로는 적용불가능이라고 되어 있다.
엑셈의 조동욱씨에 따르면 한가지 주의 할점은 Intra-partition parallelism이 항상 동작하는 것은 아니라는 것이다. 일부 제약이 있고, 또 제약이 없더라도 간혹 동작하지 않는 경우도 있는 것 같다고 한다.
이글을 쓰는데 도움을 주신 조동욱 수석과 비투엔의 김정삼 책임 오픈메이드 컨설팅의 김중국책임에게 감사드린다.

참조 URL :
1.http://youngcow.net/doc/oracle10g/server.102/b14223/usingpe.htm#CACEJACE
2.메타링크 문서제목 :What is Intra-partition parallelism, 문서 id : 241376.1

반응형

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

cursor_sharing 파라미터에 대한 테스트  (0) 2009.12.16
Literal SQL 조회하는 방법  (0) 2009.12.05
Oracle dump 뜨는 방법  (0) 2009.05.08
SQL Trace와 TKPROF 유틸리티  (0) 2009.03.19
통계정보의 이해  (0) 2009.03.03
Posted by [PineTree]
ORACLE/ADMIN2009. 11. 6. 11:10
반응형

이 문서는 REDO log buffer 캐쉬의 아키텍쳐의 이해, 및 SGA 구조에 관련해 튜닝 해야 할 문제를 찾아내 해결하는 방법에 대해 설명하고 있습니다.

 

1.REDO로그 버퍼란 무엇인가???

 

REDO log buffer는 SGA내에 존재하며 데이타베이스에 대한 변경에 관한 정보를 보관 유지하는 버퍼입니다. 이 정보는 REDO 엔트리에 격납됩니다. REDO 엔트리는 데이타베이스에 대해서 행해진 변경을 재실행하기 위해서 필요한 정보를 포함하고 있습니다. 필요에 따라서 개개의 REDO 엔트리는 데이타베이스의 복구에 사용됩니다.

 

REDO엔트리는 Oracle 서버 프로세스에 의해 유저의 메모리 영역으로부터 SGA에 있어서의 REDO log buffer에 카피됩니다. 이 때 REDO 로그 엔트리는 버퍼내의 영역에 차례로 써집니다. 백그라운드 프로세스의 LGWR는, REDO log buffer의 내용을 디스크상의 액티브한 온라인 REDO 로그 파일 (온라인 REDO 로그 파일 그룹)에 씁니다.

초기화 파라미터 LOG_BUFFER는 REDO log buffer의 사이즈를 바이트 단위로 지정한 것입니다. 1개의 트랜잭션(transaction), 혹은 다중의 트랜잭션(transaction)에서 대량의 REDO log buffer에의 기입이 발생하는 환경에서는 일반적으로는 이 값을 크게 해 로그 파일에 대한 I/O수를 줄일 수가 있습니다. LOG_BUFFER 사이즈의 설정에 관해서는 KROWN#18227을 확인해 주세요.

 

2.REDO 로그 Latch

 

데이터 블록에 대한 변경이 필요할 때 이하의 순서에 의해 REDO log buffer내에 REDO 레코드가 작성됩니다.

다른 프로세스가 해당 프로세스보다 높은 COMMIT SCN(System Change Number)를 생성하고 있지 않는 것을 확인한다.

 

■ REDO를 쓸 수 있는 스페이스가 있는지를 확인한다. 충분한 스페이스가 없는 경우는 LGWR가

   REDO log buffer의 내용을 디스크상의 REDO 로그 파일에 쓰거나 로그 스윗치를 실시한다.
■ REDO log buffer내에 필요한 스페이스를 할당한다.
■ REDO log buffer에 REDO 레코드를 카피하고, 리커버리 시에 사용 가능하도록 관련성 실시

데이타베이스에는 이 처리를 실행하기 위해 3개의 REDO Latch가 있습니다.

・redo copy latch


redo copy latch는 상기 순서를 실행하는 동안 보관 유지되고 있습니다. 빈 공간을작성하기 위해서 로그 스윗치가 실행되었을 때에 해방되어 로그 스윗치가 종료하면 다시 취득합니다.

 

・redo allocation latch


SGA내의 REDO log buffer에 대한 REDO 엔트리의 기입을 직렬화하기 위해서 사용됩니다. 트랜잭션(transaction)량이 적은 혹은 1 CPU의 서버인 경우에는 redo allocation latch는 redo copy latch를 획득하지 않고  REDO를 REDO log buffer에 씁니다.빈 스페이스를 획득하기 위해서 로그 스윗치가 필요하게 되는 경우는 이 Latch는 redo copy latch와 함께 해방됩니다. 이 Latch는 데이타베이스에 1개 밖에 없습니다.

 

・redo writing latch


LGWR 프로세스에 대해서 동시에 복수 프로세스에 의한 로그 스윗치의 요구가 발생하는 일을 막습니다.

빈 공간이 필요한 프로세스는 LGWR에 REDO 로그 버퍼로부터 REDO 로그 파일에의 쓰거나  혹은 로그 스윗치의 실행을 요구 하거나 단지 대기할까를 판단하기 이전에 이 latch을 취득해야 합니다.  

 

3.REDO Latch에 관한 인스턴스 파라메터

 

REDO log buffer에 있어서의 Latch 할당의 동작에 관련하는 2개의 파라미터가 있습니다.

 

・LOG_SIMULTANEOUS_COPIES

  시스템이 복수CPU를 가질 때 redo copy latch의 수를 제어

 

・LOG_SMALL_ENTRY_MAX_SIZE

  REDO log buffer에 REDO를 쓸 때 redo allocation latch를 취득할지 아닐지를 결정하는 기준

 

4.REDO로그 버퍼의 퍼포먼스 튜닝

 

REDO log buffer에 있어서의 경합은 모든 DML 및 DDL문은 실행전에 REDO 엔트리를 작성 할 필요가 있기 때문에 퍼포먼스상 중요합니다. 경합은 Latch 경합 혹은 REDO 로그 버퍼에 대한 빈 공간의 과도의 요구가 있는 것으로 확인할 수 있습니다. 이하에 열거한 2 종류의 경합이 발생하고 있는 일을 검출하는 것이 가능합니다.

 

・Latch 경합


다음의 SQL는 REDO 로그에 있어서의 Latch의 사용율을 표시하는 것입니다.

   

    SELECT  substr(ln.name, 1, 20) "latch type",
                  100*(misses + immediate_misses)/(gets +
                  immediate_gets + immediate_misses) "latch utilization(%)"
       FROM v$latch l, v$latchname ln
     WHERE  ln.name in ('redo allocation', 'redo copy')
      and ln.latch# = l.latch#;

 

이 결과 latch utilization가 1%를 넘는 경우 Latch 경합이 발생하고 있다란것을 의미합니다. redo copy latch의 전에 redo allocation latch의 튜닝을 실시하는 일을 추천합니다.redo allocation latch는 인스턴스에 1개 밖에 없기 때문에 redo allocation latch의 경합은 퍼포먼스상 영향도가 높기 때문입니다.

 

Oracle7,8i에서는 redo alocation latch의 경합이 발생하는 경우 LOG_SMALL_ENTRY_MAX_SIZE의 값을 낮추고 redo copy latch가 획득되기 쉽게 조정하는 것이 좋다. 추천치는 평균의 REDO 사이즈이며 이하의 SQL의 결과의 'redo size'를 'redo entries'의 값으로 나눈 값이 됩니다.

 

    SELECT value
       FROM v$sysstat
    WHERE name in ('redo size','redo entries');

 

다만 이 SQL를 실행할 때는 실전 환경과 같은 조건이 아니면 적절한 결과를 얻을수 없습니다. redo copy latch 경합이 발생하고 있는 경우는 LOG_SIMULTANEOUS_COPIES 파라미터를 증가시키는 것으로 새로운 redo copy latch를 추가시킬 수가 있습니다.이 파라미터의 추천치는 CPU수*2 가 됩니다.

 

Oracle8i에서는 redo allocation latch 경합이 발생하고 있는 경우, 특정의 처리에 대해서는  NOLOGGING 옵션을 사용하면 생성되는 REDO를 감소시킬수  있습니다

혹은 LOG_BUFFER 파라미터를 증가시키는 것으로 latch의 부하를 낮추는 것이 가능합니다. LOG_BUFFER 파라미터의 튜닝에 관해서는 KROWN#18227 로 소개있습니다.redo copy latch 경합이 발생하고 있는 경우 Oracle8 이전과 같이 LOG_SIMULTANEOUS_COPIES를 증가 시킨다.


・영역 할당의 리퀘스트의 경합


REDO log buffer의 영역 할당을 대기한 회수는 "redo buffer allocation retries"라는 통계로 카운트 됩니다. 다음의 SQL를 사용하고, 어플리케이션이 동작중의 통계치를 감시해야 합니다. 

   

    SELECT name,valus
     FROM v$sysstat
  WHERE name = 'redo buffer allocation retries';

 

"redo buffer allocation retries"의 값은 0인 것이 이상적입니다.
이 값이 증가 경향에 있는 경우에는 LOG_BUFFER 파라미터의 값이 너무 작을 가능성이 있습니다.
LOG_BUFFER의 튜닝 방법에 대해서는 Krown:18227을 참조하십시오.

반응형

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

logminer + 불완전 복구  (0) 2009.11.19
Index Coalesce VS. Shrink  (0) 2009.11.06
DDL - 오라클 Create table as select(CTAS)  (0) 2009.11.06
CTAS 를 통한 테이블 복제시 제약 조건  (0) 2009.11.05
[Oracle] Primary Key 수정  (0) 2009.10.30
Posted by [PineTree]
ORACLE/ADMIN2009. 11. 6. 10:36
반응형

1. CTAS시 가져오지 않는 항목들
---------------------
   - DEFAULT
   - CONSTRAINT(PK, FK, CHECK)
   - INDEX
   - Grant

   - Synonym

   - TRIGGER

     *. column name, type, length, not null은 가져옴.

 

2. 8.1.6 미만 버전
---------------------
   - 대량의 테이블을 SORT해서 넣을 경우 (group by를 이용)

     SQL> CREATE TABLE 복사테이블
                       UNRECOVERABLE
                       PARALLEL
                       TABLESPACE 테이블스페이스
          AS
          SELECT 컬럼1, 컬럼2, MIN(컬럼3), ...MIN(컬럼n)
            FROM 테이블
           GROUP BY 컬럼1, 컬럼2; 
<= 컬럼1, 컬럼2는 PK임.

 

3. 8.1.6 이상 버전
---------------------
   - 대량의 테이블을 SORT해서 넣을 경우 (order by를 지원)
     SQL> ALTER SESSION ENABLE PARALLEL DDL;
     SQL> ALTER SESSION ENABLE PARALLEL DML;
     SQL> ALTER SESSION SET HASH_AREA_SIZE=838860800; -- SORT_AREA_SIZE * 2   
     SQL> ALTER SESSION SET SORT_AREA_SIZE=419430400;   
     SQL> ALTER SESSION SET SORT_AREA_RETAINED_SIZE=419430400;   
     SQL> ALTER SESSION SET DB_FILE_MULTIBLOCK_READ_COUNT=256;

     SQL> CREATE TABLE 복사테이블
                       [ UNRECOVERABLE ]
                       PARALLEL NOLOGGING
                       TABLESPACE 테이블스페이스
          AS
          SELECT /*+ PARALLEL(A,16) */ *
            FROM 테이블 A
           ORDER BY ... ;

 

4. [UN]RECOVERABLE 제한사항
   - 파티션이나 LOB 테이블은 사용 불가
   - UNRECOVERABLE은 subquery 함께 사용할 때만 가능

반응형
Posted by [PineTree]
ORACLE/ADMIN2009. 11. 5. 19:44
반응형

CTAS 를 통한 테이블 복제시 제약 조건

 

   Local  Remote  
 Column Name, Type, Length    그대로 Copy 됨
 Column Default Value     No
 Index     No
 Constraint     No
 Not Null ( PK 에 의한 Not Null 포함 )    그대로 Copy 됨그대로 Copy 됨
 Grant     No
 Synonym     No
 Trigger     No

 

테스트 결과는 첨부 화일 참조 바랍니다.

 

1. CTAS 의 경우 Parallel Hint 는
   CT(Create Table) 에서는 사용하여도 의미가 없고(ORACLE 이 무시함),
   AS 에서만 Parallel Hint 를 사용한다.
   (As Select /*+ paralllel(a) parallel(b) */ * from tab1 a, tab2 b)
   식으로 사용한다.

2. 캐릭터셋의 다른 DBMS 간의 CTAS 사용시 Column Size 가 달리 될수 있다.
   [ 참고 - http://cafe.naver.com/prodba/2014 ]
   이 경우 _keep_remote_column_size=true 로 설정 후 DB Restart 후에 CTAS 를 사용하면 된다고함
   _keep_remote_column_size 파라미터의 의미 : remote column size does not get modified
   Default 값은 False 임  

3. 그럼 가장 빠르게 테이블 복제 [ Export / Import 제외 ]
  
  3.1 Create Table COPY_Table as select * from Source_Table@remote where 1=2
   를 통해서 테이블 껍데기만 Copy 후에
  3.2 alter session enable parallel dml;
  3.3 insert /*+ parallel(Copy_Table, 10) */ into Copy_Table nologging
      select /*+ parallel(Source_table, 10) */ * from Source_Table@remote ;
  3.4 Creae index ... Nologging PARALLEL ;
      CREATE INDEX XAK_COPY_Table ... NOLOGGING PARALLEL ;
  3.5 ALTER index ... LOGGING NOPARALLEL ;
      ALTER index XAK_COPY_Table logging noparallel ;
  3.6 통계정보 수집
     exec dbms_stats.gather_table_stats(ownname=>user, tabname=>'COPY_Table ');
  3.7 기타 추가 작업
     Column Default Value, Index, Constraint, Grant, Synonym, Trigger 

4. CTAS 를 쓸것인가 ? Export/Import 를 쓸것인가 ?
   CTAS - Parallel 처리가 가능하다는 강점이 있다.
          단. DB Link 를 통해서 통신 하기 때문에, Network 로 근거리(한국 내 정도 ^^;)어야 하고,
              양쪽 DB 의 Characterset 이 동일 해야 한다. 기타 DB LInk 사용에 따른 제약이 없어야 한다.
   Export/Import - Dump 화일 생성을 위한 저장할 공간이 필요하다.
                   양쪽 DB 의 Characterset 이 다르더라도, Sub Set 에서 Super Set 으로 이관시 아무런
                   문제가 되지 않는다. 비교적 먼거리 시에는 Remote 에서 Dump 화일 생성, ftp 전송,
                   Local Import 수행이 가능하다.

반응형
Posted by [PineTree]
ORACLE/Modelling2009. 11. 3. 21:53
반응형

일자 데이터 타입이란 YYYYMMDD 형(시/분/초 제외)을 이야기 하는 것이다. 이때 DATE 타입을 선택할 것인가 아니면 VRACHR2(8)을 선택할 것인가의 문제이다. 이것은 성능 문제이기도 하지만 물리 모델링, 개발효율성, 데이터 품질 등을 같이 생각 해야 한다. 물리모델링 시에 많은 모델러들이 일자 데이터 타입과 관련하여 이구동성으로 이야기 하는 것이 아래의 SQL 이다.

 

SELECT ...                     

  FROM ...                     

 WHERE 기준일자 = TO_DATE('20091021', 'YYYYMMDD') ;

 

위의 SQL 에서 일자 컬럼에 시//초가 포함되어 있다면 조회가 되지 않는다.

그렇다고 SQL 을 아래처럼 작성하는 것은 개발효율성이 떨어지고 성능에도 이롭지 못하다.

 

SELECT ...                     

  FROM ...                     

 WHERE 기준일자 BETWEEN TO_DATE('20091021','YYYYMMDD') AND TO_DATE('200910212359', 'YYYYMMDDHH24MISS') ;

 

아니 땐 굴뚝에 연기가 날까?

VARCHAR2(8)을 선호하는 사람들이 주로 이 문제를 제기한다. DATE 타입은 시//초가 들어감으로써 세가지 문제(데이터가 조회되지 않을 수 있고, 개발효율성과 성능이 떨어짐)가 발생함으로  VARCHAR2(8)을 사용해야 한다는 것이다.

 

하지만 과연 이 말이 사실일까? 모든 문제는 모델러가 시//초가 들어갈 수 있게 설계를 했기 때문이다. 왜 그런지 아래 스크립트를 보고 증명해보자

 

-- DATE 형과 VARCHAR2 형을 동시에 가진 테이블 생성                           

CREATE TABLE DT                                                              

( V_DT  VARCHAR2(8 BYTE),                                                    

  D_DT  DATE ) ;                                                                                                                                    

                                                                              

--일자 타입이 date 인 경우에 시//초가 입력될 경우 걸러내는 Constraint.        

--ex) //초를 포함하는 SYSDATE를 입력하면 에러를 발생시키기 위함.                        

--CHECK 절에 OR 가 있는 이유는 NULL 을 허용하기 위해서 이다.

ALTER TABLE DT                                                               

ADD CONSTRAINT D_DT_CHK                                                      

CHECK (D_DT = TRUNC(D_DT) OR D_DT IS NULL) ;        

            

이제 DATE 타입에 정상적인 데이터와 걸러져야 하는 데이터를 INSERT 해보자                            

 

--NULL을 대입해도 에러 발생하지 않음                                                                              

INSERT INTO DT (V_DT, D_DT) VALUES(NULL, NULL) ;                                                  

 

--SYSDATE는 시//초가 들어감으로 INSERT 되면 안됨                                                                              

INSERT INTO DT (V_DT, D_DT) VALUES (NULL, SYSDATE) ;                          

ORA-02290: 체크 제약조건(D_DT_CHK)이 위배되었습니다                   

                   

--에러 발생하지 않음                                                                             

INSERT INTO DT (V_DT, D_DT) VALUES (NULL, TRUNC(SYSDATE)) ;            

 

Constraint는 데이터 품질을 보장해준다

위에서 보는 바와 같이 Constraint는 시//초가 들어가지 않도록 보장해준다.

이것은 성능이 느린 VARCHAR2 타입을 사용하지 말아야 하는 이유가 될 수 있다.

 

어쩔 수 없이 VARCHAR2(8)을 사용하더라도 Constraint를 사용하라

일자 데이터 타입에 VARCHAR2(8)을 사용할 때 날짜가 아닌 데이터가 들어가는 문제도 마찬가지로 해결할 수 있다. 아래처럼 Constraint를 사용하면 된다.

 

--일자 타입이 VARCHAR2 인 경우에 잘못된 데이터를 걸러내는 Constraint .        

--ex) ‘20090230’을 걸러낸다.

--CHECK 절에 OR 가 있는 이유는 NULL 을 허용하기 위해서 이다.                                                  

ALTER TABLE DT                                                               

ADD CONSTRAINT V_DT_CHK                                                      

CHECK (V_DT = TO_CHAR(TO_DATE(V_DT,'YYYYMMDD'), 'YYYYMMDD') OR V_DT IS NULL) ;

 

이제 VARCHAR2(8)에 일자가 아닌 데이터를 넣어보자

 

--230일은 일자가 아니므로 INSERT 되면 안됨                                                                             

INSERT INTO DT (V_DT, D_DT) VALUES ('20090230', NULL) ;                       

ORA-01839: 지정된 월에 대한 날짜가 부적합합니다

 

--에러 발생하지 않음                                                                             

INSERT INTO DT (V_DT, D_DT) VALUES ('20090228', NULL) ;  

 

성공적으로 일자가 아닌 String 을 걸러 내었다.

 

결론

이제 알 것이다.  Constraint가 데이터 품질을 향상시키고 개발효율성을 높이며 성능에 까지 영향을 끼친다는 사실을

반박하라. //초가 들어감으로 VARCHAR2(8)을 사용해야 한다는 주장을

사용하라. 성능과 데이터 품질을 향상 시키는 DATE 타입을

오라클에서 시/분/초는 제외하고 일자만 저장되는 데이터 타입을 제공한다면 하는 아쉬움이 진하게 남는다.  미래의 버젼에 이러한 요구사항을 해결한 데이터 타입이 나오길 기대한다.


PS

DATE 타입을 성급히 적용하면 안 된다. 기존의 시스템은 일자가 아닌 데이터도 문제 없이 처리가 되었을 것이다. 하지만 DATE 타입으로 바꾸면 에러로 떨어진다. 따라서 에러의 처리정책과 처리Logic 등이 세워진 이후에 적용하라. 이런 골치 아픈 문제 때문에 VARCHAR2(8)을 사용하는 것은 말이 안 된다. 원칙적으로 에러로 떨어지는 것이 정당한 것이고 데이터를 수정하고 다시 처리하는 것이 옳다.

  

아래는 DATE 타입과 VARCHAR2 타입의 장단점 이므로 참고하기 바란다.

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



성능상으로는 DATE 형이 우월하다

여기에는 두 가지 이유가 있다.

 

첫 번째, DATE 타입은 옵티마이져가 날짜임을 인식한다.

 

SELECT ...                     

  FROM ...

 WHERE 기준일자 BETWEEN to_date('20091020', 'yyyymmdd') and to_date('20091021', 'yyyymmdd)

 

기준일자는 DATE 타입이다. 위의 조건대로라면 옵티마이져는 정확히 이틀간(10 20일부터 21일까지)이라는 것을 인지한다. 따라서 옵티마이져는 인덱스로 SCAN 할 것인지 아니면 FULL TABLE SCAN 할 것인지 판단할 수 있다.

 

하지만 기준일자가 아래처럼 VARCHAR2(8) 타입이라면 달라진다.

 

SELECT ...                      

  FROM ...

 WHERE 기준일자 BETWEEN '20091020' and '20091021'

 

옵티마이져는 '20091020'가 일자인지 인식 하지 못한다. 따라서 이틀 치의 데이터를 조회한다는 사실을 인식하지 못한다. String 타입이므로 이것은 당연한 것이다.

 

두 번째, DATE 타입은 7 byte를 차지하고 VARCHAR2(8) 8 byte를 차지한다.

 

두 가지 이유에 의해서 성능은 DATE 타입이 조금이라도 우월함을 알 수 있다.  

 

그럼에도 불구하고 DATE 타입을 사용하지 않는 가장 큰 이유는 무엇일까? 크게 3가지 이유로 요약된다.

 

첫 번째, DATE 타입의 문제점은 sysdate 등을 입력할 경우 시//초 가 들어감으로 SQL을 실행하면 결과값이 나오지 않는다.(이 문제는 위에서 이미 언급되었음)

 

두 번째, 년도나 월 데이터를 조회할 때 LIKE를 사용하지 못하고 BETWEEN 을 사용해야 한다는 것이다. 이것은 큰 문제라고 보지 않는다. 조건절이 조금 길어질 뿐 INDEX RANGE SCAN 이라는 점은 같기 때문이다.

 

세 번째, SYSDATE 등을 INSERT할 때 TRUNCT 등의 함수를 사용하여 시//초 등을 잘라내야 한다.

                

그렇다면 VARCHAR2 타입의 문제점은 없는가?
크게 3가지의 문제점이 있다.

 

첫 번째, 성능문제(옵티마이져가 일자인지 알 수 없음)

이 문제는 ORACLE 11g를 사용하면 더욱 심각한 차이가 발생할 수 있다.

왜냐하면 Bind Aware 기능이 강화되었기 때문에 변수를 마치 상수처럼 취급할 것이고 이에 따라 DATE 타입이 성능 면에서 훨씬 우월해 질것이다. 

                 

두 번째, VARCHAR2 타입의 문제점은 날짜가 아닌 데이터가 들어갈 수 있다는 것이다. 예를 들면 'ABCDEFGH' 혹은 '20090231' 등의 잘못된 데이터가 입력될 수 있다. 이것은 데이터 품질에 치명적이다. 혹자는 'DATE 타입도 시//초가 들어가므로 마찬가지 아니냐' 라고 생각할 수 있지만 근본적으로 다르다. DATE 타입을 사용하면 시//초는 TRUNC 등의 함수를 사용하여 Cleansing할 수 있지만 VARCHAR2는 그렇게 할 수 없다.

 

예를 들어 '20091032' 라는 데이터를 Cleansing 해야 한다고 치면 10 31일로 할 것인가? 아니면 11 1일로 할 것인가? 이것은 함부로 판단할 수 없는 것이다. 혹자는 'CHECK 기능을 추가하여 모든 프로그램에서 일자가 아닌 것을 CHECK 하면 되지 않냐?' 라고 할 수 있다.

 

맞는 말이다. 하지만 프로그램을 사용하지 않고 직접 DB KEY IN 하여 INSERT 할 수도 있기 때문에 원천적으로 원인을 제거한다고 볼 수 없다.(급한 경우에는 이렇게 하기도 한다)

 

세 번째, 성능문제에도 불구하고 개발편의성을 위해 VARCHAR2를 사용하였지만 일자연산이 발생하면 오히려 개발생산성이 저하된다.

 

예를 들면 일자끼리 빼서 차이를 본다든지 아니면 일자에 며칠을 더해서 본다든지 일자에 연산이 일어날 경우 오히려 TO_DATE 등의 함수를 사용해야 한다. 이런 경우는 자주 발생되는 편이다.

 

이상으로 DATE 타입과 VARCHAR2 타입의 장단점을 살펴보았다.

이 글과 관련된 POST 도 참고하기 바란다.

http://ukja.tistory.com/265


출처 : http://scidb.tistory.com/87?srchid=BR1http%3A%2F%2Fscidb.tistory.com%2F87
반응형

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

성능 데이터 모델링의 핵심 비법  (0) 2009.02.24
Posted by [PineTree]