20장. SQL명령문의 최적화 1. OR연산자의 사용을 피하라. 2. 불필요한 UNION연산자의 사용을 피하라.

Slides:



Advertisements
Similar presentations
1 08 배열. 한국대학교 객체지향연구소 2 C 로 배우는 프로그래밍 기초 2 nd Edition 배열  동일한 자료유형의 여러 변수를 일괄 선언  연속적인 항목들이 동일한 크기로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는.
Advertisements

컴퓨터와 인터넷.
DB 프로그래밍 학기.
DB 프로그래밍 학기.
You YOungseok 데이터베이스 테이블 및 인덱스 You YOungseok.
Database Laboratory, Hong Ik University
Excel 일차 강사 : 박영민.
Windows Server 장. Windows Server 2008 개요.
제 09 장 데이터베이스와 MySQL 학기 인터넷비즈니스과 강 환수 교수.
MySQL 및 Workbench 설치 데이터 베이스.
18장. 뷰(View) 뷰의 생성 뷰의 열 이름 뷰의 변경 : WITH CHECK OPTION 뷰 테이블의 정보와 네비게이터
Windows Server 장. 사고를 대비한 데이터 백업.
테이블 : 데이터베이스를 구성하는 요소로 같은 성격에 정보의 집합체. 레코드 : 하나의 정보를 가지고 있는 컬럼의 집합체
5장 Mysql 데이터베이스 한빛미디어(주).
4장. 웹로직 서버상에서의 JDBC와 JTA의 운용
6장 그룹 함수.
07 그룹 함수 그룹 함수의 개념 그룹 함수의 종류 데이터 그룹 생성 HAVING 절.
09 서브쿼리(Subquery) 서브쿼리의 개념 서브쿼리의 종류 데이터베이스 실무에서 서브쿼리 사용시 주의 사항.
3.2 SQL Server 설치 및 수행(계속) 시스템 데이터베이스 master
Heesang kim PL/SQL 3 Heesang kim.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
13 인덱스 인덱스의 개념 인덱스의 구조 인덱스의 효율적인 사용 방법 인덱스의 종류 및 생성 방법 인덱스 실행 경로 확인
16장. 테이블의 변경 새로운 행 삽입 테이블에서 테이블로 행을 복사 행 값의 변경 테이블에서 행 삭제
19장. 트랜잭션과 락(LOCK) 트랜잭션이란? MySQL의 트랜잭션 락(LOCK) 쉽게 배우는 MySQL 5.x
21장. 데이터베이스 설계지침 테이블과 열에 대한 지침 중복 데이터의 포함 열에 대한 자료형의 선택
                              데이터베이스 프로그래밍 (소프트웨어 개발 트랙)                               퍼스널 오라클 9i 인스톨.
