ORACLE Tip2009. 2. 10. 18:27


다음은 V$SQLAREA table을 사용하여 library cache에서 공유되고 있는 SQL
statement 중 Disk read를 많이 유발시키는 문장들을 찾는 Query이다.

set echo on;
DEFINE blocks_read = 1000 (NUMBER)
COLUMN parsing_user_id FORMAT 9999999 HEADING 'User Id'
COLUMN executions FORMAT 9999 HEADING 'Exec'
COLUMN sorts FORMAT 99999 HEADING 'Sorts'
COLUMN buffer_gets FORMAT 999,999,999 HEADING 'Buffer Gets'
COLUMN disk_reads FORMAT 999,999,999 HEADING 'Block Reads'
COLUMN sql_text FORMAT a40 HEADING 'Statement' WORD_WRAPPED
SET LINES 130

SELECT parsing_user_id, executions, sorts, buffer_gets, disk_reads, sql_text
FROM v$sqlarea
WHERE disk_reads > &&blocks_read
ORDER BY disk_reads;


set echo off;
SET LINES 80

위의 문장에서 일정 횟수 이상의 실행이 되었던 문장을 찾는 경우에는
아래의 Query가 사용 될 수 있다.

set echo on;
DEFINE blocks_read = 1000 (NUMBER)
DEFINE executions = 100 (NUMBER)
COLUMN parsing_user_id FORMAT 9999999 HEADING 'User Id'
COLUMN executions FORMAT 9999 HEADING 'Exec'
COLUMN sorts FORMAT 99999 HEADING 'Sorts'
COLUMN buffer_gets FORMAT 999,999,999 HEADING 'Buffer Gets'
COLUMN disk_reads FORMAT 999,999,999 HEADING 'Block Reads'
COLUMN sql_text FORMAT a40 HEADING 'Statement' WORD_WRAPPED
SET LINES 130

SELECT parsing_user_id, executions, sorts / executions, buffer_gets /
executions, disk_reads / executions, sql_text
FROM v$sqlarea
WHERE disk_reads > &&blocks_read and executions > &&executions
ORDER BY disk_reads;


set echo off;
SET LINES 80


발췌 : OTN Discussion Forums

Posted by 항아리고미
ORACLE Tip2009. 1. 30. 11:39


ON COMMIT PRESERVE ROWS 에 대해서 찾아보다가 알게된 내용이다.

[[ TEMPORARY TABLE(임시 테이블) ]]

1. 설명
   개발자가 DML(INSERT, UPDATE, DELETE)문을 실행한 후 트랜젝션을 종료(commit)하더라도
   변경된 테이터들이 DB테이블에 저장되지 않는 테이블이다.
   즉, 잠시 데이터를 저장하는 일시적 공간

2. 데이터를 유지하는 방법
   (1) ON COMMIT DELETE ROWS
      commit문을 실행할 때 '데이터'가 없어지는 옵션 즉, 하나의 트랜젝션이 마무리될 때 함께 데이터가 없어진다.
   (2) ON COMMIT PRESERVE ROWS
      commit문이 실행되면 임시테이블내에 데이터가 저장되었다가 세션을 종료하면 임시테이블에 저장되었던
      '데이터'들이 없어지는 옵션 즉, 하나의 세션이 마무리될 때 함께 데이터가 없어진다.

흠.. 이런것이 있었군.

발췌 : oracle forum

TEMPORARY TABLE IN ORACLE8I
===========================
Oracle8.1에서는 session내에서 임시로 사용할 data들을 영구적인 segment형태가 아닌 temporary structure에서 관리할 수 있다.
이러한 Temporary Table들은 그 생성문장에 의해서 definition이 dictionary에 저장되고, 각 session에서 해당 table을 사용할 때마다 definition을 이용하여 memory에 table 구조를 생성하게 된다.

CHARACTERISTICS
-------------------
1. data는 session private하다.
   (특정 session에서 사용하는 temporary table data는 다른 session에서 access할 수 없다.)
2. CREATE GLOBAL TEMPORARY TABLE ...
   ON COMMIT [DELETE|PRESERVE] ROWS ; 문을 이용하여 생성한다.
