레이블이 오라클자바교육인 게시물을 표시합니다. 모든 게시물 표시
레이블이 오라클자바교육인 게시물을 표시합니다. 모든 게시물 표시

2015년 1월 26일 월요일

[평일야간,주말주간야간]JAVA,Network&JSP&Spring,MyBatis,Hibernate-개인부담0~20%

[평일야간,주말주간야간]JAVA,Network&JSP&Spring,MyBatis,Hibernate-개인부담0~20%
 
소수 정예 과정!!
 
자세한 교육일정/상세 및 지원방법은 아래  URL에서 확인 바랍니다.





 

강좌명JAVA,Network&JSP&Spring,MyBatis(자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지)
오라클자바커뮤니티(www.oraclejavacommunity.co.kr) 추천 실전강좌
교재자체교재 or PDF 제공(교재비 25,000원 별도)
강좌 일정상단 URL 참조
강의 장소[A강의장]구로디지털단지역2번 출구 -> 미니스톱끼고 우회전 -> 100m 직진 후 골목길 끝에서 횡단보도 건너기 --> 우회전 후 구로호텔 직전 좌측길, 호텔 바로 뒤편 파트너스타워2차 301호
[약도보기]
수강절차- 강좌내용 확인
- 전화 또는 홈페이지(www.oraclejavacommunity.com)를 통한 수강지원 및 수강료 결제(무통장입금, 온라인 카드결제)
- 고용보험 가입자(재직자)인 경우 고용보험환급 관련 서류 제출
- 수강전 : 커리큘럼 및 장소에 대해 다시 한번 공지
- 교육 전 설문 작성(간단한 개발 경력, 수강 목적, 강좌진행방식 등)
- 강좌 수강
- 수강후 : 교육 후 설문 작성
수강료- 과정당 수강료 및 환급가능금액은 상단 URL에서 참조바랍니다.
* 휴강 :법정공휴일
수강료
입금안내
- 온/오프라인 카드결제, 계좌이체(수강안내->입금안내 참조)
- 상단 URL에서 확인 부탁드립니다.
문의사항02-851-4790 번으로 연락 부탁 드립니다.
교육개요본과정은 단기간에 자바기반 프로그래머를 양성하기 위한 과정이며, 프로그래밍 언어의 경험이 있는 분이지만 자바를 처음하시는 분들을 위해 짧은 기간에 현장에서 필요로 하는 기술들을 최적화된 교재 및 강사를 통해 배울 수 있도록 하는 과정 입니다.

자바의 기본적인 사항부터 JDBC 프로그래밍, 자바네트워크 프로그래밍, JSP의 기본이 되는 Servlet 그리고 JSP의 기본적인 문법과 Ajax, jQuery를 통해 화면 깜박임없이 웹페이지를 역동적으로 구성할 수 있도록 배우며, 최근 가장 많이 사용되는 JAVA기반의 프레임워크인 Spring, SQL Data Mapper까지 배울 수 있는 그야말로 단기간에 자바 개발자로 가시고자 하는 분들을 위한 최적의 과정 입니다.

많은 양이라고 생각될지 모르지겠만 강사님들이 주시는 과제와 팁을 적절히 수행하고 그날그날 수업에 대해 복습을 하시면서 따라 온다면 자기도 모르는 사이에 자바 개발자로 거듭나 있을 것입니다.

감사합니다.
교육목표- 자바 문법의 이해
- 객체지향 프로그램 개발의 이해
- 자바네트워크의 이해(소켓프로그래밍, 자바RMI 프로그래밍)
- 자바 웹 개발의 이해
- Ajax, jQUERY와 같은 웹 기술에 대한 이해
- Servlet/JSP 개발에 대한 이해
- Spring3.X/4 Framework에 대한 이해
- Spring3/4 @MVC에 대한 이해
- iBATIS/MyBatis에 대한 이해
- Spring Transaction에 대한 이해
- Spring, iBATIS/MyBatis, Hibernate 연동에 대한 이해
교육대상- 자바개발자로 전향을 원하는 개발자
- 자바 초보 개발자
- 학생 및 신입 개발자
선수학습- 프로그래밍 언어 기본
 



JAVA Basic자바 언어 소개
개발환경 설치(JDK7/8, Eclipse4.3 Kepler/Luna)
기본 문법(연산자, 변수, 상수, 제어문, 반복문)
Virtual Machine 소개
JVM 메모리 영역
클래스 패스(Class Path), 설정방법
Array 이론/실습
클래스와 객체(Class & Object)
Abstarct Data Type
상속(Inheritance)과 다형성
추상클래스(Abstract Class)와 다형성
인터페이스(Interface)와 다형성
연관(Aggregation & Composition)
오버로딩(OverLoading)과 오버라이딩(Overriding)
this/super/constructor
Package 만들기 이론/실습
Java에서 예외 처리 요령
사용자 예외 처리 방법
스트림(Stream) 입출력 관련 클래스, InputStream/OutputStream,
FileInputStream/FileOutputStream
Reader/Writer등 입출력 관련 클래스
표준 입출력/FILE 처리, 객체 직렬화 이론/실습
Thread 개요
Java에서의 Process
Thread 우선순위/동기화
Thread Joining/Interrupt
JAVA8 Lambda __EXPRESSION__
JAVA8 Functional Interface
JAVA8 double colon Operator
JAVA Network ProgrammingURL/HTTP URL
URLConnection,HttpURLConnection
URL을 다루는 예제 실습(Get/Post)

Client Socket과 Server Socket의 개요
Echo Server
MultiThread EchoServer
Socket을 이용한 예제 구현