18강. 데이터 베이스 - II JDBC 살펴보기 Statement객체 살펴보기 Lecturer Kim Myoung-Ho
메시지 큐[5] – test1.c 메시지 제어: msgctl(2) #include <sys/msg.h>
17강. 데이터 베이스 - I 데이터 베이스의 개요 Oracle 설치 기본적인 SQL문 익히기
뇌를 자극하는 Windows Server 장. Windows Server 2008 개요.
5장 Mysql 데이터베이스 한빛미디어(주).
11장. 1차원 배열.
13 인덱스 인덱스의 개념 인덱스의 구조 인덱스의 효율적인 사용 방법 인덱스의 종류 및 생성 방법 인덱스 실행 경로 확인
4장. 데이터베이스와 테이블 MySQL 데이터베이스 테이블의 생성 테이블 데이터 처리(삽입, 변경, 삭제) 작업
JA A V W. 03.
박성진 컴퓨터 프로그래밍 기초 [09] 배열 part 1 박성진
12장. SELECT 명령문: ORDER BY절 단일 열 정렬 순서번호로 정렬 오름차순과 내림차순 정렬 하나 이상의 행 정렬
2장. 데이터베이스 관리 시스템 데이터베이스 관리 시스템의 등장 배경 데이터베이스 관리 시스템의 정의
Quiz #7 다음 수들을 합병 정렬과 퀵 정렬 알고리즘을 이용하여 오름 차순으로 정렬하였을 때, 데이터 이동 회수를 각각 구하라. 여러분은 정렬 과정을 단계별로 보이면서 이동 회수를 추적해야 한다. 단, 퀵 정렬시에 피봇으로 배열의 왼쪽 첫 번째 원소를 선택한다. 5.
뇌를 자극하는 Windows Server 2012 R2
Term Projects 다음에 주어진 2개중에서 한 개를 선택하여 문제를 해결하시오. 기한: 중간 보고서: 5/30 (5)
3D 프린팅 프로그래밍 01 – 기본 명령어 강사: 김영준 목원대학교 겸임교수.
9장. SELECT명령문 : WHERE 절 개요, 2. 관계연산자를 사용하는 조건
11장. GROUP BY와 HAVING 열의 그룹화 2개 이상의 열에 대한 그룹화
10장. SELECT명령문 : 통계함수 모든 열 선택(*) 2. SELECT 절의 수식
ADO.NET (SqlConnection, SqlCommand)
3D 프린팅 프로그래밍 05 – 반복패턴 만들기 강사: 김영준 목원대학교 겸임교수.
14장. 부속 질의어 부속 질의어 규칙 열의 범위 상호 관련부속 질의어 복합키의 사용 쉽게 배우는 MySQL 5.x
5강. 배열 배열이란? 배열의 문법 변수와 같이 이해하는 배열의 메모리 구조의 이해 레퍼런스의 이해 다차원 배열
보고서 #7 (기한: 6/2) 2개의 스택, stk1, stk2를 이용하여 큐를 구현하라.
CHAP 21. 전화, SMS, 주소록.
2014년 가을학기 손시운 지도 교수: 문양세 교수님 데이터 프레임 2014년 가을학기 손시운 지도 교수: 문양세 교수님.
문성우 SQL 실습 Part Ⅰ 문성우.
Database Relational DML SQL.
데이터 동적 할당 Collection class.
4장. 데이터 표현 방식의 이해. 4장. 데이터 표현 방식의 이해 4-1 컴퓨터의 데이터 표현 진법에 대한 이해 n 진수 표현 방식 : n개의 문자를 이용해서 데이터를 표현 그림 4-1.
14 뷰(View) 뷰의 개념 뷰 관리.
Chapter 10 데이터 검색1.
11장 배열 1. 배열이란? 1.1 배열의 개요 1.2 배열의 선언과 사용.
구조체(struct)와 공용체(union)
8장 선택 논리 II 1. 논리연산자 1.1 논리연산자 : AND (&&) 1.2 논리연산자 : OR (||)
수치해석 ch3 환경공학과 김지숙.
14 뷰(View) 뷰의 개념 뷰 관리.
 6장. SQL 쿼리.
임시테이블과 테이블변수 SQLWorld Study Group - 최명환 -.
8장. SELECT명령문 : FROM 절 FROM 절에서 테이블 명세 열 명세 다중 테이블 명세 가명 FROM절의 다양한 예제
Report #2 (기한: 3/16) 데이터 구조 과목의 수강생이 50명이라고 가정한다. 이 학생(학번은 2016????으로 표현됨)들의 중간 시험(0~100), 기말 시험(0~100) 성적을 성적 파일에 작성하라(프로그램을 통해서 또는 수작업으로). 성적 파일을 읽어들여서.
fastestslowest 실제 질의문에서 사용 타입 추천 인덱스 SELECT list Default
6 객체.
Presentation transcript:

20장. SQL명령문의 최적화 1. OR연산자의 사용을 피하라. 2. 불필요한 UNION연산자의 사용을 피하라. 3. NOT연산자를 피하라. 4. 조건에 열을 분리하라. 5. BETWEEN연산자를 사용하라. 6. LIKE 연산자의 특별한 형식을 피하라. 7. 조인에 여분의 조건을 추가하라. 8. HAVING절을 피하라. 9. 가능한 작은 SELECT절을 만들어야 한다. 10. DISTINCT사용을 피하라. 11. 자료형의 변화를 피하라. 12. 가장 큰 테이블을 마지막에 위치하라. 13. ANY와 ALL 연산자의 사용을 피하라. 14. 미래의 최적화기 15. 디스크 최적화 16. 운영체제의 최적화 2019-05-06 쉽게 배우는 MySQL 5.x