3. data의 유지기간은 transaction단위 또는 session단위이다.
   'ON COMMIT DELETE ROWS'로 생성되었다면 transaction단위이며
   이때 data는 commit이 되는 시점에 자동으로 제거된다.
   'ON COMMIT PRESERVE ROWS'로 생성되었다면 session단위이며
   이때 data는 해당 session이 종료되면서 사라진다.
   default는 'ON COMMIT DELETE ROWS'이다.
4. table의 definition은 dictionary에 permanently 저장된다.
   *_tables의 TEMPORARY, DURATION column이 temporary table과 관련이 있다.
   TEMPORARY - 'Y' : temporary type table
                         'N' : permanent type table
   DURATION  - 'SYS$SESSION'          : data의 유지기간이 session단위
                       'SYS$TRANSACTION' : data의 유지기간이 transaction단위
                        NULL                       : 해당 table은 temporary type이 아님
5. session간에 data에 대한 contention이 발생되지 않기 때문에 DML문에 대한 lock이 필요하지 않다.
6. 임시적으로만 관리되는 data이므로 DML문에 대해서 redo log를 발생시키지 않는다.
7. index, view, trigger를 생성하여 사용할 수 있다.
   Temporary Table의 column에 생성되는 index도 temporary type이다.
8. table의 definition은 export utility를 이용하여 export할 수 있다. 그러나 그 row들은 export의 대상이 될 수 없다.

RESTRICTIONS
---------------
1. partitioned, index-organized, clustered table로 생성할 수 없다.
2. foreign key constraint를 설정할 수 없다.
3. nested table이나 varray type의 column은 포함할 수 없다.
4. 다음과 같은 LOB_storage_clause들은 지정할 수 없다. : TABLESPACE,
   storage_clause, LOGGING 또는 NOLOGGING, MONITORING 또는 NOMONITORING, 또는 LOB_index_clause.
5. parallel DML이나 parallel query는 지원되지 않는다. 
   (parallel hint는 무시될 것이며, table생성시 parallel clause를 지정하면 error를 return한다.)
6. storage나 tablespace는 지정할 수 없다.
7. 분산 transaction은 지원되지 않는다.

SAMPLE
---------
----------------------------------------------------------------------
-- temporary type table을 생성하되 duration은 transaction단위로 한다.
----------------------------------------------------------------------
SQL> create global temporary table temp_tab
  2  (col1 number, col2 char(10))
  3  on commit delete rows ;

-----------------------------------------------------------------------
-- 생성된 table에 대한 정보를 조회한다. *_tables의 TEMPORARY, DURATION
-- column이 temporary type table과 관련이 있다.
-----------------------------------------------------------------------
SQL> select temporary, duration
  2  from user_tables
  3  where table_name = 'TEMP_TAB' ;
T DURATION
- ---------------
Y SYS$TRANSACTION

-----------------------------------------------------------------------
-- temporary table에 row insert
-----------------------------------------------------------------------
SQL> insert into temp_tab values (1, 'wookpark') ;
SQL> select * from temp_tab ;
     COL1 COL2
--------- ----------
        1 wookpark

-----------------------------------------------------------------------
-- transction을 commit한다.
-----------------------------------------------------------------------
SQL> commit ;
Commit complete.

-----------------------------------------------------------------------
-- duration이 transaction단위이기 때문에 commit을 수행하면 모든 data가
-- 사라진다.
-----------------------------------------------------------------------
SQL> select * from temp_tab ;
no rows selected

Posted by 항아리고미
ORACLE Tip2009. 1. 11. 01:06
-- 테이블 생성 스크립트 뽑아내기.

SQL> set line 150
SQL> set pages 10000
SQL> set long 999999999

SQL> select dbms_metadata.get_ddl('TABLE','EMP','SCOTT') DDL_QUERY from dual;

DDL_QUERY