Distributed Computing(java RMI)
Distributed Computing, Object 소개
Java RMI를 이용한 “Hello World” 제작
RMI 응용예제 실습
JDBC ProgrammingConnection, Statement, ResultSet, PreparedStatement
(DML 예제 실습)
Oracle의 function, procedure 다루기
DBCP, DataSource, Connection Pool
Servlet/JSPServlet의 개요
HelloWorld Servlet
Servlet Mapping, WebServlet Annotation
Servlet의 Request, Response
Servlet에서의 Session, Cookie 다루기
JSP 기본문법
JSP 내장 객체
Java Beans
JSP에서의 Session, Cookie 다루기
JSTL, EL
MVC Model의 이해
Ajax/jQUERYAjax 개발환경 구축
왜 Ajax 인가?
Ajax의 기본 구성
XMLHttpRequest 객체
innerHTML의 사용
DOM(Document Object Model) 다루기
Ajax MVC

- jQuery 개요, 다운로드, 설치
- $(document).ready() 메소드
- Selector
- $(“*"), $("#ID"), $("DIV"),$(".classname"), $("p > a"),
- $(“elementname.classname")
- 속성 선택자, 속성(attr)
- 입력양식 필터 선택자
- 위치와 관련된 필터 선택자
- jQuery 배열(Array) 관리
- jQuery 객체 확장
- 기본 필터링 메소드
- 특정 위치 문서 객체 선택
- 문서 객체에서 특정 태그를 선택하는 방법
- innerHTML 속성과 관련된 jQuery 메서드
- 문서객체 생성 , 제거
- jQuery Event
- 이벤트 관련 메소드(발생, 제거)
- 이벤트 자동 발생
- 마우스/키보드/윈도우/입력양식 이벤트
- jQuery 기본효과, 사용자지정효과
- jQuery, Ajax 관련 메소드
- XML 문서 다루기
- 입력양식 전송
Spring3/4 FrameworkJAVA Bean vs EJB vs Spring
J2EE Framework에 대한 흐름과 Spring Framework에 대한 이해
개발 환경 설정(Eclipse4.2, Tomcat7, Spring3.2, MAVEN, STS 다운로드 및 설치)
Spring IoC
DL(Dependency LookUp) &DI(Dependency Injection)
Dependency Pull, CDL(Contaxtualized Lookup)
Setter/Constructor/Method Injection
DL. DI 예제를 통한 이해
Spring 설정(XML, Annotation)
Spring AOP 란 ?Code, Advice, JoinPoint,PointCut
Aspect, Weaving, ProxyFactoryBean
Annotation기반 AOP(AspectJ)
Auto Scanning 컴포넌트 (@Component,@Repository,@Service,@Contoroller)
@Resource vs @Autowired
ProxyFactoryBean을 통한 AOP 구현
AOP NAMESPACE를 통한 AOP 구현
@AspectJ Annotation을 통한 AOP 구현
Spring JDBC(이론 및 실습예제)
Spring Web MVC (이론 및 실습예제)
Spring Controller
Spring MVC Interceptor
@Controller, @RequestMapping, @SessionAttributes, @ModelAttribute
Spring4 @MVC Multiple File Upload
Spring 표현언어 SpEL
Spring Tiles 연동
Spring3/4 Transaction 관리
@Transactional Annotation, XML설정방식, 프로그래밍적 트랜잭션 처리방법의 이해
Spring Interceptor
Spring Tile연동
Spring Scheduling(Quartz연동)

Spring3/4 를 이용한 게시판 작성
- 리스트보기,글쓰기,읽기,댓글,답변글처리
- @MVC, @Controller, @RequestParam, @SessionAttibutes, @ModelAttribute 매핑 적용
- 주입(DI)를 Annotatrion으로 변경
- Spring AOP를 적용하여 게시판 DML 로깅 하기
- 스프링 게시판에 MyBatis 적용하여 SQL문을 XML안으로
iBATIS/MyBatis개요 및 소개
개발환경 설정 및 설치
Data Mapper란
sqlMapConfig 이해 및 환경설정
Spring, MyBatis 연동
SQL Map XML File 이해
SqlMapClient 이해
SQL의 실행(Insert/update/delete) 이해와 실습
Spring연동
HibernateHibernate 소개
SessionFactory 설정
1:1, 1:다 매핑
Session Interface
Hibernate DML
Spring, Hibernate 예제 프로그램 작성
Hibernate 설정을 Annotation으로...@Entity, @Table, @Id, @Column
Spring, Hinernate Transaction 실습
 

 

2013년 10월 23일 수요일

오라클 SQL 튜닝의 도구 – SQL*TRACE와 TKPROF [ORACLE강좌]

오라클  SQL 튜닝의 도구 – SQL*TRACE와 TKPROF [ORACLE강좌]

Oracle의 SQL*TRACE는 사용자가 실행 한 SQL문에 대해 구문분석(Parsing), 실행(execute), 추출(fetch) 부분으로 나누어 각 단계에서 걸리는 Overhead와 시간 등의 통계 정보를 일정한 형태로 저장 합니다. EXPALIN PLAN에서 제공하는 정보와 더블어 CPU/IO의 필요량, 실행계획의 각 단계에서의 레코드 개수등의 정보도 확인 가능 합니다. EXPLAIN PLAN 명령어와 함께 자주 사용되는 튜닝의 도구 입니다. 

SQL*TRACE나 TKPROF를 실행 했을 때의 결과는 이해하기가 쉽지 않지만 강력한 튜닝의 도구 입니다. SQL*TRACE에 의해 분석되는 결과는 바이너리 형태로 운영체제의 파일 시스템에 생성 됩니다. 물론 바이너리 이므로 결과를 직접 눈으로 보면 이해가 되지 않지만 TKPROF 유틸리티를 이용하여 텍스트 파일 형태로 변환 시켜 확인이 가능 합니다. 

SQL*TRACE의 결과는 데이터베이스 전체 또는 특정 세션에 대해 적용 할 수 있는데 데이터베이스 전체에 트레이스를 적용하면 실제 Application 수행에 추가적인 부하를 가져오므로 특별한 경우를 제외하고 전체 데이터베이스 시스템에 TRACE를 거는 것은 삼가 해야 합니다. 대부분은 특정 세션에 대해서만 부분적으로 활성화 하여 사용 합니다. 


SQL*TRACE의 사용 

SQL TRACE를 사용하기 전에 몇 가지 설정이 필요한데 먼저 초기파일에서 USER_DUMP_DEST 파라미터를 확인해야 합니다. 이 매개변수는 TRACE를 실행 할 때 생성되는 파일의 위치를 설정 하는 것입니다. 또한 시간 정보를 TRACE 항목에 추가할려면 TIMED_STATISTICS 항목을 TRUE로 해야 하거나 SQL*Plus등에서는 alter session set timed_statistics=true 라고 해주어야 합니다. 아래에 자세히 확인 하도록 합니다. 

TIMED_STATISTICS 

시간 통계 정보에 대해 수집여부를 결정, 기본값은 false 
세션레벨에서는 alter session set timed_statistics=true라고 하면 됩니다. 

MAX_DUMP_FILE_SIZE 

TRACE의 결과로 생기는 바이너리 파일의 최대 사이즈를 단위는 블록 입니다. 기본값은 500 블록 입니다. 또한 세션 레벨에서 다음과 같이 지정 가능 합니다. Alter session set max_dump_file_size = 800(800개의 시스템 블록) 

USER_DUMP_DEST 

TRACE의 결과로 생기는 바이너리 파일의 위치를 지정 합니다. 세션레벨에서는 alter session set  user_dump_dest = “C:\oracle\admin\wink\udump” 등으로 지정 합니다. 

위의 세개의 파라미터를 init.ora 파일에 지정하였다면 SQL*TRACE의 시작을 전체 데이터베이스에서 할건지 세션 레벨에서 할건지를 정할 수가 있습니다. 인스턴스 레벨에서 할려면 init.ora 파일에서 SQL_TRACE 항목을 TRUE로 설정하면 되구요 세션 레벨에서 할려면 alter session set sql_trace = true 라고 하면 됩니다. 

자 이제 실습을 위해 위의 3개의 매개변수를 init.ora 에 설정토록 합니다. 

MAX_DUMP_SIZE = 800 
TIMED_STATISTICS = TRUE 
USER_DUMP_DEST = C:\oracle\admin\wink\udump 

다음을 따라 하도록 합니다. 

SQL> conn / as sysdba 
연결되었습니다. 
SQL> shutdown immediate 
데이터베이스가 닫혔습니다. 
데이터베이스가 마운트 해제되었습니다. 
ORACLE 인스턴스가 종료되었습니다. 
SQL> startup open 
ORACLE 인스턴스가 시작되었습니다. 

Total System Global Area 135338868 bytes 
Fixed Size 453492 bytes 
Variable Size 109051904 bytes 
Database Buffers 25165824 bytes 
Redo Buffers 667648 bytes 
데이터베이스가 마운트되었습니다. 
데이터베이스가 열렸습니다. 

SQL>conn scott/tiger 

SQL> alter session set sql_trace=true; 

세션이 변경되었습니다. 

SQL> select job,avg(sal) from emp 
2 group by job 
3 having avg(sal) > (select avg(sal) from emp 
4 where job = 'SALESMAN'); 

JOB AVG(SAL) 
--------- ---------- 
ANALYST 3000 
MANAGER 2758.33333 
PRESIDENT 5000 

session에서 trace를 중지 

SQL> alter session set sql_trace=false; 

SQL*Plus를 종료하고 c:\oracle\admin\wink\udump에 가보면 trc 파일이 생겼을 것 
입니다. 저의 경우 DB SID가 wink이므로 wink_ora_3316.trc 와 같은 파일이 생겼습니다. 

TKPROF를 이용하여 TRACE파일을 텍스트 파일로 변경 하기 

TKPROF Utility를 이용하면 매우 유용한 분석 정보를 얻을 수 있습니다. 즉 TKPROF의 결과 파일은 트레이스가 실행되는 동안 프로세스에 의해 데이터베이스에서 실행된 작업에 대한 요약 정보 입니다. 

텍스트 파일의 내용을 보면 PARSE, EXECUTION, FETCH시 작업을 실행 한 횟수, CPU 사용 시간, 검색된 행이 무엇인지, SQL이 수행된 총 소요시간, DISK IO 블록 수, 조건을 만족하는 전체 행의 수, 수행된 SQL문이 사용한 SGA 영역의 크기, SQL문장의 실행 계획, 해당 세션에서 작업했던 전체 작업에 대한 CPU, 메모리, 블록의 크기 등의 정보를 확인 할 수 있습니다. 

SQL문을 해석하기 위해서는 아래의 단계가 필요 합니다. 

파싱(parse) 

SQL문을 실행 계획으로 번역 하는 것을 말합니다. 해당 SQL을 실행 하는데 필요한 적절한 권한, 컬럼이 있는지, 참조된 객체에 관한 확인 등의 작업이 이루어지게 됩니다. 

실행(execution) 

오라클에 의해 SQL문을 실제 실행 한 것을 말합니다. 

추출/인출(fetch) 

쿼리에 의해 추출된 레코드를 이여기 합니다. Select 문에서만 이용 됩니다. 


다음은 TKPROF의 통계 정보 컬럼 입니다. 

Count : 분석, 실행, 추출을 몇번 했는지를 나타 냅니다. 
CPU : 분석, 실행, 추출에 대한 CPU 처리 시간(CURSOR를 공유하면 분석단계의 처리 시간은 0 입니다.) 
Elapsed : 분석, 실행, 추출 처리 단계별로 처리된 소요 시간 
Disk : 테이블의 데이터를 읽기 위해 데이터 파일로부터 읽어 들인 블록 수 
Query : SELECT로 데이터를 읽어 올 때 이미 다른 사용자에 의해 같은 데이터가 사용 되었다면 그 블록에서 데이터를 가져옵니다. 
Current : 메모리에 저장된 데이터를 가지고 오기 위해 읽은 버퍼의 블록 수(update, insert, delete 후 select 했을 때) 

TKPROF를 실행하기 위한 문법 

Explain = 사용자계정/패스워드(명시된 사용자에 대해 EXPLAIN PLAN 실행) 
Print = n (트레이스 파일내의 분석된 SQL문의 수를 n 만큼만 제한할 때 이용) 
Record = 파일명(트레이스 파일내에 분석된 SQL문을 지정한 파일에 저장) 
Sort=option(트레이스 파일내에 분석된 SQL문을 지정한 옵션에 의해 정렬) 
Sys=[NO](트레이스 파일내에 생성된 SQL 문장 중에 오라클 서버가 내부적인 작업을 위해 실행한 SQL문장을 출력 시 포함 할건지를 결정) 
Table=스키마.테이블명(실행 계획을 지정한 테이블에 저장) 

이전의 SQL*TRACE에 의해 생긴 바이너리 파일을 TKPROF를 이용하여 분석을 해보도록 하겠습니다. 

명령프롬픝에서 다음과 같이 실행 합니다.(TRACE 파일이 만들어진 곳에서 실행) 

C:\oracle\admin\wink\udump>tkprof wink_ora_3316.trc sql1.tkp sys=no explain=scot 
t/tiger 

TKPROF: Release 9.2.0.1.0 - Production on 목 Dec 16 01:33:23 2004 

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved. 

다음은 sql1.tkp 파일의 내용 입니다. 



TKPROF: Release 9.2.0.1.0 - Production on 목 Dec 16 01:33:23 2004 

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved. 

Trace file: wink_ora_3316.trc 
Sort options: default 

******************************************************************************** 
count = number of times OCI procedure was executed 
cpu = cpu time in seconds executing 
elapsed = elapsed time in seconds executing 
disk = number of physical reads of buffers from disk 
query = number of buffers gotten for consistent read 
current = number of buffers gotten in current mode (usually for update) 
rows = number of rows processed by the fetch or execute call 
******************************************************************************** 

alter session set sql_trace=true 


call count cpu elapsed disk query current rows 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
Parse 0 0.00 0.00 0 0 0 0 
Execute 1 0.00 0.00 0 0 0 0 
Fetch 0 0.00 0.00 0 0 0 0 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
total 1 0.00 0.00 0 0 0 0 

Misses in library cache during parse: 0 
Optimizer goal: CHOOSE 
Parsing user id: 59 (SCOTT) 
******************************************************************************** 


아래는 사용자가 실행한 SQL 문장 입니다. 

select job,avg(sal) from emp 
group by job 
having avg(sal) > (select avg(sal) from emp 
where job = 'SALESMAN') 

call count cpu elapsed disk query current rows 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
Parse 1 0.00 0.00 0 0 0 0 
Execute 1 0.00 0.00 0 0 0 0 
Fetch 2 0.00 0.00 0 6 0 3 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
total 4 0.00 0.01 0 6 0 3 

Misses in library cache during parse: 1 이 값이 0이라는 의미는 실행한 SQL문이 이전에 실행 된적이 없었음을 나타 냅니다. 
Optimizer goal: CHOOSE 옵티마이저 모드 입니다. 
Parsing user id: 59 (SCOTT) 

Rows Row Source Operation 
------- --------------------------------------------------- 
3 FILTER 
5 SORT GROUP BY 
14 TABLE ACCESS FULL EMP 
1 SORT AGGREGATE 
4 TABLE ACCESS FULL EMP 


Rows Execution Plan 
------- --------------------------------------------------- 
0 SELECT STATEMENT GOAL: CHOOSE 
3 FILTER 
5 SORT (GROUP BY) 
14 TABLE ACCESS GOAL: ANALYZED (FULL) OF 'EMP' 
1 SORT (AGGREGATE) 
4 TABLE ACCESS GOAL: ANALYZED (FULL) OF 'EMP' 

******************************************************************************** 

alter session set sql_trace=false 


call count cpu elapsed disk query current rows 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
Parse 1 0.00 0.00 0 0 0 0 
Execute 1 0.01 0.00 0 0 0 0 
Fetch 0 0.00 0.00 0 0 0 0 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
total 2 0.01 0.00 0 0 0 0 

Misses in library cache during parse: 0 
Optimizer goal: CHOOSE 
Parsing user id: 59 (SCOTT) 



******************************************************************************** 
아래의 TOTAL은 전체 작업 결과에 대한 분석 결과 입니다. 

OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS 

call count cpu elapsed disk query current rows 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
Parse 2 0.00 0.00 0 0 0 0 
Execute 3 0.01 0.00 0 0 0 0 
Fetch 2 0.00 0.00 0 6 0 3 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
total 7 0.01 0.01 0 6 0 3 

Misses in library cache during parse: 1 


OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS 

call count cpu elapsed disk query current rows 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
Parse 1 0.00 0.00 0 0 0 0 
Execute 1 0.00 0.00 0 0 0 0 
Fetch 1 0.01 0.00 0 3 0 1 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
total 3 0.01 0.00 0 3 0 1 

Misses in library cache during parse: 0 

3 user SQL statements in session. 
1 internal SQL statements in session. 
4 SQL statements in session. 
1 statement EXPLAINed in this session. 
******************************************************************************** 
Trace file: wink_ora_3316.trc 
Trace file compatibility: 9.00.01 
Sort options: default 

1 session in tracefile. 
3 user SQL statements in trace file. 
1 internal SQL statements in trace file. 
4 SQL statements in trace file. 
4 unique SQL statements in trace file. 
1 SQL statements EXPLAINed using schema: 
SCOTT.prof$plan_table 
Default table was used. 
Table was created. 
Table was dropped. 
54 lines in trace file. 

2013년 10월 15일 화요일

오라클 동의어(Oracle Synonym) 오라클 동의어(Oracle Synonym) - 테이블, 뷰, 시쿼스에 대한 별칭

오라클 동의어(Oracle Synonym)

오라클 동의어(Oracle Synonym)
- 테이블, 뷰, 시쿼스에 대한 별칭, 동의어
- public, private로 생성 가능
- Public synonym은 생성할 수 있는 권한이 있는 user만이 만들 수 있으며, 모든 user들이 사용할 수 있다.

[문법]
CREATE [PUBLIC] SYNONYM 
 synonym명 FOR object;
DROP [PUBLIC] SYNONYM synonym명; 
[예]
CREATE SYNONYM emp FOR scott.emp;
DROP SYNONYM emp;
 

SQL> conn system/onj
 
SQL> SELECT * FROM s_emp;
(* Error 발생)
 
SQL> SELECT * FROM scott.s_emp;
(* system user는 SELECT ANY TABLE 권한을 가지고 있으므로 성공)
 
SQL> CREATE SYNONYM s_emp FOR scott.s_emp;
 
SQL> SELECT * FROM s_emp;
 
SQL> CREATE TABLE s_emp (a number);
(* Error 발생)
 
Base table의 이름이 바뀌면 Synonym은 더 이상 사용할 수 없게 된다.

SQL> conn scott/tiger

SQL> RENAME s_emp TO e;

SQL> conn system/manager

SQL> SELECT * FROM s_emp;
(* 에러 발생)

SQL> conn scott/tiger

SQL> RENAME e TO s_emp;


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




2013년 8월 26일 월요일

오라클 테이블 생성 예제

테이블 생성 하기


오라클자바커뮤니티에서 설립한  개발자실무교육6년차 오엔제이프로그래밍 실무교육센터
(신입사원채용무료교육, 오라클, SQL, 튜닝, 자바, 스프링, Ajax, jQuery, 안드로이드, 아이폰, 닷넷, C#, ASP.Net)   www.onjprogramming.co.kr 


 
à 오라클을 설치하게 되면 SCOTT계정은 자동으로 생성되어 있을 것이다. 그리고 default tablespace SYSTEM 테이블스페이스로 설정 되어 있다. 원래 SYSTEM 테이블스페이스에 사용자의 테이블을 만드는 것은 좋은 방법이 아니다. 왜냐면 이 부분은 오라클 시스템에서 사용되는 객체들이 저장되는 곳이기 때문이다(딕셔너리 정보 등이 저장된다) . 그러므로 우선 SYS 계정으로 접속하여 SCOTT 사용자의 default tablespace USERS 라는 테이블스페이스로 변경하자. 그리고 실습을 위해 USER_DATA 라는 테이블스페이스를 만들자. 데이터파일의 경로는 PC환경에 맞게 수정하길 바란다.
 
SQL> connect / as sysdba
연결되었습니다.
 
SQL> alter user scott default tablespace users;
 
사용자가 변경되었습니다.
 
SQL> create tablespace user_data
  2  datafile 'C:\oracle\oradata\wink\test01.dbf'
  3  size 10m
  4  autoextend on
  5  next 1m
  6  maxsize 1000m;
 
테이블 영역이 생성되었습니다.
 
SQL> connect scott/tiger
연결되었습니다.
 
à 아래 예문에서 주의 깊게 볼 부분은 tablespace 구이다. 이것은 employee 테이블을 어느 테이블스페이스에 만들것인지에 대해 설정이며 생략되면 scott 사용자의 defaut tablespace에 만들어 지게 된다. 또한 테이블스페이스에서 지정한 매개변수들을 그대로 employee 테이블은 상속 받게 된다. 물론 그 다음 예문처럼 명시적으로 지정을 하는 것도 가능하다.
 
SQL> create table employee (
  2  empno number(4) primary key,
  3  ename varchar2(15) not null,
  4  addr varchar2(50) ,
  5  sal number(8,2)
  6  ) tablespace user_data;
 
테이블이 생성되었습니다.
 
SQL> create table employee2 (
  2  empno number(4) primary key,
  3  ename varchar2(15) not null,
  4  addr varchar2(50) ,
  5  sal number(8,2)
  6  )
  7  pctfree 10
  8  pctused 40
  9  tablespace user_data
 10  storage (
 11     initial 10k
 12     next 10k
 13     maxextents 20
 14     pctincrease 0
 15  );
 
테이블이 생성되었습니다.

2013년 8월 13일 화요일

오라클실행계획 해석

실행계획 해석하는 방법입니다. ORACLE TUNING을 위한 가장 기본적인 입니다.

오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(신입사원채용무료교육, 오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷)  

실행계획은 해당 SQL을 수행하기 위한 절차이며 옵티마이저에 의해 만들어 집니다. 해석을 위해서는 Row Source Operartors Tree 또는 Row Source Level을 이용하여 해석하는데 아래 예를 들어보도록 하죠.

1. Row Source Operators Tree는 Serial Execution에 대한 Tree를 보여주는 것인데 실행계획은 Row Source로 구성되며 각각의 Row Source들을 Tree 형태로 구성하여 해석을 하는 것을 말합니다.

SQL> select ename, dname
2 from emp e, dept d
3 where e.deptno = d.deptno;

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=5 Card=14 Bytes=252)
1 0 HASH JOIN (Cost=5 Card=14 Bytes=252)
2 1 TABLE ACCESS (FULL) OF 'DEPT' (Cost=2 Card=4 Bytes=44)
3 1 TABLE ACCESS (FULL) OF 'EMP' (Cost=2 Card=14 Bytes=98)

Row Source Parent Key(0,1,2,3)
Row Source Key(0,1,1)
각각의 행을 Row Source 또는 Access Operation 이라 한다.

위 실행계획을 도식화 하기 위해서는 Row Source Key와 Row Source Parent Key를 알고 있으면 되는데 Row Source Key 1번은 Parent가 0번이며, 2번/3번은 1번이다. 이를 도식화하여 해것을 하는 것이다. (해석은 밑에서 위로, 좌에서 우측으로 진행을 하면 된다)

2.Row Source Level을 통한 해석

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=5 Card=14 Bytes=252)
1 0 HASH JOIN (Cost=5 Card=14 Bytes=252)
2 1 TABLE ACCESS (FULL) OF 'DEPT' (Cost=2 Card=4 Bytes=44)
3 1 TABLE ACCESS (FULL) OF 'EMP' (Cost=2 Card=14 Bytes=98)

Level 1
Level 2
Level 3

가장 안쪽의 Level 3부터 해석을 하며 같은 레벨의 경우 위쪽부터 해석을 하면 된다.

DEPT 테이블을 FULL Scan한 후 DEP 테이블을 FULL Scan하여 HASH Join 후 원하는 데이터를 추출하는 실행 계획이다.

다음의 예를 보도록 하자.

SQL> select ename, dname
2 from emp e, dept d
3* where trim(e.deptno) = trim(d.deptno);

ENAME DNAME
---------- --------------
CLARK ACCOUNTING
KING ACCOUNTING
MILLER ACCOUNTING
SMITH RESEARCH
……

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



Execution Plan
---------------------------------------------------------
0 SELECT STATEMENT Optimizer=HINT: RULE
1 0 MERGE JOIN
2 1 SORT (JOIN)
3 2 TABLE ACCESS (FULL) OF 'DEPT'
4 1 SORT (JOIN)
5 4 TABLE ACCESS (FULL) OF 'EMP'

위 실행계획에 대한 해석은

Level 4 : DEPT 테이블을 FULL SCAN + EMP 테이블을 FULL SCAN
Level 3 : SORT(JOIN) + SORT(JOIN)  DEPT 테이블을 SORT한것과 EMP 테이블을 SORT한 두개의 집합이 된다.
Level 2 : MERGE JOIN  Level 3에서 만들어진 두개의 집합을 Merge
Level 1 : SELECT STATEMENT  Merge Join을 수행하여 선택된 결과를 추출

[오라클자바community강좌]JAva Sort 알고리즘(자바 셸정렬)

오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터

(신입사원채용무료교육, 오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷)  
www.onjprogramming.co.kr


셸정렬(Shell Sort) 이란 버블정렬의 경우 데이터가 제 위치에서 멀리 떨어져 있으면 여러 번 교환이 필요하게 된다.이것이 버블정렬의 취약점으로서 인접한 데이터만 비교하기 때문에 발생하게 된다.
 이러한 문제를 해결하기 위해 멀리 있는 레코드들 끼리도 비교가 가능하게 효율을 높인 정렬 방법이 고안자인 셸(Donald L.Shell)의 이름을 딴 셸 정렬 이다.
 원리는 주어진 입력 리스트를 적당한 매개변수의 값만큼 서로 떨어진 레코드들과 비교하여 교환하는 과정을 매개변수 값을 바꾸어 가면서 되풀이 하는 것이다.(매개변수의 값은 줄어들면서 1이되면 종료한다.)이때 떨어져 있는 레코드들은 하나의 부분리스트를 구성하여 보통 다른방법(삽입정렬)에 의해 개별적으로 정렬된다


 O(log n) 수행시간이 O(n2)보다 우수함은 자명하다. 그러나 일반적으로 O(n2)은 알고리즘이 간단하고 프로그래밍이 용이 한 반면 O(log n) 의 알고리즘은 복잡하다. 따라서 n이 작은 경우 O(n2)의 알고리즘이 오히려 효과적이다. 셸 정렬은 이러한 수행시간의 효율성을 잘 반영한 정렬기법으로서 레코드 집단을 작은 부분으로 나눈 후 작은 부분집단을 O(n2) 인 삽입 정렬 등으로 빠르게 정렬한다.
 셸정렬의 속도는 Bubble Sort, Selection Sort, Insertion Sort등에 비해 상당히 빠르다. 난수상태의 10000개를 정렬하는 경우 Bubble Sort에 비해 200배, Selection Sort에 비해 110배, Insertion Sort에 비해 80배 ?(N2)의 효율을 나타내는 알고리즘(Quick Sort, Heap Sort, Merge Sort)에 비해 다소 떨어지나 “코드의 간결함, 추가적인 메모리(스택)를 사용하지 않음” 등을 가만하면 별은 무의미 하다.



import java.util.Random;
class ShellSort {
//셸 정렬
int[] sort(int a[]) {
int inc=1;
//증분 inc에 대해 가능한 큰 br> for(int i=inc; i<a.length; i++) {
int temp = a[i];
int j = i;
//j가 증분치보다 크거나 같고 우측이 작으면 바꿈(삽입정렬)
while(j&nb경우란면 아래의 수식에 의해 계속 1이 리턴
inc = inc/3 + 1;
}
return a;
    }

public static void main(String[] args){
int&emp = new int[10000];
long startTime, elapsedTime, counter;

ShellSort mySort = new ShellSort(); 
//----------------- 난수 발생시킴
Random r = new Random();
for(int i=0; i<10000; i++) {
nansu[i] = r.nextInt(10000);
}
//-----------------------------------

//------------------------------------------------------------------------------
//우선 난수를 정렬하고, 정렬된 상태(최선의상황)을 다시 정렬시킴
//------------------------------------------------------------------------------
counter=0;
sortedArray = mySort.sort(nansu);
startTime = System.currentTimeMillis();
do {
 counter++;
 temp = mySort.sort(sortedArray);
  } while (System.currentTimeMillis() - startTime < 1000);
elapsedTime = (System.currentTimeMillis()- startTime) / counter;
System.out.println("[최선의 상황 수행시간] " + elapsedTime + "ms");
//-------------------------------------------------------------------------------

//-------------------------------------------------------------------------------
//반쯤 정열후 ...
//-------------------------------------------------------------------------------
counter=0;
halfSortedArray = sortedArray;
for(int i=0; i<5000; i++) {
halfSortedArray[i] = r.nextInt()*10000;
}
startTime = System.currentTimeMilli.currentTimeMillis()- startTime) / counter;
System.out.println("[반쯤 정렬 수행시간] " + elapsedTime + "ms");
//------------------------------------------------------------------------------- <.length;i++) {
reverseArray[sortedArray.length-i-1] = sortedArray[i];
}
startTime = System.currentTimeMillis();
do {
 counter++;
 temp = mySort.sort(reverseArray)置嬋챨?] " + elapsedTime + "ms");
//-------------------------------------------------------------------------------- 
}
}? 