20.1 OR 연산자의 사용을 피하라. -WHERE 절의 조건에 OR 연산자가 있다면 SQL은 인덱스를 사용하지 않는다. -IN 연산자를 가지고 있는 조건으로 대치 -UNION으로 연결된 2개의 SELECT 명령문을 사용 [예제20-1]20001001, 20041033, 20071022번의 학번과 이름, 주민등록번호를 출력하라. mysql> select stu_name, id_num, stu_no     -> from student     -> where stu_no = '20001001'     -> or stu_no = '20041033'     -> or stu_no = '20071022'; +----------+----------------+----------+ | stu_name | id_num         | stu_no   | | 김유신   | 811007-1632013 | 20001001 | | 연개소문 | 810615-1633111 | 20041033 | | 이순신   | 890222-1218818 | 20071022 | 3 rows in set (0.02 sec) STU_NO 열이 인덱스로 정의되어 있어도 인덱스를 사용하지 않음 SELECT 명령문의 조건을 IN 연산자로 사용하면 SQL은 인덱스를 사용 UPDATE나 DELETE 명령문에 대해서도 동일하게 적용된다. mysql> select stu_name, id_num, stu_no     -> from student     -> where stu_no in (20001001, 20041033, 20071022); in연산자 사용하면 인덱스 사용하여 질의 2019-05-06 쉽게 배우는 MySQL 5.x

[예제 20-2] 1988년에 출생하거나 2반인 학생의 학번과 이름, 반, 출생년도를 학번 오름차순으로 출력하라. mysql> select stu_no, stu_name, class, birth_year     -> from student     -> where birth_year = '1988'     -> or class = 2     -> order by stu_no; +----------+----------+-------+------------+ | stu_no   | stu_name | class | birth_year | | 20041007 | 정인정   |     2 | 1983       | | 20071010 | 홍길동   |     3 | 1988       | | 20071300 | 유하나   |     1 | 1988       | | 20071307 | 김문영   |     3 | 1988       | | 20071405 | 최차영   |     2 | 1988       | 5 rows in set (0.00 sec) -CLASS과 BIRTH_YEAR 열에 대한 인덱스의 존재에 관계없이 순차적 처리 기법으로 전개 -OR 연산자를, UNION으로 결합된 2개의 SELECT 명령문으로 대체할 수 있다. -OR 연산자를 가지고 있는 UPDATE와 DELETE 명령문은 UNION 연산자로 대체할 수 없다. mysql> select stu_no, stu_name, class, birth_year     -> from student     -> where birth_year = '1988'     -> union     -> select stu_no, stu_name, class, birth_year     -> where class = 2     -> order by stu_no; 2019-05-06 쉽게 배우는 MySQL 5.x

