SQL 성능 최적화 (A)

우선, 효율 인자의 영향
(1) 많은 양의 데이터
(2)은 중국어 검색
(3), 시스템 구성 데이터베이스

둘째, 프로세스의 실행 효율을 볼
이행 계획의 간단한 분석을 통해
찾아, 1 가장 자원이 소요되는 점
2, 전체 테이블을 스캔 table_access 줄이기 위해
인덱스를 가지고, (3)

셋째, 단계 SQL의 구현
그림 삽입 설명 여기

/*
顺序为有1-6,6个大步骤,然后细分,5-1,5-2,5-3,由小变大顺序,1-J,1-A,1-P,1-U,为并行次序
*/
--查询组合字段
(5)select (5-2) distinct(5-3) top(<top_specification>)(5-1)<select_list>
--连表
(1)from (1-J)<left_table><join_type> join <right_table> on <on_predicate>
        (1-A)<left_table><apply_type> apply <right_table_expression> as <alias>
        (1-P)<left_table> pivot (<pivot_specification>) as <alias>
        (1-U)<left_table> unpivot (<unpivot_specification>) as <alias>
--查询条件
(2)where <where_pridicate>
--分组
(3)group by <group_by_specification>
--分组条件
(4)having<having_predicate>
--排序
(6)order by<order_by_list>

넷째, 최적화 전략
1 테이블의 중간 그려진 데이터 량 저감
2 사전 할당 일부 계산 및 앞서 수행하는 통계 작업있다
잘못 있던 곳 3, 조건 함수 (임의의 기능)을 수행 피하려고
4 표와 관련된 조건은 인덱스를 가지고,
(5) 조건이 중첩 루프의 출현 피하는 경우,
(6), 상기 데이터 량 조건부 접속 테이블을 줄이기

V. 최적화 대책
테이블 전면의 최소 기록되도록 1 검색된 전후로 테이블 구동 테이블과 레코드의 최소 수를 선택
절 순차적 정면에서 검색된 이용한 2는, 상기에있어서, 원칙적으로는, 테이블 간의 접속이 있다는 WHERE 조건 다른 전에 기록되어야
필터링 될 수 WHERE 절 끝에 기록뿐만 아니라, 링크 된리스트에 있어야 레코드의 최대 수에 대한 조건을 필터링 할 수있는 제 필터링해야
3 SELECT 절 '*'를 사용하지
절 절 가짐 교체 4
테이블의 별칭 5
대안에서 존재로 아닌 NOT에서 교체 EXISTS 6
. 7, 테이블이 존재 대안 연결된
8. 인덱스 컬럼 않도록 인덱스 장애가 발생 될 지표 계산 열로서 산출
NOT 인덱스 컬럼에서 사용 피하기 위해,도 9의 (인덱스 된 컬럼 않고 사용 원인 인덱스 실패)
UNION-ALL 대안 UNION; 조합에 대안 OR 10,
11주의. 조합 번호, 첫 번째 열의 인덱스
(12) 및 인덱스 열에있는 NULL이다 NOT NULL 사용 방지
13 절 BY ORDER 두 인덱스 엄격한 조건에서만 사용된다.
(14), 인덱스 항목을 변경하는 것을 방지하도록 입력
자원 집약적 인 작업의 사용을 피하고, 15 (DISTINCT로, UNION, MINUS, INTERSECT, ORDER BY)

케이스 :
.도 1을 참조하면,이고, NULL의 NULL이 아닌
  인덱스 널로서 인덱스에 포함되지 널 값을 포함하는 임의의 열을 사용할 수 없다. 여러 열 같은 경우 인덱스가 널 (null)을 포함하는 열이 있어도, 칼럼 인덱스에서 제외한다. , 칼럼 A는 NULL 값이 존재하면 인덱스 컬럼의 구조 성능을 향상되지 않더라도 것이이 방법.
  절은 null의 경우, 또는 인덱스를 사용할 수 없습니다 최적화 널 문이 아닌 모든 사용.

이 인덱스는 테이블에 존재하는 무엇을 말할 수 있지만, 테이블에 존재하지 않는 무엇을 말할 수 있음을 염두에 인덱스를 사용하지 않습니다 '=!'.
인덱스를 사용하지 않습니다 경우 급여 <직원에서 선택 *을 > 3000;
사용 인덱스 : 트랜잭션에서 선택 ACCOUNT_NAME 여기서 금액> 0,
인덱스를 사용 : 종업원으로부터 선택 * 여기서 급여 < 3000 급여> 3000;

3, 연결 기둥, '||'는 비활성화 된 인덱스로서 문자 다른 함수로 함수에 접속된다.
인덱스 사용하지 않고 : 트랜잭션에서 선택 계정 이름, 양 여기서 ACCOUNT_NAME || ACCOUNT_TYPE = 'AMEXA',
사용 지수 : 선택 계정 이름, 트랜잭션에서 양 여기서 계정 이름 = 'AMEX '및 ACCOUNT_TYPE = 'A';

4 '+'는 비활성화 된 인덱스와 같은 다른 수학적 함수와 수학 함수이다.
인덱스 사용하지 않고 : 거래에서 선택 계정 이름, 금액을 어디에 금액 +> 5000 3000,
사용 지수 : 선택 계정 이름, 거래에서 양의 경우 양> 2000 ;

(5)는 동일한 인덱스 열은 전체 테이블 검색을 가능하게하는 서로 비교 될 수없는
인덱스를 사용하지 않고 : 트랜잭션에서 선택 계정 이름, 양 여기서 ACCOUNT_NAME = NVL (: acc_name, 계정 이름)]
을 사용하여 인덱스 : 트랜잭션에서 선택 계정 이름, 양 여기서 계정 이름과 같은 NVL (: acc_name, '%' );

도 6에서, 와일드 카드 (%)로되는 성명 등
인덱스를 사용하지 : 종업원으로부터 선택 * 여기서 LAST_NAME 같은 '% cliton %',
사용 지수 : 종업원 등으로부터 선택 LAST_NAME * 'ㄴ %'

7, IN과가 존재하는
인덱스를 사용하지 않고 : (선택 *에서 열 곳 에서 ...)
을 사용하여 색인 : ... 어디에 존재 ( 'X 선택 , ...에서 ...')
가능한 동시에 NOT 대체하는 데 사용되어야한다 NOT EXISTS 모두 사용하지 않음 (인덱스를 사용하고 속도를 줄일 수 없습니다), NOT NOT IN 쿼리의 효율성보다있는 경우에도.

게시 66 개 원래 기사 · 원 찬양 8 ·은 20000 +를 볼

추천

출처blog.csdn.net/qq125281823/article/details/104447469