라벨이 Oracle인 게시물 표시

Oracle SQLDeveloper 성능 향상 방법 정리.

이미지
Oracle SQLDeveloper More Faster~!! SQLDeveloper  오라클에서 무료로 제공하는 DB 관리와 SQL 쿼리 기능을 가진 Tool이다. 좋은 Tool인데 처음 실행이 너무 느리다. 몇년간 봐왔지만 개선이 잘 안되는 것 같다. 이번 Post에서 성능 향상 방법 3가지와 도움되는 설정 2가지를 이야기한다. 시작시간 단축 1. Extension 끄기  최초 SQLDeveloper는 모든 기능이 활성화 되어있다. SQL 개발만 설정하기 위해서는 '도구 > 기능' 메뉴로 들어가 기능을 비활성화 시키자  Database 이전과 버젼제어 기능을 해지한다. Database 이전은 DB Vendor별 Migration을 지원한다. 버젼제어는 Git과 Subversion을 지원한다.  그리고 데이터베이스 옵션에서는 'Oracle OLAP'만 설정하자. 그러면 SQL 개발을 위한 기능들만 자동으로 설정된다. 2. IndexPreferencesTask 기능 Off.  이 기능이 성능하향의 주범(?)이다. 경험 상, 이 기능이 없어서 문제된 적이 없으니 사용하지 말자. 기능을 사용하지 않기 위해서는 실행 Option에 추가해야 한다. 경로는 아래와 같다. sqldeveloper폴더\sqldeveloper\bin\ sqldeveloper.conf  파일 내부에 아래 Option을 추가하자. AddVMOption -DIndexedPreferencesCommand = false 3. Window 테마로 변경  이론상 SQLDeveloper의 'Oracle' 테마는 '화면실행 > OS에 맞는 화면구성 > Oracle 테마 덧씌우기'라고 한다...

Scott 과 함께 - Cross Join 을 Java 로 구현하기

이미지
Cross Join in Java  이번 Post는 Cross Join을 Java로 구현한다. Cross Join은 조건없이 테이블 2개를 합치는 Join이다. 조건이 없다보니 데이터는 2개 테이블의 행 개수의 곱셈이다. 만약 A 테이블(2건)과 B 테이블(3건)을 Cross Join한다면, 행 개수는 2 x 3 = 6 이다.  그런데 궁금한 점은 이런 Join은 어디에 사용하는가? 개인적으로 집계 데이터의 Driving Table로 사용한다. Scott 도메인에서 예를 만든면, '모든 부서 x 모든 Job'의 급여평균을 구할 때 사용할 수 있다. 그래서 경험상 보면, Cross Join은 단독으로 사용하지 않고 Outer Join과 같이 사용한다. SQL with job as ( select distinct emp . job as job_name from emp ) select dept . dname , job . job_name , avg ( emp . sal ) from job cross join dept left outer join emp on ( job . job_name = emp . job and dept . deptno = emp . deptno ) group by dept . dname , job . job_name order by dept . dname , job . job_name    아래 그림처럼 부서에 Job이 없더라도 같은 형식을 유지하기 위해서 Cross Join을 사용한다. 여기서 알아야 할 이슈가 있는데, Cross Join으로 만들어진 Driving Table은 Index가 없기 때문에 Join에 대한 Cost가 높다. 그래서 Driving ...

Scott 과 함께 - Outer Join 을 Java 로 구현하기.

이미지
Outer Join  이번 Post는 Outer Join을 Java로 구현한다. 이전 Inner Join Post와 동일하게 부서의 Job 별 평균급여를 구하지만, 이번에는 직원이 없는 부서도 같이 출력해야 한다. SQL 부서/Job 평균 급여에 Operations 부서도 추가.  Operations 부서는 직원이 없는 부서라서, Job과 평균급여는 Null이다. Operations의 Job은 Null이고 평균급여는 0으로 Java에서 표현한다. select d . dname , e . job , avg ( e . sal ) from dept d left outer join emp e on d . deptno = e . deptno where 1 = 1 group by d . dname , e . job ; Java 부서 Stream + 직원 Stream  처음 생각했던 방법은 부서 Stream의 map()에서 직원 Stream으로 Job별 평균급여를 가져오려고 했지만 실패 했다. Operations의 직원이 없어 직원 Stream의 결과가 Null이면, Operation이 부서 Stream에서 사라졌다. depts . stream () . map ( department -> employees . stream () . filter ( employee -> employee . getDepartment () == department ) . collect ( Collectors . groupingBy (...)) ); 부서 List + 부...