위의 예제의 결과를 확인하기 위해서 다음과 같은 SELECT명령문을 사용 [예제 20-3] 장학금이 200,000원 이하이거나 2007년08월10일에 등록한 학생의 장학금을 100,000원으로 갱신하라.(OR연산자 사용) mysql> update fee     -> set jang_total = 100000     -> where jang_total <= 200000     -> or fee_date = '2007-08-10'; Query OK, 7 rows affected (0.02 sec) Rows matched: 7  Changed: 7  Warnings: 0 위의 예제의 결과를 확인하기 위해서 다음과 같은 SELECT명령문을 사용 mysql> select stu_no, fee_year, fee_term, jang_total, fee_date     -> from fee; +----------+----------+----------+------------+------------+ | stu_no   | fee_year | fee_term | jang_total | fee_date   | | 20001015 | 2000     |        1 |    1000000 | 2000-02-01 | | 20001015 | 2000     |        2 |    2500000 | 2000-08-10 | | 20001015 | 2001     |        1 |    2500000 | 2001-02-15 | | 20001015 | 2001     |        2 |    2500000 | 2001-08-16 | | 20001015 | 2006     |        1 |    2500000 | 2006-02-14 | | 20001015 | 2006     |        2 |    2500000 | 2006-08-18 | | 20001015 | 2007     |        1 |    2000000 | 2007-02-10 | | 20001015 | 2007     |        2 |    2500000 | 2007-08-19 | | 20061011 | 2006     |        1 |     500000 | 2006-02-18 | | 20061011 | 2006     |        2 |    2500000 | 2006-08-20 | | 20061011 | 2007     |        1 |    2000000 | 2007-02-18 | | 20061011 | 2007     |        2 |     100000 | 2007-08-10 | | 20071001 | 2007     |        1 |     500000 | 2007-02-18 | | 20071001 | 2007     |        2 |     100000 | 2007-08-10 | | 20071010 | 2007     |        1 |     500000 | 2007-02-18 | | 20071010 | 2007     |        2 |     100000 | 2007-08-10 | | 20071022 | 2007     |        1 |     500000 | 2007-02-18 | | 20071022 | 2007     |        2 |     100000 | 2007-08-10 | | 20071300 | 2007     |        1 |     500000 | 2007-02-18 | | 20071300 | 2007     |        2 |     100000 | 2007-08-10 | | 20071307 | 2007     |        1 |     500000 | 2007-02-18 | | 20071307 | 2007     |        2 |     100000 | 2007-08-10 | | 20071405 | 2007     |        1 |     500000 | 2007-02-18 | | 20071405 | 2007     |        2 |     100000 | 2007-08-10 | +----------+----------+----------+------------+------------+ 24 rows in set (0.00 sec) 2019-05-06 쉽게 배우는 MySQL 5.x

UPDATE 명령문을 사용할 때 UNION연산자를 사용한 경우 오류가 발생된다. mysql> update fee     -> set enter_fee = 200000     -> where jang_total >= 200000     -> union     -> update fee     -> where fee_date = '2007-08-10'; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'union update fee set enter_fee = 200000 where fee_date = '2007-08-10'' at line 4 UPDATE 명령문을 사용할 때 UNION연산자를 사용한 경우 오류가 발생된다. UPDATE FEE              SET ENTER_FEE = 200,000 WHERE jang_TOTAL >= 200,000; UPDATE FEE                SET  ENTER_FEE = 200,000 WHERE REG_DATE = '2007-08-10'; 2019-05-06 쉽게 배우는 MySQL 5.x

20.2 불필요한 UNION 연산자의 사용을 피하라. UNION 연산자는 주의해서 사용되어야 한다. [예제20-5] 각 학생에 대하여 학번, 등록금과 장학금의 차를 출력하라. mysql> select stu_no, fee_price - jang_total     -> from fee     -> where fee_total >= jang_total     -> union     -> select stu_no, fee_price - jang_total     -> where fee_total < jang_total; +----------+------------------------+ | stu_no   | fee_price - jang_total | | 20001015 |                1505000 | | 20001015 |                   5000 | | 20001015 |                 305000 | | 20001015 |                 505000 | | 20001015 |                1005000 | | 20061011 |                2505000 | | 20061011 |                 505000 | | 20061011 |                1005000 | | 20061011 |                2905000 | | 20071001 |                2505000 | | 20071001 |                2905000 | | 20071010 |                2500000 | | 20071010 |                2900000 | | 20071022 |                2500000 | | 20071022 |                2900000 | | 20071300 |                2505000 | | 20071300 |                2905000 | | 20071307 |                2505000 | | 20071307 |                2905000 | | 20071405 |                2500000 | | 20071405 |                2900000 | 21 rows in set (0.01 sec) -문제점은 이 명령문을 처리하는 동안 SQL은 전체 FEE 테이블을 두 번 검색해야 한다. -이러한 연산자에 ALL 옵션을 추가함으로써 결과에서 중복된 행을 삭제하지 않도록 하는 효과를 얻을 수 있다. 2019-05-06 쉽게 배우는 MySQL 5.x