JAVA Sort 알고리즘(자바 셸정렬)

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


셸정렬(Shell Sort) 이란 버블정렬의 경우 데이터가 제 위치에서 멀리 떨어져 있으면 여러 번 교환이 필요하게 된다.이것이 버블정렬의 취약점으로서 인접한 데이터만 비교하기 때문에 발생하게 된다.
 이러한 문제를 해결하기 위해 멀리 있는 레코드들 끼리도 비교가 가능하게 효율을 높인 정렬 방법이 고안자인 셸(Donald L.Shell)의 이름을 딴 셸 정렬 이다.
 원리는 주어진 입력 리스트를 적당한 매개변수의 값만큼 서로 떨어진 레코드들과 비교하여 교환하는 과정을 매개변수 값을 바꾸어 가면서 되풀이 하는 것이다.(매개변수의 값은 줄어들면서 1이되면 종료한다.)이때 떨어져 있는 레코드들은 하나의 부분리스트를 구성하여 보통 다른방법(삽입정렬)에 의해 개별적으로 정렬된다


 O(log n) 수행시간이 O(n2)보다 우수함은 자명하다. 그러나 일반적으로 O(n2)은 알고리즘이 간단하고 프로그래밍이 용이 한 반면 O(log n) 의 알고리즘은 복잡하다. 따라서 n이 작은 경우 O(n2)의 알고리즘이 오히려 효과적이다. 셸 정렬은 이러한 수행시간의 효율성을 잘 반영한 정렬기법으로서 레코드 집단을 작은 부분으로 나눈 후 작은 부분집단을 O(n2) 인 삽입 정렬 등으로 빠르게 정렬한다.
 셸정렬의 속도는 Bubble Sort, Selection Sort, Insertion Sort등에 비해 상당히 빠르다. 난수상태의 10000개를 정렬하는 경우 Bubble Sort에 비해 200배, Selection Sort에 비해 110배, Insertion Sort에 비해 80배 ?(N2)의 효율을 나타내는 알고리즘(Quick Sort, Heap Sort, Merge Sort)에 비해 다소 떨어지나 “코드의 간결함, 추가적인 메모리(스택)를 사용하지 않음” 등을 가만하면 별은 무의미 하다.



