일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- vmin
- vmax
- nth-child()
- 가상클래스 선택자
- 웹개발
- JavaScript
- 김성박
- 보충필요
- HTML Templating
- 즐거운자바
- 서블릿
- 깃헙
- jsp
- 즐거운 자바
- 속성 선택자
- 다시볼 것
- 다시보자
- 자바
- datalist
- 상속
- ES6
- 소스트리
- 부스트코스
- 가상요소 선택자
- spring
- 복합 선택자
- 부정 선택자
- nth-of-type()
- optgroup
- EDWITH
Archives
- Today
- Total
기억의 DataBase
SQL 본문
-
SQL(Structured Query Language)
Structured : 체계화 / 구조화 >> 위에서 아래로(순서대로)
Query : 요청 >> DBMS에 요청
Language : 4GL >> 일종의 프로그램
※ Point : Cost ↓ (Insert, Update, Delete) >> 과정
Benefit ↑ (Select) >> 목적
-3GL은 성능에 큰 차이 X, 4GL은 중요
-
Select 기법이 중요(효율 극대화)
1)Simple Query > 한 Table에서 Select(단순 조회)
2)Join - Product > 조건없이 곱셈( T1(10) x T2(20) = T3(200) ) - TestData 생성용 / Day x 정보
- Join
- Self Join
- Recursive Join
※ 같은 결과물이 나와도 150000(30000x50)번 조회할 일을 30050(30000+50)번에 끝낼 수 있음
※ Net Manager >> IP/TCP 확인
-
SQL에서 가장 중요한 것
1.정합성 >> 원하는 Data를 정확하게 가져오는 것
2.속도(Performance) >> 다른 DB에 비해서 ORACLE은 Query에 따른 속도차이가 큼
(효율적인 Query 작성능력 요구)
(효율적인 Query 작성능력 요구)
>> 현업에서 적게는 5천만건 ~ 10억건의 DB를 처리해야 하므로 성능에 대한 고려는 중요
3. 가독성 >> 예약어 기준 줄바꿈 / 대문자 권장
-
Select문의 핵심은 Join
1.ORACLE JOIN >> SELECT e.employee_id, e.emp_name, d.department_id, d.department_name
FROM employees e, departments d
WHERE e.department_id = d.department_id
AND e.hire_date >= TO_DATE('2003-01-01','YYYY-MM-DD');
3개 이상 Join >> SELECT e.employee_id, e.emp_name, d.department_id, d.department_name, t.task_name
FROM employees e, departments d, task t
WHERE e.department_id = d.department_id
AND d.task_number = t.task_number
AND e.hire_date >= TO_DATE('2003-01-01','YYYY-MM-DD');
>> 가독성 차원이나 작성차원에서 좀 더 좋을 수 있으나, DB별로 호환이 되지 않을 수 있으므로
유지보수 차원에서 ANSI(American National Standards Institute) 방식을 사용하는 것이 나을 수 있다.
>> Table Alias를 해주면 코드가 줄어서 메모리 성능 향상이 있을 수 있고, 작성이 편리(추천)
2.ANSI JOIN >> SELECT e.employee_id, e.emp_name, d.department_id, d.department_name
FROM employees e
INNER JOIN departments d
ON e.department_id = d.department_id
WHERE e.hire_date >= TO_DATE('2003-01-01','YYYY-MM-DD');
3개 이상 Join >> SELECT e.employee_id, e.emp_name, d.department_id, d.department_name, t.task_name
FROM employees e
INNER JOIN departments d
ON e.department_id = d.department_id
INNER JOIN task t
ON d.task_number = t.task_number
WHERE e.hire_date >= TO_DATE('2003-01-01','YYYY-MM-DD');
>> DB별로 호환에 문제가 없고, Join문과 Where문을 분리할 수 있으므로 가독성 차원에서 더 나을 수 있음
>> INNER JOIN / ON 을 JOIN할 때마다 적어줘야 해서 번거롭기는 하지만 깔끔하기는 함
※ Explain Plan
>> Query 실행과정을 Cost를 보여주면서, 작동을 보여줌 >> 튜닝에 필요한 정보를 제공!
-
Join의 4가지 방법(Very Important)
>> 질의연산 중 가장 Resource를 많이 사용하는 연산 중 하나이므로 적절한 방법이 매우 중요!
>> 상황 / 경우에 따라 적절한 방법을 사용해야함
자세한 세부특징은 참조
1.Nested Loop Join (이중 for문 방식으로 Table을 Join함)
>> 선행테이블(드라이빙 테이블)의 처리범위를 하나씩 액세스하면서,
추출된 값으로 연결할 테이블(후행 테이블)을 조인하는 방식
>> 실행속도 = 선행 테이블 사이즈 * 후행 테이블 접근횟수
>> 사용법 : /*+ USE_NL(A B) */
ex) select /*+ use_nl(b,a) */ a.dname, b.ename, b.sal
from emp b, dept a
where a.loc = 'NEW YORK'
and b.deptno = a.deptno
>> Loop 개수를 줄이기 위해 조인에 참여하는 테이블 중 Row수가 적은 쪽을 Driving으로 설정하고,
inner 테이블의 연결고리를 결합인덱스를 이용해 최적화함
>> NL Join 기법은 성공하면 바로 결과를 사용자에게 보여주므로 온라인 프로그램에 적당한 조인 기법이다.
(Output Data가 적은 경우에 적합 - OLTP 상황)
2. INDEX NESTED LOOP JOIN(Single loop join)
>> NESTED LOOP JOIN 방식에서 후행(Driven) 테이블의 조인 속성에 인덱스가 존재할 경우 사용
>> 선행 테이블(Driving)의 각 레코드들에 대하여, 후행 테이블의 인덱스 접근 구조를 사용하여,
직접 검색 후 조인하는 방식
직접 검색 후 조인하는 방식
3. Sort Merge join
>> R과 S의 레코드들이 각각 조인 애트리뷰트 A, .B 값에 따라 물리적으로 정렬되어 있는 경우,
두 파일을 모두를 조인 애트리뷰트의 순서에 따라 동시에 스캔하면서 A, B 값이 동일한 레코드를 검색
>> 정렬되어 있지 않은 경우는 우선 외부 정렬을 사용하여 정렬 후 조인
>> 사용법 : /* USE_MERGE(A B) */
ex) select /*+ use_merge(a b) */a.dname, b.empno, b.ename
from dept a,emp b
where a.deptno = b.deptno
and b.sal > 1000 ;
>> 조인 연결고리의 비교 연산자가 범위 연산(‘>’,’< ‘)인 경우 Nested Loop 조인보다 유리
>> 두 결과집합의 크기가 차이가 많이 나는 경우에는 비효율적
>> Sorting이 필요한 경우에 유용(어짜피 정렬을 하므로)
4. Hash join
>> Hash Join은 해슁기법을 이용하여 조인을 수행
>> 조인 칼럼을 기준으로 해쉬함수를 수행하여 서로 동일한 해쉬 값을 갖는 것들 사이에서
실제 값이 같은지를 비교하면서 조인을 수행
실제 값이 같은지를 비교하면서 조인을 수행
>> NL Join 랜덤액세스 와 Sort Merge Join 의 문제점인 정렬 작업의 부담을 해결하기 위한 대안으로 등장
>> Hash Join은 조인 칼럼의 인덱스가 존재하지 않을 경우에도 사용할 수 있는 기법이다.
>> Hash Join은 해쉬 함수를 이용하여 조인을 수행하기 때문에 ='=로 수행하는 조인,
동등조건에만 사용 할 수 있다.
동등조건에만 사용 할 수 있다.
>> 해쉬 함수가 적용될 때 동일한 값을 항상 같은 값으로 해슁됨이 보장된다.
>> Hash Join 작업을 수행하기위해 해쉬 테이블을 메모리에 생성해야한다.
>> 메모리에 적재할 수 있는 영역에 크기보다 커지면 임시 영역(디스크)에 해쉬 테이블을 저장한다.
>> Hash Join을 할 때는 결과 행의 수가 적은 테이블을 선행 테이블로 사용하는 것이 좋다.
>> 선행 테이블을 Build Input 이라하며, 후행 테이블은 Prove Input이라한다.
>> ORDER BY를 할때는 Merge Join이 나을 수도 있다
-
HINT ( /*+ */ )
-Plan 변경이 가능
-튜닝의 지름길
-
FUNCTION
-Query의 생명 >> HardCoding을 하지않고, 간결하게 작성하기 위해서는 적절한 함수사용이 필요
-남발하면 성능을 저하시키므로, 상황에 따라 사용
-DB별로 사용가능 여부가 다르므로 확인
-사용자 지정 함수도 가능
-모든 함수를 암기할 수 없으므로 효율적인 구글링이 필요
-
Procedure와 Function
-공통점 : 값을 return
-차이점 : Procedure > 2개 이상 return 가능
Function > 1개 return만 가능
-
구글링 TIP
-문제를 파악 > 문제해결을 위한 가설을 세움 > 가설에 필요한 내용을 검색
ex) 재귀호출, 상위 부서 찾기
-
Procedure와 Function
-공통점 : 값을 return
-차이점 : Procedure > 2개 이상 return 가능
Function > 1개 return만 가능
-
GROUP BY
-GROUP BY 절에 들어가는 내용은 Data를 보고자하는 관점의 컬럼(성별, 지역, 나이)
-SELECT(보여줄 내용, 합계)의 갯수 < GROUP BY의 갯수
문법적으로 가능은 하나, 별로 바람직하지 못하다
WHY? 분류한 관점을 누락시켜 결과 데이터와 매칭이 되지 못함
-
View의 장점
1.보안 : 사용자에게 특정 Data를 제외하고 보여주고 싶을 때,
그 부분을 제외하고 View로 구성하여 사용자에게 제공
그 부분을 제외하고 View로 구성하여 사용자에게 제공
2.유지보수 : 변경사항이 발생했을 때 조인한 각각의 Table을 변경하는 것이 아니라
View만을 변경해서 보여줌
View만을 변경해서 보여줌
-
Query를 짜는 방식
JOIN 상황에서 그냥 일반조인, 서브쿼리, 스칼라 서브쿼리, 인라인뷰, 함수형 등
다양한 방식이 있을 수 있는데, 업무특성(앞단, 뒷단)/개발자의 Style대로 작성
다양한 방식이 있을 수 있는데, 업무특성(앞단, 뒷단)/개발자의 Style대로 작성
'DB' 카테고리의 다른 글
MySQL (0) | 2019.02.21 |
---|---|
PL(Procedural Language)/SQL (0) | 2019.01.17 |
DW (0) | 2019.01.08 |
ORACLE의 기본구조3 (0) | 2019.01.02 |
ORACLE의 기본구조2 (0) | 2019.01.02 |
Comments