ALL 옵션을 추가함으로써 중복된 행을 삭제하지 않도록 하는 효과를 얻을 수 있다. [예제20-6]등록년도가 ‘2000’, ‘2001’에 등록한 학생의 학번과 등록년도를 모두 출력하라. (union all 사용) mysql> select stu_no, fee_year     -> from fee     -> where fee_year = '2000'     -> union all     -> select stu_no, fee_year     -> where fee_year = '2001'; +----------+----------+ | stu_no   | fee_year | | 20001015 | 2000     | | 20001015 | 2001     | 4 rows in set (0.00 sec) ALL 옵션을 추가함으로써 중복된 행을 삭제하지 않도록 하는 효과를 얻을 수 있다. 2019-05-06 쉽게 배우는 MySQL 5.x

20.3 NOT 연산자를 피하라. -WHERE 절에 있는 조건에 NOT 연산자가 있으면 인덱스를 사용하지 않음 [예제 20-7] 1984년 이후에 태어난 학생의 학번과 이름, 출생년도를 출력하라. mysql> select stu_no, stu_name, birth_year     -> from student     -> where not  birth_year < 1984; +----------+----------+------------+ | stu_no   | stu_name | birth_year | | 20061014 | 고혜진   | 1987       | | 20061048 | 김영호   | 1986       | | 20071001 | 장수인   | 1989       | | 20071010 | 홍길동   | 1988       | | 20071022 | 이순신   | 1989       | | 20071300 | 유하나   | 1988       | | 20071307 | 김문영   | 1988       | | 20071405 | 최차영   | 1988       | 8 rows in set (0.08 sec) WHERE 절의 not  birth_year < 1984을 대체 WHERE BIRTH_YEAR >= 1984 2019-05-06 쉽게 배우는 MySQL 5.x

[예제 20-8] 남자가 아닌 학생의 학번과 이름, 주민등록번호를 출력하라. mysql> select stu_no, stu_name, id_num      -> from student      -> where not (substring(id_num, 8, 1) = '1'); +----------+----------+----------------+ | stu_no   | stu_name | id_num         | | 20041002 | 김유미   | 830207-2629715 | | 20041007 | 정인정   | 830315-2351225 | | 20061014 | 고혜진   | 870307-2638759 | | 20071300 | 유하나   | 880921-2573717 | | 20071307 | 김문영   | 880418-2121623 | | 20071405 | 최차영   | 881003-2581516 | 6 rows in set (0.00 sec) 성별은 오직 1('남')과 2('여')만의 값을 가질 수 있다는 것을 알고 있다. 따라서 명령문은 다음과 같이 작성된다.     -> from student     -> where substring(id_num, 8, 1) = '2'; 2019-05-06 쉽게 배우는 MySQL 5.x

20.4 조건에 열을 분리하라. [예제 20-9] 1990년 보다 3년 전에 태어난 학생의 학번, 이름, 출생년도를 출력하라. 20.4 조건에 열을 분리하라. [예제 20-9] 1990년 보다 3년 전에 태어난 학생의 학번, 이름, 출생년도를 출력하라. mysql> select stu_no, stu_name, birth_year     -> from student     -> where birth_year + 3 = 1990; +----------+----------+------------+ | stu_no   | stu_name | birth_year | | 20061014 | 고혜진   | 1987       | 1 row in set (0.03 sec) 수치계산이나 스칼라 함수에서 사용된 열에 인덱스가 정의되었을 때 그 인덱스는 사용되지 않는다. BIRTH_YEAR 열에 대한 인덱스사용은 다음과 같은 형식에서만 기대할 수 있다. mysql> SELECT STU_NO, STU_NAME, BIRTH_YEAR     -> FROM STUDENT     ->  WHERE BIRTH_YEAR = 1987; 관계 연산자 왼쪽에 있는 수식은 오직 하나의 열의 이름만 가지고 있다. 다시 말하면 열이 분리되어 있다. (인덱스 사용 가능) 2019-05-06 쉽게 배우는 MySQL 5.x

