'Oracle'에 해당되는 글 35건

  1. 2010.09.10 Group By와 Distinct의 차이가 뭘까?
  2. 2010.08.16 Silent Installation을 통한 Oracle Embedding
  3. 2010.08.13 Oracle Session별 Trace 생성 방법
  4. 2010.08.13 TNS:protocol adapter error
  5. 2010.08.13 Create View 생성 Query문의 오류

Group By와 Distinct의 차이가 뭘까?

Oracle 2010. 9. 10. 09:45
Group By와 Distinct 모두 Select 구문과 함께 사용되면서, 중복행을 제거하기 위해서 많이들 사용합니다.

물론 Group By의 경우에는 단순히 중복행을 제거하는 기능만 있는것은 아니지만 말입니다.

Oracle 9i까지는 Distinct와 Group By 모두 Plan 상에서 Sort를 발생시킵니다.

하지만, Oracle 10g이상부터는 Group By의 경우 Sort가 Plan 상에서 없어지게 되지요.

불필요한 Sort로 성능을 저해하는 요인(?)을 제거해보겠다.... 뭐 그런 맥락인것이지요.

그럼 여기서 생기는 궁금증 하나??


▷ 단순히 중복행을 제거하기 위해서 Group By와 Distinct를 사용한다고 했을 경우 두개의 차이점은??

    적은 Data의 양을 가지고 중복행을 제거하고자 할 때는 Distinct가 빠르고,

    많은 Data의 양을 가지고 중복행을 제거하고자 할 때는 Group by가 빠르다고들 한다.

    왜일까??  


위의 문제에 대해서 좀 더 알아보아야 할 것 같다.
:     

TISTORY에 Login하려면 여기를 누르세요.


Silent Installation을 통한 Oracle Embedding

Oracle 2010. 8. 16. 11:00
Oracle 하위 버전부터 지원되어왔지만, 지금까지는 사용의 필요성(?)까지는 느끼지 못했었다.

하지만, ESL 계약을 위해서는 Embedding을 해야하고, 가장 손쉬운 방법이 Silent Installation이기에....

Oracle 10g Enterprise Edit의 Transaction Processing Type으로 설치하기 위해 Response 파일을 수정하였습니다.

첨부파일을 참조하시기 바랍니다.

 
 ▣ Silent Installation을 통해 설치되는 DB 정보 요약

    . Install Type : Enterprise Edition (Oracle 10gR2)

    . DB Type : Transaction Processing Starter Database

    . DB & SID Name : orcl

    . Characterset : AL32UTF8  

    . Example Schemas : No Installed.

    . sys & system account pwd : oracle

    . ORACLE_HOME : c:/oracle/product/10.2.0/db_1

    . Oracle Data Path : c:/oracle/product/10.2.0/oradata"



 ▣ Oracle 10g Silent Installation
 
     1. otn.oracle.com에서 Oracle10gR2_Win32bit 용을 download 합니다.

     2. Download된 Installation File을 "C:\Oracle10g" 폴더 아래에 넣습니다. (ex... c:\oracle10g\database\setup.exe)

     3. 첨부파일을 다운로드 받아 c:\oracle10g\database\response에 덮어씁니다.

     4. command 창을 하나 실행합니다.

     5. command 창에서 커서를 c:\oracle10\database로 이동합니다.

     6. command 창에 아래와 같이 입력 후, 실행하면 Oracle DB가 설치됩니다.
          setup.exe -silent -nowelcome - responsefile c:\oracle10g\database\response\enterprise.rsp
    
     7. 설치 Log를 확인하여 이상여부를 확인하시면 설치 완료입니다.
            (c:\program files\oracle\inventory\logs\silentInstall설치일시.log 파일 생성)


:     

TISTORY에 Login하려면 여기를 누르세요.


Oracle Session별 Trace 생성 방법

Oracle 2010. 8. 13. 16:43

sqlplus를 이용하여 sysdba 계정에서 아래의 파일을 실행합니다.


 SQL> @dbmsutil.sql                                           <==  ORACLE_HOME\rdbms\admin 에 파일이 존재함
 SQL> @prvtutil.plb                                             <==  ORACLE_HOME\rdbms\admin 에 파일이 존재함

 SQL> grant execute on dbms_system to system;