Scott 과 함께 - Inner Join 을 Java 로 구현하기

이미지
Inner join with Java  이번에는 SQL Join과 집계를 Java로 구현한다. 예제는 부서와 Job별 월급의 평균을 가져오는 것이 목적이다. SQL  Java의 결과는 순서에 상관없이 위 그림과 같이 나타나야 한다. 다만 평균급여는 '*'을 사용해 100단위로 표기한다. select dept . dname , emp . job , avg ( emp . sal ) from emp inner join dept on emp . deptno = dept . deptno group by dept . dname , emp . job order by 1 , 2 ; Java JPQL로 필요한 컬럼 조회 후, Java로 집계.  JPQL로 데이터로 직원들의 부서이름, Job, 급여 데이터를 가져온다. 가져온 데이터를 Collectors.groupingBy로 평균급여를 계산한다.   부서이름, Job, 급여는 객체가 이닌 스칼라 타입이기 때문에 결과는 List<Object[]>이다. 배열보다는 편하게 데이터를 꺼내기 위해서 DTO 객체를 만들었다. public class DeptJobCountDto { private String departmentName ; private EmployeeJob job ; private Double amount ; ... } ... Strin sql = "select new dto.DeptJobCountDto (d.name, e.job, e.salary) from Department d join d.employees e" ; 결과 ...

Scott 과 함께 - Recursive Query 구현하기

이미지
Recursive Query   Recursive Query는 계층형(hierarchical) 데이터를 조회할 때 사용하는 쿼리다. 기업에서 흔히 조직도와 BOM(Bill of Materials)에서 사용한다. Oracle은 'Connect By' 그리고 타 DB는 CTE(Common Table Expressions)로 계층형 데이터를 조회할 수 있다. Java의 경우, Entity를 연결해 Graph탐색할 수 있다. 이번 Post는 JPA로 Employee객체의 조직도를 구현하는 기록을 남긴다. Oracle Native Query 결과.  EMP 테이블은 직원 1명에 관리자 1명으로 구성되어 있다. 관리자는 다른 상위 관리자 1명과 연결한다. 'KING'은 사장님이시기 때문에 관리자 값이 Null이다.   'Connect By' 문장은 연결할 데이터 컬럼을 정의한다. 'Start with'는 계층형 데이터의 시작이 어디인지 알려준다. 'Prior' 은 상향식과 하향식으로 데이터 조회 방향을 결정한다. SELECT LEVEL , lpad ( ' ' , LEVEL * 3 , '.' ) || decode ( LEVEL , 1 , NULL , '└▶ ' ) || e . ename AS hierarchy , e . * FROM emp e WHERE 1 = 1 START WITH e . mgr IS NULL CONNECT BY e . mgr = PRIOR e . empno 상향식 결과 SELECT LEVEL , lpad ( ' ' , LEVEL *...

Scott 과 함께 - Domain을 JPA 로 연결

이미지
Scott Schema To JPA.   이전 Post 는 Oracle DB 의 Scott을 객체로 구현했다. 이번 Post는 JPA와 Scott을 연결한다. 또한 초기 데이터는 Insert 문장이 아닌 JPA로 초기화한다. Entity 연결 이전 Post 에서 Oracle 의 Scott 예제 객체들로 만들어봤다. 이번에는 JPA로 연결해서 DB에 저장되는 것을 확인한다. Employee manager 연결.  DB에서 상위 결재권자는 사번이 들어가지만, 객체는 다른 Employee 객체다. 관리자-직원이 서로 연결할 수 있도록 연관관계를 지정했다. 다음 Post에서 재귀형 데이터 조회 예제를 만들 계획이다. @Entity @Table ( name = "emp" ) public class Employee { ... @ManyToOne ( fetch = FetchType . LAZY ) @JoinColumn ( name = "mgr" ) private Employee manager ; @OneToMany ( mappedBy = "manager" ) private List < Employee > members = new ArrayList <>(); ... } SalaryGrade/SalaryGrades 연결.  SalaryGrades를 EMP 테이블에 급여등급 Column이 만들지 않기 위해 @Transient 로 설정한다. Scott 예제의 기존 Table을 최대한 유지하기 위해서다.   Employee 의 SalaryGrade는 Salary에 따라 변하기 때문에 호출할 때마다 달라진다. Salary 가 바뀌면 바뀐 급여로 나오도록 설정한다. @Entity @Table ( name = "emp...