반응형

1. 실행계획

실행계획이란?

사용자가 SQL을 실행하여 데이터를 추출하려고 할 때 옵티마이저가 수립하는 작업절차를 뜻한다.

이런 실행계획을 수립하는 옵티마이저의 실행 단계는 3단계로 분리할 수 있다.

1) SQL 해석

2) 실행계획 수립

3) 실행

1. 오라클 DBMS를 통해 실행계획 확인하는 방법

오라클 DBMS에서 제공하는 두가지 명령어  

1) explain plan

2) set autotrace

Explain plan 방법

1
2
3
4
5
6
7
8
-- EXPLAIN PLAN
예제) EXPLAIN PLAN
      SET STATEMENT_ID = 'TEST1' INTO PLAN_TABLE
      FOR
      SELECT /*+USE_NL(e d)*/
              e.name, e.deptno, d.dname
      FROM emp e, dept d
      WHERE e.deptno = d.deptno;
cs

SQL에 대한 생행계획만을 확인할 뿐 데이터를 처리를 하지 않음

때문에 데이터베이스에 어떠한 부하도 주지 않는다.

튜닝하고자 하는 SQL이 다수일 경우 매번 명령을 수행시켜야하는 불편함이 존재한다.

데이터를 처리하지 않기 때문에 I/O관련 시간도 측정할 수 없다.(SORTING 포함)

PLAN_TABLE에 저장된 결과를 확인하기 위해 다음과 같은 SELECT명령어를 실행시켜야한다.

1
2
3
SELECT *
FROM TABLE(DBMS_XPLAN.DISPLAY
            ('PLAN_TABLE''TEST1''ALL'));
cs

Set autotrace 방법

EXPLAIN 명력과 달리 한번의 명령으로 여러개의 SQL에 대한 실행계획을 볼 수 있다.

또한, 다양하게 옵션을 사용할 수 있어서 여러가지의 정보를 선택적으로 확인할 수 있다.

1
2
3
4
5
SET AUTOTRACE ON
SELECT /*+USE_NL(e d)*/
          e.name, e.deptno, d.dname
FROM emp e, dept d
WHERE e.deptno = d.deptno;
cs

여기서 set autotrace on 이부분에 옵션을 추가하는데 몇가지 예를 알아보도록 하자

-- SET AUTOTRACE 의 몇가지 옵션 예

SET AUTOTRACE ON EXPLAIN;

출력결과와 실행계획까지만 나타냄 통계정보는 생략

SET AUTOTRACE ON STATISTICS;

출력결과와 실행계획을 생략하고 I/O관련 정보를 선택적으로 보여줌

SET AUTOTRACE ON TRACEONLY;

데이터가 상당히 클때 사용하는데 출력결과를 나타내지 않음

SET AUTOTRACE ON TRACEONLY EXPLAIN;

데이터를 처리하지 않고 실행계획만을 보여줌(많이 사용함)

SET AUTOTRACE ON TRACEONLY STATISTICS;

데이터를 처리하지 않고 I/O관련 정보를 보여줌

SET AUTOTRACE ON OFF;

사용하지 않을때 사용

지금까지 옵티마이저의 실행계획을 확인하는 방법을 알아보았다. 이런 실행계획은 분석하여 SQL의 성능을 향상시키는데 목적을 둔다. 때문에 실행계획을 확인하는 것보다 분석하여 어떻게 개선할 것이지를 정하는 것이 더욱 중요하다.

2. 실행계획 분석

1
2
3
4
5
SET AUTOTRACE ON TRACEONLY EXPLAIN;
SELECT /*+USE_NL(e d)*/
          e.name, e.deptno, d.dname
FROM emp e, dept d
WHERE e.deptno = d.deptno;
cs

이 쿼리의 실행계획을 보면 다음과 같다.

들여쓰기를 기준으로 구분할 수 있는데 1번 작업과 연관되는 작업이 2번과 5번임을 알 수 있다. 같은 들여쓰기라면 위에 있는 명령이 선실행되므로 2번이 실행되고 5번이 실행된다.

즉, 같은 들여쓰기 DEPTH를 가지고 있다면 위에 있는 작업이 먼저 실행되는 작업이고 아래에 있는 것이 나중에 실행되는 것이다.

또 2번과 연관된 작업이 3번과 4번이기 때문에 이 실행계뢱을 보아 트리구조로 나타내면 다음과 같다.

