레이블이 오라클SQL인 게시물을 표시합니다. 모든 게시물 표시
레이블이 오라클SQL인 게시물을 표시합니다. 모든 게시물 표시

2013년 10월 17일 목요일

오라클 ORACLE 인덱스가 없는 테이블 조회 SQL

오라클  ORACLE 인덱스가 없는 테이블 조회 SQL 

참고하세요`

select        OWNER, 
        TABLE_NAME 
from 

select        OWNER, 
        TABLE_NAME 
from        dba_tables 
minus 
select        TABLE_OWNER, 
        TABLE_NAME 
from        dba_indexes 

orasnap_noindex 
where        OWNER not in ('SYS','SYSTEM') 
order        by OWNER,TABLE_NAME 

오라클자바커뮤니티에서 설립한 개발자교육6년차 오엔제이프로그래밍 실무교육센터(오라클SQL,튜닝,힌트,자바프레임워크,안드로이드,아이폰,닷넷 실무개발강의)  


2013년 8월 5일 월요일

[자바교육,오라클교육,자바프레임워크, 스트럿츠]Struts Action처리 후 다음 View 결정하기, 오라클자바커뮤니티

Action처리 후 다음 View 결정하기 


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의) 
 www.onjprogramming.co.kr 


Action 클래스의 execute() 메소드를 보시면 Return형이 org.apache.struts.action.ActionForward임을 알 수 있습니다. ActionForward 클래스는 execute()메소드가 종료된 후 Controller에서 제어를 넘길 곳을 지정 합니다.

또한 코드 내에서 실제 파일명을 주는 대신 ActionForward 매핑에 JSP페이지(View)를 할당하고 이 ActionForward를 웹 애플리케이션 전체에서 사용 가능 하게 할 수 있습니다.

아래는 struts-config.xml 파일 내의 ActionForward 매핑 예 입니다.

<global-forwards>
        <forward name="success" path="/main.jsp" />
        <forward name="logoff" path="/logoff.do" />
        <forward name="login" path="/login.jsp" />
    </global-forwards>

또는 어떠한 Action에서만 Actionforward를 참조하게 하기 위해서는 다음과 같이 할 수도 있습니다.

<action
        Path=”/LoginSunmit”
        Type=”login2.LoginAction”
        Scope=”request”>
        <forward name=”SUCCESS” path=”/success.jsp” redirect=”true”/>
</action>

위에서 redirect를 true로 했으므로 이 경우엔 forward가 아니라 redirection을 이용합니다.

아래는 로그인 예제의 LogoffAction.java(로그오프 Action 처리) 입니다.

package login2;

import org.apache.struts.action.Action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletResponse;

import login2.LoginForm;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

public class LogoffAction extends Action {       
       
        public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {
               
                //필요한 어트리뷰트를 뽑아 냅니다.
                //LoginAction에서 사용자의 로그온개체를 Consants.USER_KEY라는 이름으로 세션에 저장
                HttpSession session = request.getSession();
                UserInfoVO userinfo = (UserInfoVO)session.getAttribute(Constants.USER_KEY);
               
                if (userinfo != null) {
                        //로그를 남기자
                        StringBuffer buf = new StringBuffer("User Logout : " + userinfo.getId());
                        servlet.log(buf.toString());                                       
                }               
               
                //사용자의 로그인을 삭제, session.invaidate() 의 경우 션의 모든 것을 무효화 시킴.
                session.removeAttribute(Constants.USER_KEY);
               
                //성공적으로 처리 되었음을 알림
                return (mapping.findForward(Constants.SUCCESS));
               
        }

       

2013년 8월 2일 금요일

[oracle hint]조인 방법 변경(USE_HASH) , 오라클힌트강좌,오라클실무전문교육,오엔제이프로그래밍

Hint]조인 방법 변경(USE_HASH)
 
구로디지털 오엔제이프로그래밍실무교육센터
 
해시 조인(Hash-Join)은 두 테이블 중 하나를 기준으로 비트맵 해시 테이블을 메모리에 올린 후 나머지 테이블을 스캔 하면서 해싱 테이블을 적용하여 메모리에 로딩된 테이블과 비교하여 매칭되는 데이터를 추출하는 방식 입니다.
 
성능을 위해서는 당연히 사이즈가 작은 테이블이 메모리에 올라가는 것이 좋은데 이때 이 테이블을 드라이빙 테이블(driving/outer table) 이라고 합니다특히 이 해시 테이블이 메모리에 생성되면 성능은 좋으며(메모리에 생성되지 않으면 내부적으로 임시 테이블이 만들어 져야 합니다.) 두 테이블의 크기 차이가 클수록 성능은 좋아집니다.
 
또한 해시 조인은 안티 조인과 병렬처리와 잘 맞으며 범위 검색(Range scan)이 아닌 동등 비교(Equi-Join, where절에서 등호로 비교하는 경우)에 더 적합 합니다.
 
 
[형식]
 
select   from 작은테이블큰테이블
 
 
[]
아래는 Oracle 10g에서 테스트 했습니다.
 
아래에서 dept 테이블이 메모리에 로드되어 emp 테이블의 내용과 비교하면서 결과를 추출 합니다.
 
select    
           e.empno,
          e.ename,
          d.dname,
          d.loc
from   dept d, emp e
where  e.deptno = d.deptno
 
---------------------------------------------------------------
Operation            Object Name      Rows     Bytes    Cost     
-------------------------------------------------------------
SELECT STATEMENT Optimizer Mode=ALL_ROWS               14                      6
  HASH JOIN                    14         406       6                                                       
    TABLE ACCESS FULL             SCOTT.DEPT      4           72         3                         
    TABLE ACCESS BY INDEX ROWID         SCOTT.EMP        14         154       2            
      INDEX FULL SCAN   SCOTT.IDX_EMP_DEPTNO            13                      1 
 
 
select 
       e.empno,
          e.ename,
          d.dname,
          d.loc
from   emp e, dept d
where  e.deptno = d.deptno
 
------------------------------------------------------------------
Operation            Object Name      Rows     Bytes    Cost     
---------------------------------------------------------------
SELECT STATEMENT Optimizer Mode=ALL_ROWS               14                      6
  HASH JOIN                    14         406       6                                                       
    TABLE ACCESS BY INDEX ROWID         SCOTT.EMP        14         154       2            
      INDEX FULL SCAN   SCOTT.IDX_EMP_DEPTNO            13                      1
    TABLE ACCESS FULL             SCOTT.DEPT      4           72         3                              
 
참고로 ALL_ROWS인 경우엔 머지 조인과 해시 조인을 비교한다면 해시 조인의 성능이 좋으며 중첩 조인의 경우 주로 첫번째 로우를 빠르게 추출하기 위한 FIRST_ROWS로 수행되는 조인 입니다.
 
 
 
 
[실습]
 
-      실습을 위한 예제 테이블 및 데이터는 아래 링크에서 확인 바랍니다.
 
myemp1 : 1000만건
myemp1_old : 100만건
mydept : 5
 
테스트환경 : oracle 11g
 
 
MYDEP1 테이블이 드라이빙 테이블
 
SQL> select
  2         e.ename,
  3         d.dname
  4  from   mydept1 d, myemp1 e
  5  where  e.deptno = d.deptno  ;
 
20000000 개의 행이 선택되었습니다.
 
   : 00:01:42.32
 
------------------------------------------------------------------------------
| Id  | Operation          | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |         |    20M|  1525M| 17043   (2)| 00:03:25 |
|*  1 |  HASH JOIN         |         |    20M|  1525M| 17043   (2)| 00:03:25 |
|   2 |   TABLE ACCESS FULL| MYDEPT1 |    10 |   650 |     3   (0)| 00:00:01 |
|   3 |   TABLE ACCESS FULL| MYEMP1  |    10M|   143M| 16941   (1)| 00:03:24 |
------------------------------------------------------------------------------
 
 
 
 
이번에는 MYEMP1 테이블이 드라이빙 테이블이 된다.
 
SQL> select
  2         e.ename,
  3         d.dname
  4  from   myemp1 e, mydept1 d
  5  where  e.deptno = d.deptno ;
 
20000000 개의 행이 선택되었습니다.
 
   : 00:02:03.14
 
--------------------------------------------------------------------------------------
| Id  | Operation          | Name    | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |         |    20M|  1525M|       | 29883   (1)| 00:05:59 |
|*  1 |  HASH JOIN         |         |    20M|  1525M|   257M| 29883   (1)| 00:05:59 |
|   2 |   TABLE ACCESS FULL| MYEMP1  |    10M|   143M|       | 16941   (1)| 00:03:24 |
|   3 |   TABLE ACCESS FULL| MYDEPT1 |    10 |   650 |       |     3   (0)| 00:00:01 |

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

[Oracle Hint강의]join hint 조인 방법 변경(USE_MERGE) , 오라클힌트강좌

[Oracle Hint강의]join hint 조인 방법 변경(USE_MERGE)
 
구로디지털 오엔제이프로그래밍실무교육센터
 
 
머지 조인(Merge Join)이 일어나도록 유도하는 힌트 구문으로 이 경우 거의 SORT를 동반하므로 SORT MERGE JOIN이라고 부릅니다. 머지 조인이란 양쪽 테이블에서 대상 로우를 추출 후 조인 컬럼을 기준으로 SORT를 한 후 최종 결과를 만들어 내는 조인 방식 입니다.
 
USE_NL처럼 FROM 절 다음에 위치하는 테이블의 순서는 중요하지 않은데 그 이유는 어차피 독립적으로 정렬된 후 병합이 일어나므로 중요하지 않다고 할 수 있으며 SORT MERGE JOIN에서는 드라이빙 테이블의 의미가 없습니다.
 
[형식]
 
 
[]
아래 예제는 Oracle 10g에서 돌렸습니다.
 
 
select
       e.empno,
          e.ename,
          d.dname,
          d.loc
from   dept d, emp e
where  e.deptno = d.deptno
 
---------------------------------------------------------------
Operation            Object Name      Rows     Bytes    Cost     
-------------------------------------------------------------
SELECT STATEMENT Optimizer Mode=ALL_ROWS               14                      5
  MERGE JOIN                  14         406       5                                                       
    TABLE ACCESS BY INDEX ROWID         SCOTT.DEPT      4           72         2            
      INDEX FULL SCAN   SCOTT.PK_DEPT             4                        1            
    SORT JOIN                 14         154       3                                                       
      TABLE ACCESS BY INDEX ROWID      SCOTT.EMP        14         154       2            
        INDEX FULL SCAN             SCOTT.IDX_EMP_DEPTNO            13                      1                                                           
 
select
       e.empno,
          e.ename,
          d.dname,
          d.loc
from   dept d, emp e
where  e.deptno = d.deptno
 
---------------------------------------------------------------------
Operation            Object Name      Rows     Bytes    Cost     
------------------------------------------------------------------
SELECT STATEMENT Optimizer Mode=ALL_ROWS               14                      5
  MERGE JOIN                  14         406       5                                                       
    TABLE ACCESS BY INDEX ROWID         SCOTT.DEPT      4           72         2            
      INDEX FULL SCAN   SCOTT.PK_DEPT             4                        1                SORT JOIN                14         154               3                                                       
      TABLE ACCESS BY INDEX ROWID      SCOTT.EMP        14         154       2            
        INDEX FULL SCAN             SCOTT.IDX_EMP_DEPTNO            13                      1                                                           
 
[실습]
 
-      실습을 위한 예제 테이블 및 데이터는 아래 링크에서 확인 바랍니다.
 
myemp1 : 1000만건
myemp1_old : 100만건
mydept : 5
 
테스트환경 : oracle 11g
 
 
MYEMP1이 비드라이빙 테이블이지만 머지조인 에서는 별 의미 없다.
 
SQL> select
  2         e.ename,
  3         d.dname
  4  from   mydept1 d, myemp1 e
  5  where  e.deptno = d.deptno   ;
 
20000000 개의 행이 선택되었습니다.
 
   : 00:02:22.62
 
 
---------------------------------------------------------------------------------------
| Id  | Operation           | Name    | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |         |    20M|   476M|       | 68516   (2)| 00:13:43 |
|   1 |  MERGE JOIN         |         |    20M|   476M|       | 68516   (2)| 00:13:43 |
|   2 |   SORT JOIN         |         |    10 |   100 |       |     4  (25)| 00:00:01 |
|   3 |    TABLE ACCESS FULL| MYDEPT1 |    10 |   100 |       |     3   (0)| 00:00:01 |
|*  4 |   SORT JOIN         |         |    10M|   143M|   459M| 68463   (1)| 00:13:42 |
|   5 |    TABLE ACCESS FULL| MYEMP1  |    10M|   143M|       | 16941   (1)| 00:03:24 |
 
 
SQL> select
  2         e.ename,
  3         d.dname
  4  from   myemp1 e, mydept1 d
  5  where  e.deptno = d.deptno ;
 
20000000 개의 행이 선택되었습니다.
 
   : 00:02:09.58
 
---------------------------------------------------------------------------------------
| Id  | Operation           | Name    | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |         |    20M|   476M|       | 68516   (2)| 00:13:43 |
|   1 |  MERGE JOIN         |         |    20M|   476M|       | 68516   (2)| 00:13:43 |
|   2 |   SORT JOIN         |         |    10M|   143M|   459M| 68463   (1)| 00:13:42 |
|   3 |    TABLE ACCESS FULL| MYEMP1  |    10M|   143M|       | 16941   (1)| 00:03:24 |
|*  4 |   SORT JOIN         |         |    10 |   100 |       |     4  (25)| 00:00:01 |
|   5 |    TABLE ACCESS FULL| MYDEPT1 |    10 |   100 |       |     3   (0)| 00:00:01 |
---------------------------------------------------------------------------------------