20.5 BETWEEN 연산자를 사용하라. -WHERE 절의 조건에서 AND 연산자를 사용하면 인덱스를 사용하지 않음 -AND조건을 BETWEEN 연산자를 가지는 조건으로 대체하여 인덱스 사용 [예제 20-10] 1983년부터 1987년까지 태어난 학생의 학번, 이름, 출생년도를 출력하라. mysql> select stu_no, stu_name, birth_year     -> from student     -> where birth_year >= 1983     -> and birth_year <= 1987; +----------+----------+------------+ | stu_no   | stu_name | birth_year | | 20041002 | 김유미   | 1983       | | 20041007 | 정인정   | 1983       | | 20061011 | 박정인   | 1983       | | 20061014 | 고혜진   | 1987       | | 20061048 | 김영호   | 1986       | 5 rows in set (0.00 sec) BIRTH_YEAR 열에 대한 인덱스는 사용되지 않음 mysql> SELECT  STU_NO, NAME, BIRTH_YEAR     ->  FROM  STUDENT     ->  WHERE BIRTH_YEAR BETWEEN 1983 AND 1987; BETWEEN 연산자를 사용하여 인덱스 사용 2019-05-06 쉽게 배우는 MySQL 5.x

20.6 LIKE 연산자의 특별한 형식을 피하라. -WHERE 절의 조건에서 LIKE 연산자를 사용하면 인덱스를 사용하지 않음 [예제 20-11] 영문이름의 끝이 문자 'g'인 학생의 학번, 영문이름을 출력하라. mysql> select stu_no, stu_ename     -> from student     -> where stu_ename like '%g'; +----------+-----------------+ | stu_no   | stu_ename       | | 20041007 | Jeung Yin-Jeung | | 20071010 | Hong Gil-Dong   | | 20071307 | Kim Moon-Young  | | 20071405 | Choi Cha-Young  | 4 rows in set (0.00 sec) 인덱스는 사용되지 않을 것이며, 이 예제를 대체할 만한 해결책이 없다. 2019-05-06 쉽게 배우는 MySQL 5.x

20.7 조인에 여분의 조건을 추가하라. -WHERE 절에 최종 결과를 변경시키지 않는 여분의 조건을 추가함으로써 조인을 빠르게 할 수 있다. [예제 20-12] 학번 20071405번에 부과된 모든 등록금에 대한 학번, 이름, 등록년도, 등록학기, 등록일자를 출력하라. mysql> select f.stu_no, stu_name, fee_year, fee_term, fee_date     -> from fee f, student s     -> where f.stu_no = s.stu_no     -> and f.stu_no = '20071405'; +----------+----------+----------+----------+------------+ | stu_no   | stu_name | fee_year | fee_term | fee_date   | | 20071405 | 최차영   | 2007     |        1 | 2007-02-18 | | 20071405 | 최차영   | 2007     |        2 | 2007-08-10 | 2 rows in set (0.06 sec) mysql> SELECT S.STU_NO, STU_NAME, FEE_YEAR, FEE_TERM, FEE_DATE     ->  FROM   FEE F, STUDENT S     ->  WHERE  F.STU_NO = S.STU_NO     ->  AND F.STU_NO = '20071405'     ->  AND S.STU_NO = '20071405'; 여분의 조건을 가지도록 확장하여도 동일한 결과 출력 2019-05-06 쉽게 배우는 MySQL 5.x

20.8 HAVING 절을 피하라. -SELECT 명령문에서는 WHERE 절과 HAVING 절이 있다. [예제 20-13] 학번이 20071307 번 보다 큰 각 학생에 대하여 학번과 등록금을 납입한 횟수를 출력하라 mysql> select stu_no, count(*)     -> from fee     -> group by stu_no     -> having stu_no > '20071307'; +----------+----------+ | stu_no   | count(*) | | 20071405 |        2 | 1 row in set (0.00 sec) HAVING 절에서 나타낸 조건은 WHERE 절에서도 지정할 수 있다. mysql> SELECT STU_NO, COUNT(*)       ->  FROM FEE     ->  WHERE STU_NO > '20071307'     ->  GROUP BY STU_NO; 2019-05-06 쉽게 배우는 MySQL 5.x