이때 가장먼저 실행되는 작업은 가장 왼쪽에서 아래에 있는 노드이다.

3 -> 4 -> 2 -> 5 -> 1 -> 0 순으로 실행된다.

실행계획을 어떻게 확인하고 분석하는지 알아보았다. 다음장에서는 옵티마이저에 대해 알아보도록 한다.

반응형

'Database' 카테고리의 다른 글

[프로그래머스 59045] 보호소에서 중성화한 동물  (0) 2020.04.29
[SQL 튜닝] 2. 옵티마이저(Optimizer)  (0) 2019.04.22
오라클 다중 WHERE조건  (0) 2018.06.25
무결성 (Integrity)  (0) 2018.01.12
JOIN (조인)  (0) 2018.01.12
반응형

문제출처

https://www.acmicpc.net/problem/1655


문제풀이

1
2
3
4
5
6
7
8
9
10
11
/**
 * priority_queue<자료형, 구현체(container), 비교 연산자(compare 함수)>로 정의
 * priority_queue<int, vector<int>, greater<int> > pq;
 * 자료형은 int형이고 값의 저장방식은 vector<int>이며 최소값을 먼저 내놓는다.
 * greater가 최소값을 내뱉고 less가 최대값을 내뱉음
 *
 * 중간값 구하기 알고리즘
 * 최대 힙의 크기 = 최소힙의 크기  or  최소힙의 크기 + 1
 * 최대 힙의 root(최대값) <= 최소힙의 root(최소값)
 * 위 2가지 규칙이 맞지 않는다면 최대힙, 최소힙의 top을 swap한다.
 */
cs


소스코드


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
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    priority_queue<intvector<int>, less<int> > max_heap;
    priority_queue<intvector<int>, greater<int> > min_heap;
 
    int n, num;
    cin>>n;
    while(n--) {
        cin>>num;
        if(max_heap.empty() && min_heap.empty()) max_heap.push(num);
        else if(max_heap.size() == min_heap.size()) max_heap.push(num);
        else min_heap.push(num);
 
        if(!max_heap.empty() && !min_heap.empty() && max_heap.top() > min_heap.top()) {
            int tmp=max_heap.top();
            max_heap.pop();
            max_heap.push(min_heap.top());
            min_heap.pop();
            min_heap.push(tmp);
        }
        cout<<max_heap.top()<<"\n";
    }
    return 0;
}
cs


반응형

'Algorithm' 카테고리의 다른 글

[프로그래머스 12936] 줄 서는 방법  (0) 2019.04.23
[프로그래머스 42840] 모의고사(완전탐색)  (0) 2019.04.23
[BOJ 1157] 단어공부  (0) 2019.04.15
[BOJ 2675] 문자열 반복  (0) 2019.04.15
[BOJ 13458] 시험감독  (0) 2019.04.15
반응형

문제출처

https://www.acmicpc.net/problem/1157


문제풀이

문자열을 입력받고 알파벳개수(26)개의 int형 배열을 선언한 뒤 반복문을 통해 갯수를 세어주면 되는

간단한 문제입니다. ASCII 값을 알고 있는지 확인하는 문제


소스코드

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
#include <cstdio>
#include <cstring>
int main() {
    char s[1000001];
    int cnt[26];
    scanf("%s"&s);
    memset(cnt, 0sizeof(cnt));
    int len = strlen(s);
    for(int i=0; i<len; i++) {
        if(s[i] >= 'a' && s[i] <= 'z') s[i]-='a'-'A';
        cnt[s[i]-'A']++;
    }
 
    int max=0, idx=-1;
    for(int i=0; i<len; i++) {
        if(max<cnt[s[i]-'A']) {
            max=cnt[s[i]-'A'];
            idx=i;
        }
    }
 
    int duplicateCnt=0;
    for(int i=0; i<26; i++) {
        if(max==cnt[i]) duplicateCnt++;
    }
    if(duplicateCnt==1printf("%c\n", s[idx]);
    else printf("?\n");
    return 0;
}
cs


반응형

'Algorithm' 카테고리의 다른 글

[프로그래머스 42840] 모의고사(완전탐색)  (0) 2019.04.23
[BOJ 1655] 가운데를 말해요  (0) 2019.04.16
[BOJ 2675] 문자열 반복  (0) 2019.04.15
[BOJ 13458] 시험감독  (0) 2019.04.15
[BOJ 1057] 토너먼트  (0) 2019.04.15

+ Recent posts