import java.util.Random;
class ShellSort {
//셸 정렬
int[] sort(int a[]) {
int inc=1;
//증분 inc에 대해 가능한 큰 br> for(int i=inc; i<a.length; i++) {
int temp = a[i];
int j = i;
//j가 증분치보다 크거나 같고 우측이 작으면 바꿈(삽입정렬)
while(j&nb경우란면 아래의 수식에 의해 계속 1이 리턴
inc = inc/3 + 1;
}
return a;
    }

public static void main(String[] args){
int&emp = new int[10000];
long startTime, elapsedTime, counter;

ShellSort mySort = new ShellSort(); 
//----------------- 난수 발생시킴
Random r = new Random();
for(int i=0; i<10000; i++) {
nansu[i] = r.nextInt(10000);
}
//-----------------------------------

//------------------------------------------------------------------------------
//우선 난수를 정렬하고, 정렬된 상태(최선의상황)을 다시 정렬시킴
//------------------------------------------------------------------------------
counter=0;
sortedArray = mySort.sort(nansu);
startTime = System.currentTimeMillis();
do {
 counter++;
 temp = mySort.sort(sortedArray);
  } while (System.currentTimeMillis() - startTime < 1000);
elapsedTime = (System.currentTimeMillis()- startTime) / counter;
System.out.println("[최선의 상황 수행시간] " + elapsedTime + "ms");
//-------------------------------------------------------------------------------

//-------------------------------------------------------------------------------
//반쯤 정열후 ...
//-------------------------------------------------------------------------------
counter=0;
halfSortedArray = sortedArray;
for(int i=0; i<5000; i++) {
halfSortedArray[i] = r.nextInt()*10000;
}
startTime = System.currentTimeMilli.currentTimeMillis()- startTime) / counter;
System.out.println("[반쯤 정렬 수행시간] " + elapsedTime + "ms");
//------------------------------------------------------------------------------- <.length;i++) {
reverseArray[sortedArray.length-i-1] = sortedArray[i];
}
startTime = System.currentTimeMillis();
do {
 counter++;
 temp = mySort.sort(reverseArray)置嬋챨?] " + elapsedTime + "ms");