20.9 가능한 작은 SELECT 절을 만들어야 한다. -부속질의어 사용시 주 질의어의 SELECT 절은 출력될 데이터를 구성 -불필요한 열을 사용하면 처리 속도를 저하시키는 원인이 된다. -부속 질의어가 EXISTS 연산자를 사용하면 SELECT 절의 결과는 지정된 수식에 영향을 받지 않는다. [예제 20-14] 적어도 한 번 등록을 한 학생의 학번과 이름을 출력하라. mysql> select stu_no, stu_name     -> from student s     -> where exists     -> (select '1'     -> from fee f     -> where f.stu_no = s.stu_no); +----------+----------+ | stu_no   | stu_name | | 20001015 | 박도준   | | 20061011 | 박정인   | | 20071001 | 장수인   | | 20071010 | 홍길동   | | 20071022 | 이순신   | | 20071300 | 유하나   | | 20071307 | 김문영   | | 20071405 | 최차영   | EXISTS 연산자를 사용할 때는  부속질의어의 SELECT 명령문에서 ‘1’ 은 아무런 의미가 없이 존재유무만을 나타내므로 되도록 간단하게 표현한 것이다. 2019-05-06 쉽게 배우는 MySQL 5.x

20.10 DISTINCT 사용을 피하라. -DISTINCT를 지정하는 것은 중복된 행을 제거하나, 처리 시간에는 비효율적 [예제 20-15] 2006년에 등록금을 납부한 학생의 학번, 이름, 등록년도, 등록학기, 등록일자를 출력하라. mysql> select distinct f.stu_no, stu_name, fee_year,     -> fee_term, fee_date     -> from fee f, student s     -> where f.stu_no = s.stu_no     -> and fee_year = 2006 ; +----------+----------+----------+----------+------------+ | stu_no   | stu_name | fee_year | fee_term | fee_date   | | 20001015 | 박도준   | 2006     |        1 | 2006-02-14 | | 20001015 | 박도준   | 2006     |        2 | 2006-08-18 | | 20061011 | 박정인   | 2006     |        1 | 2006-02-18 | | 20061011 | 박정인   | 2006     |        2 | 2006-08-20 | 4 rows in set (0.00 sec) SELECT 절은 STUDENT 테이블의 기본 키에 대한 조건과 마찬가지로 FEE 테이블의 기본 키를 가지고 있기 때문에 여기서 DISTINCT는 불필요하다. 2019-05-06 쉽게 배우는 MySQL 5.x

20.11 자료형의 변환을 피해야 한다. 20.12 가장 큰 테이블을 마지막에 위치하라. 20.11 자료형의 변환을 피해야 한다. -SQL은 자동적으로 자료형을 변환한다. 예를 들면, 수치형 GRADE 열이 문자열 리터럴과 비교할 수 있다면 다음 조건은 정확하다. WHERE GRADE = '3' -자료형을 변환하는 것은 처리 속도에 역효과를 내므로 피하는 것이 좋다. 20.12 가장 큰 테이블을 마지막에 위치하라. -Join을 구성할 때 FROM 절에서 테이블의 순서는 처리 속도에 영향을 준다. -FROM 절에서 가장 큰 테이블을 마지막에 두는 것이 처리속도 향상 FROM  STUDENT, SUBJECT STUDENT 테이블이 SUBJECT 테이블보다 더 크기 때문에 다음과 같이 바꾸어 준다. FROM  SUBJECT, STUDENT 2019-05-06 쉽게 배우는 MySQL 5.x