CREATE TABLE "SCOTT"."EMP"
( "EMPNO" NUMBER(4,0) NOT NULL ENABLE,
"ENAME" VARCHAR2(10),
"JOB" VARCHAR2(9),
"MGR" NUMBER(4,0),
"HIREDATE" DATE,
"SAL" NUMBER(7,2),
"COMM" NUMBER(7,2),
"DEPTNO" NUMBER(2,0)
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS"



SQL> create or replace view v_emp_dept
2 as
3 select e.empno, e.deptno, d.dname from emp e, dept d
4 where e.deptno=d.deptno;

View created.

SQL> set long 9999999999

-- 뷰 생성 스크립트 뽑아내기.
SQL> select dbms_metadata.get_ddl('VIEW','V_EMP_DEPT','SCOTT') DDL_QUERY from dual;

DDL_QUERY



CREATE OR REPLACE FORCE VIEW "SCOTT"."V_EMP_DEPT" ("EMPNO", "DEPTNO", "DNAME") AS
select e.empno, e.deptno, d.dname from emp e, dept d
where e.deptno=d.deptno
Posted by 항아리고미
ORACLE Tip2009. 1. 5. 10:56
ㆍ값의임시적저장을위해세가지치환변수형태제공
   - & : 값의1회사용을위한치환변수사용시
   - && : 후속사용을위한치환변수사용시
   - DEFINE : 치환변수의사전선언시사용
ㆍSELECT문의모든절에사용가능
 
 (1) &
 SELECT last_name, salary FROM employeesWHERE salary = &sal;
 SELECT last_name, salary FROM employeesWHERE last_name = ‘&name’;
 SELECT last_name, salary, &colFROM employeesWHERE &conditionORDER BY ℴ
 
 (2) &&
 SELECT last_name, salary, &&colFROM employeesORDER BY &col;
  
 (3) DEFINEDEFINE 
 v_empid= 300
 SELECT last_name, salaryFROM employeesWHERE employee_id = &v_empid;

Posted by 항아리고미
ORACLE Tip2008. 12. 19. 10:55
시스템이 hang인 상태에서 아무 작업도 하지 않다고 판단될 때에는 아래의 command를 실행하시기 바랍니다.
 
1.       sql*plus로 접속합니다
=> $ sqlplus / as sysdba
 
2.      다음을 입력합니다.( 1분씩 3~4회를 수행합니다. 빠져나간 후 수행하지 마십시오)
ð      SQL> oradebug setmypid
ð      SQL> oradebug unlimit
ð      SQL> oradebug dump systemstat 10
 
3.       만약 특정 process의 상태를 알고 싶으면 다음과 같이 수행하십시오.
ð      SQL> oradebug setospid <process ID>
ð      SQL> oradebug unlimit
ð      SQL> oradebug dump processstat 10
 
4.       만약 특정 processerror상태를 알고 싶으면 다음과 같이 수행하십시오.
ð      SQL> oradebug setospid <process ID>
ð      SQL> oradebug unlimit
ð      SQL> oradebug dump errorstack 3

Posted by 항아리고미
ORACLE Tip2008. 12. 18. 10:53

<질문>

DBMS_LOCK.SLEEP()을 사용하려고 하는데, isql모드(sqlPlus)에서는 무리없이 수행되나, PL/SQL에서 사용하면 하기와 같은 에러가 발생합니다.

PLS-00201: identifier 'SYS.DBMS_LOCK' must be declared

 
<답변>

scott 계정에서 사용한다면 system 계정에서 다음과 같이 권한을 주세요..
 
SVR1:oracle > sqlplus /nolog
SQL*Plus: Release 9.2.0.5.0 - Production on Mon Feb 26 13:56:02 2007
Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.
SQL> conn sys/manager@oracle as sysdba
ERROR:
ORA-12154: TNS:could not resolve service name
 
// sys유저에 sysdba권한으로 접속을 합니다.
SQL> conn sys/manager as sysdba


SQL> grant execute on dbms_lock to scott;
Posted by 항아리고미
ORACLE Tip2008. 12. 17. 10:52
1. PRIMARY KEY DROP
  alter table <tablename> drop primary key;
 
  Example :
  alter table EMP drop primary key;
 
2. PRIMARY KEY 생성
 alter table <tablename> add constraint <primary key name> primary key(<primary key column list>)
    using index storage(initial 1m next 1m pctincrease 0)
    tablespace <tablespace name>;
      
      
  Example :
   alter table EMP add constraint EMP_PK primary key(EMPNO)
 using index storage(initial 1m next 1m pctincrease 0)
 tablespace USERS;   

Posted by 항아리고미
ORACLE Tip2008. 12. 16. 10:51
1. 개요
 
client/server환경에서는 client의 request는 요청이 되면 바로 처리되므로,
online이고 연결된 작업이라고 볼 수 있다. 이러한 모델은 다음 작업을 진행하기 전에 처리한 작업에 대한 결과를 얻어서 이용하는 경우에 적당하다.
그러나 이러한 경우 어플리케이션이 항상 사용가능한 상태이어야 하기 때문에 network문제 등이 발생하는 경우 전체 어플리케이션이 모두 사용할 수 없게 되는 문제가 발생할 수 있다.
 
Queuing 기법은 프로그램들간의 disconnected/deferred communication으로 client/server환경과는 다른 요구사항에 적용되어질 수 있다. 이 방법을 이용하면 생산자 역할을 하는 프로그램은 queue에 request를 넣고 소비자 역할의 프로그램이 queue의 request를 꺼내 처리하게 된다. Oracle8에서는 이러한 queuing 기법을 기존의 TP-monitor나 다른 message-oriented middleware를 사용하지 않고 직접 사용가능하도록 하고 있다.
 
여기에서는 이러한 Oracle8에서 제공하는 advanced queuing에 대해서 간단한 개념과 예제를 제시한다. 여기에 적힌 예제는 oracle8 8.0.4와 8.1.4에서
성공적으로 수행되었다.
 
2. Advanced Queuing이란?
 
(1) Message
message란 queue에 들어가고 꺼내지는 정보의 가장 작은 단위이다. 이것은 raw type이나 object type인 user data (payload)와 priority 등의 추가적인 제어 정보를 담고 있는 meta data로 구성되어 있다. 하나의 메시지는 오직 하나의 queue에만 위치할 수 있으면 ENQUEUE procedure에 의해 queue에 들어가고 DEQUEUE procedure에 의해 queue에서 읽혀진다.
 
(2) Queue
queue는 메시지들의 저장 장소라고 할 수 있다. User queue와 exception queue라는 두가지 type이 존재하는데 이 중 user queue가 정상적인 message 처리를 위한 것이고 오류로 인해 제대로 처리되지 못한 메시지는 exception queue로 전달된다.
데이타베이스내에 생성될 수 있는 queue의 숫자에는 제한이 없으며, DBMS_AQADM package에 의해서 생성/변경/시작/멈춤/삭제되어 질 수 있다.
 
(3) Queue Tables
queue는 queue table에 저장되어진다. 각각의 queue table은 하나의 데이타베이스 테이블로 구성되며 하나 이상의 queue들을 포함한다. 각각의 queue table에는 하나의 default exception queue이 존재하며 DBMS_AQADM package를 이용하여 생성할 수 있다.
 
(4) Agents
agent는 queue user로 producer와 consumer 두가지 type이 있다. producer는 message를 queue에 전달하는데 이것을 enqueuing이라고 하고, consumer가 queue에서 message를 읽는 것을 dequeuing이라고 한다. 여러명의 producer와 consumer가 하나의 queue를 사용할 수 있으며 하나의 agent는 name, address, protocol에 의해 구분되다. 그런데 이 agent는 실제 database상의 user는 아니며 실제로는 application혹은 program이라고 생각할 수 있다.
 
3. 예제
 
advanced queuing을 사용하기 위해서는 먼저 catqueue.sql을 sys user에서 수행하여야 하는데 이것은 catproc.sql에서도 호출되도록 되어 있으므로 install당시 이미 수행되어져 있는 것이 정상이다.

(1) setup.sql

connect sys/manager
create user scott identified by tiger
default tablespace users
temporary tablespace temp;

grant connect, resource, aq_administrator_role to scott;
execute dbms_aqadm.grant_type_access('scott');
grant execute on dbms_aq to scott ;
grant execute on dbms_aqadm to scott;

connect scott/tiger
create type scott_mesg as object (m1 varchar2(10), m2 varchar2(10));

/* 기존 환경 삭제 */
exec dbms_aqadm.stop_queue(queue_name =>'SCOTT.AS_Q',wait=>FALSE);
exec dbms_aqadm.drop_queue(queue_name => 'SCOTT.AS_Q');
exec dbms_aqadm.drop_queue_table(queue_table=>'SCOTT.AS_TABLE', force=>TRUE);

/*생성 및 구동 */
exec dbms_aqadm.create_queue_table
          (queue_table => 'SCOTT.AS_TABLE',
            queue_payload_type=> 'scott.scott_mesg',
            storage_clause => 'storage (initial 1m next 1m pctincrease 0 )',
            multiple_consumers=> TRUE,
            comment => 'demo queue table' );
exec dbms_aqadm.create_queue (queue_name => 'SCOTT.AS_Q',
                                                          queue_table => 'SCOTT.AS_TABLE',
                                                          comment => 'demo queue');
exec dbms_aqadm.start_queue (queue_name => 'SCOTT.AS_Q');


(2) enq.sql 

set serverout on
declare
enqueue_options dbms_aq.enqueue_options_t;
message_properties dbms_aq.message_properties_t;
message_handle raw(16);
recipients dbms_aq.aq$_recipient_list_t;
message scott.scott_mesg;

begin
    enqueue_options.visibility := DBMS_AQ.IMMEDIATE;
    message:= scott_mesg('Hello !', 'World !!!');

    recipients(1) := sys.aq$_agent('app01','SCOTT.AS_Q',NULL);
    message_properties.recipient_list := recipients;

    dbms_aq.enqueue (queue_name => 'scott.as_Q',
          enqueue_options => enqueue_options,
          message_properties => message_properties,
          payload => message,
              msgid => message_handle );
    dbms_output.put_line('Message enqueued.');
end;
/

(3) deq.sql
 

set serveroutput on
declare
dequeue_options dbms_aq.dequeue_options_t;
message_properties dbms_aq.message_properties_t;
message_handle raw(16);
message scott.scott_mesg;

begin
    dequeue_options.consumer_name := 'app01';
    dequeue_options.wait := 2;

    dbms_aq.dequeue (queue_name => 'SCOTT.AS_Q',
                  dequeue_options => dequeue_options,
                                      message_properties => message_properties,
                                      payload => message,
                                      msgid => message_handle );
    dbms_output.put_line('message1 : ' || message.m1 || ',
                                                message2 : ' || message.m2);
end;
/

SQL> @enq
Message enqueued.
PL/SQL procedure successfully completed


SQL> @deq
message1 : Hello !, message2 : World !!!
PL/SQL procedure successfully completed.
 

Posted by 항아리고미
ORACLE Tip2008. 12. 15. 10:43
EXP-00091: Exporting questionable statistics.
Export terminated successfully with warnings.
 
questionable statistics 란?
1. exp 받는 동안 row error가 있는 경우
2. client char set이나 nchar char set이 server char set이나 nchar char set
과 맞지 않는 경우
3. exp시 query 옵션이 사용된 경우
4. partitions, subpartions만 exp 받는 경우

위의 4가지 경우인 경우 위의 warning 이 나타납니다.
위의 4가지인 경우 기존의 통계정보와 달라질 수 있기 때문에 recalculate가 필요합니다.
oracle 9버전부터 export시 default로 기존의 통계정보를 export받는데
export 받기 전 정상적으로 analyze가 되지 않았다면 위에 해당하는 에러가 발생하게 됩니다.

 
answer1>
통계정보를 무시하고 export 할려고 한다면..옵션절에 statistics = none 로 써
주시고 export받으면 됩니다.
answer2>
imp받으실때 statistics=safe로 받으면 됩니다.
여러 exp 파일이 있는 경우 저 warning이 났는지 안났는지 모르기때문에 safe 옵션을 쓰면 재계산이 필요한 경우는 해주고 안필요하면 안하고 넘어가게 됩니다.

Posted by 항아리고미
ORACLE Tip2008. 12. 13. 10:40
SQLPLUS 에서 숫자 크기가 너무 클경우 출력 숫자 크기를 늘려주는 방법.
 
SET NUMFORMAT 999999999999999.99
SET NUM 15

Posted by 항아리고미