//--------------------------------------------------------------------------------
}
}? 

[오라클자바강좌]JAVA Sort 알고리즘(퀵정렬-재귀호출이용) 예제 입니다. JAVA강좌

java,java교육,java강좌,oraclejava,javaoracle,오라클자바,자바,자바교육,자바강좌,구로디지털자바,구로디지털오라클,오라클자바교육


퀵 정렬(Quick Sort) 이란 주어진 입력리스트를 특정한 키(Control Key, Pivot)로 분리하여 왼쪽에는 키 값보다 작은 값, 우측에는 키 값보다 큰 값을 갖는 서브 리스트로 분리한다. 그런 다음 각각의 서브리스트에서도 같은 방법을 반복적으로 수행하여 정렬하는 방법이다. 


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(신입사원채용무료교육, 오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷)  

다음의 예제를 보자... 

import java.util.Random; 
class QuickSort3{ 
//퀵 정렬(재귀방법) 
int[] qsort(int a[]) { 
//low와 high 값을 parameter로 던지자. 
quicksort(0, a.length-1, a); 
return a; 


void quicksort(int low, int high, int[] a) { 
if (low < high){ 
//서브리스트로 분할 
int pivot = split(low, high, a); 
//생성된 pivot값을 기준으로 재귀호출 
quicksort(low, pivot-1, a); 
quicksort(pivot+1, high, a); 



//pivot 값이 제위치에 정렬되도록 위치를 계산하고  
//입력된 레코드를 재배열 
private int split(int low, int high, int[] a) { 
int avg = (low + high)/2;  //pivot위치를 찾는다. 
exchange(low, avg, a); 
int last = low; 
for(int i=low+1; i<=high; i++) { 
//i값이 pivot값(low위치 값) 보다 
//작으면 바꾼다. 
//last를 1증가후 i위치값과 low위치값을 바꿈 
if (a[i] < a[low]){  
last++; 
exchange(last, i, a); 


exchange(low, last, a); 
return last; 


private void exchange(int low, int high, int[] a) { 
int temp = a[low]; 
a[low] = a[high]; 
a[high] = temp; 



public static void main(String[] args){ 
int nansu[] = new int[10000]; 
int[] sortedArray = new int[10000]; 
int[] halfSortedArray = new int[10000]; 
int[] reverseArray = new int[10000]; 
int[] temp = new int[10000]; 
long startTime, elapsedTime, counter; 

QuickSort3 mySort = new QuickSort3();  
//----------------- 난수 발생시킴 
Random r = new Random(); 
for(int i=0; i<10000; i++) { 
nansu[i] = r.nextInt(100000); 

//----------------------------------- 

//------------------------------------------------------------------------------ 
//난수를 정렬 
//------------------------------------------------------------------------------ 
counter=0; 
startTime = System.currentTimeMillis(); 
do { 
 counter++; 
 sortedArray = mySort.qsort(nansu); 
} while (System.currentTimeMillis() - startTime < 1000); 
elapsedTime = (System.currentTimeMillis()- startTime) / counter; 
System.out.println("[난수일때의 수행시간] " + elapsedTime + "ms"); 

//------------------------------------------------------------------------------ 
// 정렬된 상태(최선의상황)을 다시 정렬시킴 
//------------------------------------------------------------------------------ 
counter=0; 
startTime = System.currentTimeMillis(); 
do { 
 counter++; 
 temp = mySort.qsort(sortedArray); 
  } while (System.currentTimeMillis() - startTime < 1000); 
elapsedTime = (System.currentTimeMillis()- startTime) / counter; 
System.out.println("[최선의 상황 수행시간] " + elapsedTime + "ms"); 
//------------------------------------------------------------------------------- 

//------------------------------------------------------------------------------- 
//반쯤 정열후 ... 
//------------------------------------------------------------------------------- 
counter=0; 
halfSortedArray = sortedArray; 
for(int i=0; i<5000; i++) { 
halfSortedArray[i] = r.nextInt()*10000; 

startTime = System.currentTimeMillis(); 
do { 
 counter++; 
 temp = mySort.qsort(halfSortedArray); 
  } while (System.currentTimeMillis() - startTime < 1000); 
elapsedTime = (System.currentTimeMillis()- startTime) / counter; 
System.out.println("[반쯤 정렬 수행시간] " + elapsedTime + "ms"); 
//------------------------------------------------------------------------------- 

//------------------------------------------------------------------------------- 
//역순상태 
//------------------------------------------------------------------------------- 
counter=0; 
for(int i=0;i<sortedArray.length;i++) { 
reverseArray[sortedArray.length-i-1] = sortedArray[i]; 

startTime = System.currentTimeMillis(); 
do { 
 counter++; 
 temp = mySort.qsort(reverseArray); 
  } while (System.currentTimeMillis() - startTime < 1000); 
elapsedTime = (System.currentTimeMillis()- startTime) / counter; 
System.out.println("[역순 상태 수행시간] " + elapsedTime + "ms"); 
//--------------------------------------------------------------------------------