- DBMS_SYSTEM.set_sql_trace_in_session(sid, serial#, TRUE) 
 지정된 session에 대해 SQL trace를 실행하여 user_dump_dest parameter에 지정된 위치에 trace file이 생성된다.
 
 - DBMS_SYSTEM.set_sql_trace_in_session(sid, serial#, FALSE)  
 지정된 session에 대한 SQL trace를 해제한다.


[예제] system user에서 scott user를 지정하여 SQL trace 생성하기.

sqlplus system/manager

SQL> select sid, serial# 
     from v$session
     where username = 'SCOTT';

SID         SERIAL#
--------- ---------
        8        12

SQL> exec sys.dbms_system.set_sql_trace_in_session(8, 12, TRUE);

 -> scott user에 대한 SQL trace가 실행된다.

SQL> exec sys.dbms_system.set_sql_trace_in_session(8, 12, FALSE);

 -> scott user에 걸린 SQL trace가 해제된다.


==> 위와 같이 trace 처리된 내역은 DBMS가 설치된 server의 user_dump_dest 경로에 trc 파일로 생성됩니다.

    이렇게 해서 생성된 trace 파일을 TKPROF를 이용하여 가독이 용이한 형태로 내용을 변환하여 확인하면 됩니다.

     ex) tkprof '원본파일' '변환파일' [option] sys=no aggregate=no explain=계정ID/계정PWD
         --> tkprof C:\oracle\admin\orcl\udump\orcl_ora_3012.trc c:\test.text sys=no aggregate=no explain=scott/tiger

:     

TISTORY에 Login하려면 여기를 누르세요.


TNS:protocol adapter error

Oracle 2010. 8. 13. 16:36

Oracle의 Listener Service가 정상적으로 작동하지 않아서 서비스가 안되는 문제입니다.

 

Windows2003에 Oracle 11gR1을 사용하고 있는 곳에서 몇 개월 동안 서비스를 해오다가 갑자기 모든 Application에서

 

DB에 접근을 못하게 되면서 Service가 중지된 사태가 발생했습니다. (DB가 mount까지만 진행됨)

 

OS의 서비스 관리자에서 이와 관련된 사항들을 확인해보면, 정상적으로 서비스가 되고 있는 것처럼 보여집니다.

 

또한, 재시작을 해도 정상적으로 시작되는 것으로 보여집니다. 하지만, App에서는 여전히 DB에 접근을 못합니다.

 

DOS Mode에서 LSNRCTL Mode로 들어가서 Status를 실행해보면, 화면이 조회가 되는듯 하다가 멈추는 현상이 나타나고,

 

Stop 실행 후, Start를 실행하면 "TNS:protocol adapter error"가 발생합니다.

 

Listener.log 파일을 찾아서 확인해봅니다.

 

Listener.log 파일의 Size 4GB...   -_-;;

 

‘SQL*Net에 대한 이해라는 Oracle Documents Reference를 참고하면, 해당 Log Listener에서 무조건 남는 것으로

 

OS Type에 따른 최대 사이즈가 상이하다고 합니다. 이에 대해서 Log를 남지 않도록 하기 위해서는 아래와 같은 작업이

 

추가로 필요합니다.

 

1.     이전의 Listener.log 파일을 삭제하거나, Rename을 시켜줍니다.

2.     DOS창에서 LSNRCTL를 실행한 후, Option을 비활성화 시켜줍니다.

C:\> lsnrctl

LSNRCTL> set current_listener <listener_name>

=> listener_name별로 선택적으로 설정 가능. 모든 listener에 대해서

    적용한다면  실행할 필요 없음.

LSNRCTL> set log_status off/on 

=>  listener.log 생성 여부를 설정

 

3.     위와 같이 동적으로 Listener.log를 생성하지 않도록 할 수 있고,

이 외에는 listener.ora file parameter를 설정함으로써 해결할 수 있습니다.

LOGGING_<listener_name>=OFF   => 생성 안 함

LOGGING_<listener_name>=ON   =>  생성함

 

4.     설정 변경이 완료 되었다면, Oracle DB Start 시켜줍니다.

      예시)    c:\> sqlplus /nolog

                  SQL> conn / as sysdba   (mount 상태)

                  SQL> alter database open;

:     

TISTORY에 Login하려면 여기를 누르세요.


Create View 생성 Query문의 오류

Oracle 2010. 8. 13. 16:09
어제 개발자분이 이전까지는 동일한 Create View Query문으로 Error 없이 잘 생성해서 사용해 왔는데,

Oracle 11g R2에서 동일한 Query문을 가져다 하니, Error가 발생하면서 View가 생성이 안된다고 하더군요.

그래서, Create View Query문을 받아서 확인해봤습니다.

눈으로만 딱 보니, Group By절에 Define되어 있는 Column이 Select 절에는 존재하지 않았습니다.

예를 들면 아래와 같은 형식이지요.

select  ename, job, mgr
from     emp
group  ename, job;

대부분 위의 Query문을 보고, 아 mgr Column에 대해서 집계 함수를 이용해서 표시를 해주거나,

Group by 절에 mgr을 포함시켜주어야 겠구나 하는 생각이 드실 것입니다.

하지만, 아래와 같은 경우에서 그 생각이 산산히 부서집니다. (동일한 형태로 SCOTT 계정을 이용해서 재현해보았습니다.)


============================================================================================================
1. 아래와 같이 scott 계정의 emp Table을 Hiredate column을 참조하는 View를 하나 생성합니다.