20.13 ANY와 ALL 연산자의 사용을 피하라. -ALL 연산자를 가지고 있는 조건을 처리할 때 인덱스를 사용하지 않는다. -가능하다면 ALL 연산자를 통계 함수 MIN 이나 MAX로 대체하는 것이 좋다. [예제 20-16] 가장 나이가 많은 학생의 학번, 이름, 출생 년도를 출력하라. mysql> select stu_no, stu_name, birth_year     -> from student     -> where birth_year <= all     -> (select birth_year     -> from student); +----------+----------+------------+ | stu_no   | stu_name | birth_year | | 20001021 | 이상길   | 1975       | 1 row in set (0.09 sec) 여기서 ALL 연산자를 MIN 함수로 대치할 수 있다.     -> where birth_year =     -> (select min(birth_year) 2019-05-06 쉽게 배우는 MySQL 5.x

[예제 20-17] 가장 나이가 많은 학생을 제외한 학생의 학번, 이름, 생년을 출력하라. mysql> select stu_no, stu_name, birth_year     -> from student     -> where birth_year > any     -> (select birth_year     -> from student); +----------+----------+------------+ | stu_no   | stu_name | birth_year | | 20001001 | 김유신   | 1981       | | 20001015 | 박도준   | 1978       | | 20041002 | 김유미   | 1983       | | 20041007 | 정인정   | 1983       | | 20041033 | 연개소문 | 1981       | | 20061011 | 박정인   | 1983       | | 20061014 | 고혜진   | 1987       | | 20061048 | 김영호   | 1986       | | 20071001 | 장수인   | 1989       | | 20071010 | 홍길동   | 1988       | | 20071022 | 이순신   | 1989       | | 20071300 | 유하나   | 1988       | | 20071307 | 김문영   | 1988       | | 20071405 | 최차영   | 1988       | 14 rows in set (0.00 sec) 여기서 ANY 연산자를 MIN 함수로 대치할 수 있다. mysql> SELECT STU_NO, STU_NAME, BIRTH_YEAR     -> FROM   STUDENT     -> WHERE  BIRTH_YEAR >     -> (SELECT MIN(BIRTH_YEAR)     ->  FROM  STUDENT); 2019-05-06 쉽게 배우는 MySQL 5.x

20.14 미래의 최적화기 -제 20 장에서는 최적화기가 아직은 최적이 아니라는 것을 명확히 보여준다. -어떤 경우에 최적화기는 가장 효율적인 처리 기법을 결정하지 못하기 때문에 이는 처리 시간을 길게 할 수 있다. -연구를 통하여 향상된 최적화기를 만들고 있기 때문에 최근에 발표된 SQL 제품은 그 이전의 것 보다 많이 향상되었다. 20.15 디스크 최적화 -시스템, 프로그램, 임시 파일들을 위한 전용 디스크를 갖추어 저장 -내용이 자주 변경되면 갱신 기록, 트랜잭션 기록 파일을 별도의 디스크에 배치 -데이터베이스 디스크에 있어서는 빠른 탐색 시간(seek time)이 결정적인 요인 -매우 큰 데이터베이스에 경우, 디스크 탐색 속도에 의해 성능이 좌우 -데이터가 증가할 때 마다 탐색 수는 N log N 씩 증가한다. -임시파일 또는 쉽게 갱신될 수도 있는 데이터에 대해서 미러링이나 RAID(RAID 0는 예외)를 사용하지 않는다. 2019-05-06 쉽게 배우는 MySQL 5.x

20.16 운영체제 최적화 -메모리 문제가 있다면 시스템이 적은 메모리를 사용하도록 설정하기 보다는 메모리를 증설하는 것이 좋다. -데이터는 NFS 디스크를 사용하지 않는다. (NFS locking 문제에 봉착 가능) -시스템과 SQL 서버를 위해 open file 한계 수치를 증가시킨다. -프로세스와 쓰레드의 제한 개수를 늘려준다. -큰 테이블을 사용할 일이 드물다면, 파일을 여러 실린더에 분산시켜 저장하지 않도록 설정한다. -솔라리스는 큰 파일을 지원하는 파일시스템을 사용한다. 2019-05-06 쉽게 배우는 MySQL 5.x