Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
29 | 30 | 31 |
Tags
- count
- 그래프시각화
- 상관관계
- %in%
- 순위출력
- 팀스파르타
- 총과 카드만들기
- Intersect
- sqld
- Sum
- merge
- 정보획득량
- if문 작성법
- 그래프 생성 문법
- 회귀분석
- 데이터분석가
- 불순도제거
- Dense_Rank
- 막대그래프
- 데이터분석
- 히스토그램 그리기
- 회귀분석 알고리즘
- 여러 데이터 검색
- difftime
- sql
- max
- 빅데이터분석
- 빅데이터
- loop 문
- 단순회귀 분석
Archives
- Today
- Total
ch0nny_log
[빅데이터분석] SQL 튜닝 문제_TIL 30 본문
[TIL 30]240626
★ [점심시간 문제] 아래의 SQL을 튜닝하시오 1) 튜닝전 - 105개 2) 튜닝후 -7개 select job, empno, ename, sal, sum(sal) over(order by empno asc) sumsal from emp; |
★ 튜닝 실전 문제
실전문제1. Sort Merge Join에 대한 설명으로 가장 적절한 것은?
1. 양쪽 집합을 정렬하고 조인하며, 인덱스에 의해 이미 정렬된 집합은 정렬 없이 곧바로 조인에 참여하기도 한다.
2. 먼저 액세스한 테이블의 처리 범위에 따라 전체 일의 양이 결정된다.
3. 오라클에서는 조인 연결고리에 Equi Join 조건이 하나라도 있어야 한다.
4. 테이블별 검색조건은 전체 일의 양에 영향을 미치지 않는다.
풀이:
★1번) emp 테이블에 deptno 인덱스를 생성하면 deptno가 10,20,30 번 순으로 정렬되어 저장됨 정렬된 인덱스를 이용하여 조인을하기 때문에 추가 정렬은 필요없음 2번) sort merge 조인도 조인순서에 따라 성능의 차이가 실제로는 있는데 hash 조인이나 nested loop 조인에 비해서는 그 중요도가 상대적으로 낮음 -- 애매하게 정답이라 확실한 1번이 정답 3번) sort merge 조인은 equi join 문법도 가능하지만 non equi join 문법도 가능하다. select /*+ leading(s,e) use_merge(e) */ e.ename, d.loc, e.deptno from emp e, dept d where e.sal between s.losal and s.hisal; -- non equi join 함 4번) where 문을 특정할 수록 buffer 의 갯수가 작아진다. select /*+ leading(d,e) use_merge(e) */ e.ename, d.loc, e.deptno from emp e, dept d where e.deptno = d.deptno and d.loc='DALLAS'; -- dallas 값 1개
실전문제 2. Hash Join에 대한 설명으로 가장 적절한 것은?풀이:
- Hash Join은 둘 중 작은 집합(Build Input)을 읽어 Sort Area에서 테이블을 생성한다.
- Hash Join하는 양쪽 테이블 모두 전체 범위를 읽으므로 양쪽 모두 부분범위처리가 불가능하다.
- Build Input 해시(Hash) 키 값에 중복이 많을수록 Hash Join의 성능은 좋아진다.
- Build Input 집합을 Hash Area에서 탐색할 때는 래치(Latch) 획득 과정이 없어서 빠르다.
1번) sort area 아니라 hash area에 해쉬 테이블을 생성한다. select /*+ leading(d,e) use_hash(e) */ e.ename, d.loc from emp e , dept d where e.deptno =d.deptno; 2번) 해쉬조인은 보통 하나의 테이블을 메모리로 로드하고 다른 테이블을 스캔하여 조인하는 방식으로 수행함. 만약 사원테이블에서 다음과 같이 직업이 SALESMAN 만 검색하는 SQL문이라면 직업이 SALESMAN을 검색할 때 부분범위 처리를 하면서 해쉬조인을 할 수 있음 (양쪽모두를 전체 범위 처리하는 것은 아님) select /*+ leading(d,e) use_hash(e) */ e.ename, d.loc from emp e , dept d where e.deptno =d.deptno and job ='SALESMAN'; 3번) 중복된 데이터가 많다고 성능이 좋아지는건 하나도 없음 (중복이 많으면 해쉬 테이블의 버킷이 불균형해져서 해쉬 충돌이 증가하고 그로 인해 성능이 저하됨) ★ 4번) Build input 집합은 메모리로 올라가는 해쉬테이블을 말함 이 집합을 찾을 때 메모리의 락인 latch를 획득하지 않아도 되기 때문에 성능이 빠름 dept테이블이 메모리로 올라갔고 emp테이블의 관련된 데이터를 메모리의 데이터를 찾아서 조인하려고 할떄 latch 획득이 필요없음)
실전문제 3. Nested Loop Join에 대한 설명으로 가장 적절한 것은?
- 빠르게 결과를 조회할 수 있지만 조인 횟수가 많을수록 다른 조인 방법에 비해 성능 저하가 나타날 수 있다.
- 3개 테이블이 NL 조인 시 선행 2개 테이블 조인 결과에 대한 부분집합을 생성 후 3번째 테이블과 조인을 시도한다.
- PGA를 통해 조인하기 때문에 래치(Latch)에 대한 경합이 없다.
- Driving Table은 반드시 인덱스를 통해 검색해야 한다.
풀이:select /*+ leading(d,e) use_nl(e) */ e.ename, d.loc from emp e, dept d where e.deptno = d.deptno and job='SALESMAN' --- 4건 and d.loc='CHICAGO'; --- 1건 ★1번) 빠르게 결과를 조회할 수 있지만 조인 횟수가 많을수록 다른 조인 방법에 비해 성능 저하가 나타날 수 있다. nested loop 조인은 대량의 데이터를 가지고 조인할 때 조인 횟수가 많으면 sort merge 조인이나 해쉬조인보다 성능저하가 더 심합니다. 2번) 3개 테이블이 NL 조인 시 선행 2개 테이블 조인 결과에 대한 부분집합을 생성 후 3번째 테이블과 조인을 시도한다. -- 맞는 말입니다. 그런데 가장 적절한거는 1번이 가장 적절합니다. 3번) pga(program global area)를 통해 조인하기 때문에 latch에 대한 경합이 없다. 클라이언트 -------------------> 서버 user process -----> sql ------> server process -- pga (메모리영역) 정렬 등의 메모리를 가져감 -- nested loop 조인도 메모리 내에서 수행되며 래치에 대한 경합이 발생할 수 있음 4번) driving table 은 먼저 읽는 테이블인데 위의 sql에서 dept 테이블입니다. loc에 인덱스가 없으면 full scan 하면됨
실전 문제 4. 아래와 같은 SQL에서 나타날 수 있는 Join 기법으로 가장 적절한 것은?
풀이:
- HASH ANTI JOIN
- HASH SEMI JOIN
- NESTED LOOP ANTI JOIN
- NESTED LOOP SEMI JOIN
exsits문의 실행계획도 서브쿼리이므로 세미조인을 함 서브쿼리의 실행계획은 안티조인 아니면 세미조인임 연산자가 in 이나 exists 면 세미조인이고 연산자가 not in 이나 not exists 면 안티(anti) 조인을 합니다. 보기에 나온것 처럼 인덱스가 없다면 해쉬 세미조인이 가장 적잘하지만 보기에 인덱스가 있으므로 인덱스가 있다면 nested loop 세미조인이 가장 적절함. ★답: 4
실전 문제 5. Sort Merge Join에 대한 설명으로 가장 적절하지 않은 것은?
- 조인 칼럼에 적당한 인덱스가 없어서 NL 조인(Nested Loops)이 비효율적일 때 사용할 수 있다.
- Driving Table의 개념이 중요하지 않은 조인 방식이다.
- 조인 조건의 인덱스 유무에 영향을 받지 않는다.
- EQUI(=) 조인 조건에서만 동작한다.
답 4번 조인조건에만 동작하는 건 아님
실전 문제 6. Hash Join이 더 효과적일 수 있는 조건으로 가장 적절하지 않은 것은?
- 조인 칼럼에 적당한 인덱스가 없어 자연조인(Natural Join)이 비효율적일 때
- 자연조인(Natural Join) 시 드라이빙(Driving) 집합 쪽으로 조인 액세스 양이 많아 Random 액세스 부하가 심할 때
- 소트 머지 조인(Sort Merge Join)을 하기에는 두 테이블이 너무 커서 소트(Sort) 부하가 심할 때
- 유니크 인덱스를 활용하여 수행시간이 적게 걸리는 소량 테이블을 온라인 조회하는 경우
답) 4번 수행시간이 적게 걸리는 소량의 테이블 조인은 해쉬조인보다는 nested loop 조인이 더 효율적임
실전 문제 7. 조인(Join) 방식 중에서 Hash Join을 선택하는 기준으로 가장 적절한 것은?풀이
- 소량의 데이터를 주로 처리하며, 부분 범위 처리가 극대화되어야 한다.
- 쿼리의 조인 조건식이 범위 조건이다.
- 쿼리 수행 시간이 짧고 수행 빈도가 높다.
- 조인 칼럼에 적당한 인덱스가 없고, 조인 대상 테이블 중 한쪽 테이블의 크기가 작다.
2번)쿼리의 조인 조건식이 범위 조건이다. 쿼리의 범위 조인 조건은 해쉬조인이 불가능하다. 해쉬조인은 e.deptno =d.deptno 처럼 이퀄(=) 조인이어야 가능함 ★ 4번) 인덱스가 없다는것은 full table scan 을 할 수 밖에 없다는것이고 그러면 해쉬조인이 적당합니다. 그리고 한쪽 테이블이 작으면 더욱 해쉬 조인하기 좋습니다. 그 테이블을 메모리의 해쉬 테이블로 구성하면 되기 때문에 4번이 적절한 답입니다.
실전 문제 8. TAB1, TAB2 순으로 NL 조인하도록 유도하려고 할 때, 빈칸 ①에 들어갈 힌트로 가장 적절한 것은? (단, DBMS는 오라클로 가정)
1. ORDERED(A B) USE_NL(B)
2. ORDERED USE_NL(TAB2)
3. LEADING(A) USE_NL(B)
4. DRIVING_SITE(A) USE_NL(B)
실전 문제 9. SELECT 문장의 실행 순서를 올바르게 나열한 것은?
- SELECT - FROM - WHERE - GROUP BY - HAVING - ORDER BY
- FROM - SELECT - WHERE - GROUP BY - HAVING - ORDER BY
- FROM - WHERE - GROUP BY - HAVING - ORDER BY - SELECT
- FROM - WHERE - GROUP BY - HAVING - SELECT - ORDER BY
실전 문제 10. 5개의 테이블로부터 필요한 칼럼을 조회하려고 할 때, 최소 몇 개의 JOIN 조건이 필요한가?
- 2개
- 3개
- 4개
- 5개
'빅데이터 분석(with 아이티윌) > SQL' 카테고리의 다른 글
[빅데이터분석] SQL 튜닝_TIL 29 (0) | 2024.06.25 |
---|---|
[빅데이터분석] SQL 튜닝_TIL 28 (0) | 2024.06.24 |
[빅데이터분석] SQL 튜닝_TIL 27 (0) | 2024.06.20 |
[빅데이터분석] SQL 튜닝_TIL 26 (0) | 2024.06.19 |
[빅데이터분석] SQL 튜닝_TIL 25 (1) | 2024.06.18 |