SCOTT@david11gR1>create or replace view v_emp_hiredate
  2  (hiredttm, hiredate, hiretime)
  3  as
  4  select hiredate, to_char(hiredate,'yyyymmdd') as hiredate, to_char(hiredate, 'hh24:mi:ss') as hitetime
  5  from emp
  6  with read only;

뷰가 생성되었습니다.

2. 생성된 View가 정상적으로 잘 작동하는지 확인해 봅니다.

SCOTT@david11gR1>select * from v_emp_hiredate;

HIREDTTM HIREDATE HIRETIME
-------- -------- --------
80/12/17 19801217 00:00:00
81/02/20 19810220 00:00:00
81/02/22 19810222 00:00:00
81/04/02 19810402 00:00:00
81/09/28 19810928 00:00:00
81/05/01 19810501 00:00:00
81/06/09 19810609 00:00:00
87/04/19 19870419 00:00:00
81/11/17 19811117 00:00:00
81/09/08 19810908 00:00:00
87/05/23 19870523 00:00:00
81/12/03 19811203 00:00:00
81/12/03 19811203 00:00:00
82/01/23 19820123 00:00:00

14 개의 행이 선택되었습니다.


3. 위와 같이 정상적으로 생성된 View를 참조하는 다른 View를 생성합니다.
    (Group By 절에서 의도적으로 hiredttm만 define하고, hiredate와 hiretime은 누락시킵니다.)

SCOTT@david11gR1>create or replace view v_test
  2  (hiredttm, hiredate, hiretime, tot)
  3  as
  4  select hiredttm, hiredate, hiretime, count(0) as tot
  5  from v_emp_hiredate
  6  group by hiredttm
  7  with read only;

뷰가 생성되었습니다.

Select 절의 구문 오류로 인해서 Error가 발생하면서, View가 생성되지 않을 줄 알았는데,
정상적으로 생성이 됩니다.

그래서, Data는 정상적으로 되는지 조회해 봅니다.

SCOTT@david11gR1>select * from v_test;

HIREDTTM HIREDATE HIRETIME        TOT
-------- -------- -------- ----------
80/12/17 19801217 00:00:00          1
81/02/20 19810220 00:00:00          1
81/02/22 19810222 00:00:00          1
81/04/02 19810402 00:00:00          1
81/05/01 19810501 00:00:00          1
81/06/09 19810609 00:00:00          1
81/09/08 19810908 00:00:00          1
81/09/28 19810928 00:00:00          1
81/11/17 19811117 00:00:00          1
81/12/03 19811203 00:00:00          2
82/01/23 19820123 00:00:00          1
87/04/19 19870419 00:00:00          1
87/05/23 19870523 00:00:00          1

13 개의 행이 선택되었습니다.

결과상에 문제 없이 정상적으로 조회가 되었습니다.

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



이 현상은 Oracle 11gR1이하 버전에서 동일하게 나타납니다. (Oracle 8i, 9i, 10g, 11gR1 여기까지만 확인해봄)

그래서 이번에는 위와 동일한 내용으로 Oracle 11gR2에서 확인해보도록 하겠습니다.

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

1. 먼저 위의 테스트와 동일하게 scott 계정의 emp Table을 Hiredate column을 참조하는 View를 하나 생성합니다.
SCOTT@david11gR2>create or replace view v_emp_hiredate
  2  (hiredttm, hiredate, hiretime)
  3  as
  4  select hiredate, to_char(hiredate,'yyyymmdd') as hiredate, to_char(hiredate, 'hh24:mi:ss') as hitetime
  5  from emp
  6  with read only;

뷰가 생성되었습니다.

2. 이제 문제의 View를 생성해봅니다.
SCOTT@david11gR2>create or replace view v_test
  2  (hiredttm, hiredate, hiretime, tot)
  3  as
  4  select hiredttm, hiredate, hiretime, count(0) as tot
  5  from v_emp_hiredate
  6  group by hiredttm
  7  with read only;
select hiredttm, hiredate, hiretime, count(0) as tot
                 *
4행에 오류:
ORA-00979: GROUP BY 표현식이 아닙니다.

우리가 일반적으로 생각하던 오류를 발생시키면서, View를 생성하지 못합니다.

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

왜 이와 같은 현상이 발생하는지 그에 대한 명확한 원인은 모르겠습니다.

단순히, Oracle의 Bug일까요?? 아니면, hiredate와 hiretime의 값 자체가 emp.hiredate의 값으로 부터 파생된 값이기

때문에 이를 Check할 필요가 없다고 판단한 것일까요?? (이건 좀 억지스럽군요)

아무튼 Oracle 11g R2의 Compiler는 좀 더 똑똑해진듯 합니다. 우리의 생각처럼 제대로 오류를 발생시켜주니 말이죠.

혹시라도, 위의 증상에 대해서 원인을 설명해주실 수 있으신 분이 있으시면 답변 부탁드리겠습니다.
:     

TISTORY에 Login하려면 여기를 누르세요.