상하이 Tengke 교육 Dameng 데이터베이스 훈련 건 제품 공유 Dameng SQL 최적화-기본 기사

데이터베이스를 사용할 때 올바른 SQL 문을 작성하는 것은 긴 행진의 첫 번째 단계 일뿐입니다. 실제로 DBA의 일상적인 작업에서 SQL 최적화는 콘텐츠의 많은 부분을 차지합니다.이 기사에서는 SQL 최적화에 대한 몇 가지 기본 지식을 소개합니다.

 

1. 기본 개념

SQL 문을 최적화하는 방법을 이해하기 전에 먼저 몇 가지 기본 개념을 이해해야합니다.

 

1.1 실행 계획

실행 계획은 SQL 문의 실행 모드로, 쿼리 옵티마이 저가 문을 위해 설계된 실행 모드를 실행자에게 넘겨 실행합니다. SQL 명령 줄에서 EXPLAIN을 사용하여 문의 실행 계획을 인쇄합니다.

 

1.2 연산자

연산자는 SQL 실행의 기본 단위입니다. 모든 SQL 문은 최종적으로 일련의 연산자로 변환되고 최종적으로 서버에서 실행되어 필요한 결과를 얻습니다.

운영자는 또한 실행 계획을 이해하기위한 기초입니다. 자주 발생하는 운영자는 다음과 같습니다.

CSCN SSCN SSEK CSEK BLKUP

이러한 연산자는 SQL 쿼리 데이터의 원래 소스입니다. SQL에 나타나는 기본 테이블은 이러한 연산자의 설명에 나타납니다. 이러한 연산자는 해당 테이블이 실행 계획에 입력되는시기와 방법을 결정하는 데 사용됩니다. .

연산자의 구체적인 의미는 다음과 같습니다.

CSCN : 기본 전체 테이블 스캔 (a), 처음부터 끝까지 모두 스캔

SSCN : 보조 인덱스 스캔 (b), 처음부터 끝까지 모두 스캔

SSEK : 보조 인덱스 범위 스캔 (b), 키 값으로 범위 또는 단일 값을 정확하게 찾습니다.

CSEK : 클러스터형 인덱스 범위 스캔 (c), 키 값으로 범위 또는 단일 값을 정확하게 찾습니다.

BLKUP : 보조 인덱스 (b + a)의 ROWID를 기반으로 원본 테이블에서 모든 데이터를 검색합니다.

운영자에 대한 자세한 설명은 DM7 시스템 관리자 매뉴얼의 부록 4 "실행 계획 운영자"를 참조하십시오.

 

2. 실험 환경 구축

테이블 T1을 생성하고 데이터를 입력하면 관련 SQL 문은 다음과 같습니다.

SQL> CREATE TABLE T1 (C1 INT, C2 INT);

SQL> t1 선택 레벨에 삽입, 레벨 <10000으로 이중 연결에서 레벨;

 

3. 검사 실행 계획

--SEL1

SQL> 설명 select * from t1 where c1 = 5;

 

1 # NSET2 : [1, 249, 16]

2 # PRJT2 : [1, 249, 16]; exp_num (3), is_atom (FALSE)

3 # SLCT2 : [1, 249, 16]; T1.C1 = 5

4 # CSCN2 : [1, 9999, 16]; INDEX33555446 (T1)

 

인덱스없이 일반 테이블을 생성하고 필터링하고 T1에서 데이터를 꺼내는 것은 전체 테이블 스캔 CSCN 만 통과 할 수 있습니다.

 

인덱스 생성

SQL> 인덱스 i_test1 on t1 (c1);

 

다음 진술의 계획을보십시오

--SEL2

SQL> 설명 t1에서 c1 선택;

 

1 # NSET2 : [1, 9999, 12]

2 # PRJT2 : [1, 9999, 12]; exp_num (2), is_atom (FALSE)

3 #SSCN : [1, 9999, 12]; I_TEST1 (T1)

 

--SEL3

SQL> 설명 t1에서 c2 선택;

 

1 # NSET2 : [1, 9999, 12]

2 # PRJT2 : [1, 9999, 12]; exp_num (2), is_atom (FALSE)

3 # CSCN2 : [1, 9999, 12]; INDEX33555446 (T1)

 

이때 T1, CSCN T1 기본 테이블 또는 SSCN 보조 인덱스 I_TEST1, SEL2에 두 개의 항목이 있으며 C1 만 필요하고 보조 인덱스에 C1이 있으며 데이터 길이가 기본 테이블보다 짧습니다 (하나 더 C2). 인덱스 선택 SSCN

SEL3의 경우 여전히 더 나은 항목이 없거나 CSCN 전체 테이블을 선택합니다.

## 일반적으로 CSCN과 SSCN의 시간 소모는 거의 같다고 생각합니다 .SSCN과 CSCN의 차이점은 SSCN에서 스캔 한 데이터가 인덱스 열로 정렬되어 경우에 따라 사용할 수 있다는 것입니다.

 

이제 SSEK의 상황을보세요

--SEL4

SQL> 설명 select * from t1 where c1 = 5;

 

1 # NSET2 : [0, 249, 16]

2 # PRJT2 : [0, 249, 16]; exp_num (3), is_atom (FALSE)

3 # BLKUP2 : [0, 249, 16]; I_TEST1 (T1)

4 # SSEK2 : [0, 249, 16]; 스캔 _ 유형 (ASC), I_TEST1 (T1), 스캔 _ 범위 [5,5]

 

쿼리 조건 C1 = C1 인덱스가있는 수, scan_range [5,5] 연산자 뒤의 설명은 정확한 위치가 5임을 나타냅니다. 의심 할 여지없이 대부분의 경우 더 효율적입니다.

 

또 다른 요점은 I_TEST1에 C2 데이터가없고 쿼리에 SELECT *가 필요하기 때문에 BLKUP 연산자가 SSEK에 나타납니다. 인덱스는 전체 데이터 행을 찾기 위해 원래 테이블로 돌아가려면 BLKUP가 필요합니다.

 

매우 쉽습니다. 쿼리 C1 만 있으면 BLKUP 연산자가 존재하지 않아야한다고 생각할 수 있습니다.

--SEL5

SQL> 설명 선택 c1 from t1 where c1 = 5;

 

1 # NSET2 : [0, 249, 12]

2 # PRJT2 : [0, 249, 12]; exp_num (2), is_atom (FALSE)

3 # SSEK2 : [0, 249, 12]; 스캔 _ 유형 (ASC), I_TEST1 (T1), 스캔 _ 범위 [5,5]

과연

 

클러스터형 인덱스는 특수 인덱스 (연산자 CSEK에 해당)입니다. DM7에서는 동일한 테이블의 클러스터형 인덱스 하나만 허용됩니다. 테이블이 기본적으로 (힙 테이블없이) 빌드되는 경우 기본 테이블은 ROWID입니다. 클러스터형 인덱스, ROWID의 정확한 위치는 CSEK로 이동해야합니다.

--SEL6

SQL> 설명 select c1 from t1 where rowid = 6;

 

1 # NSET2 : [0, 1, 12]

2 # PRJT2 : [0, 1, 12]; exp_num (2), is_atom (FALSE)

3 # CSEK2 : [0, 1, 12]; 스캔 _ 유형 (ASC), INDEX33555446 (T1), 스캔 _ 범위 [exp_cast (6), exp_cast (6)]

 

사용자 지정 클러스터형 인덱스를 만드는 경우

SQL> t1 (c2)에 클러스터 인덱스 i_index2 생성;

그러면 클러스터형 인덱스 ROWID가 존재하지 않고 대신 C2 순서로 클러스터형 인덱스를 참조합니다.

--SEL7

SQL> 설명 select c1 from t1 where rowid = 6;

 

1 # NSET2 : [1, 249, 12]

2 # PRJT2 : [1, 249, 12]; exp_num (1), is_atom (FALSE)

3 # SLCT2 : [1, 249, 12]; T1.ROWID = var1

4 #SSCN : [1, 9999, 12]; I_TEST1 (T1)

 

## C1 및 ROWID가 여기 쿼리에 필요하며 일반 보조 인덱스 I_TEST1이 거기에 있으며 클러스터형 인덱스의 길이보다 짧으므로 SSCN I_TEST1을 선택하십시오.

 

--SEL8

SQL> 설명 선택 c1 from t1 where c2 = 6;

 

1 # NSET2 : [0, 249, 8]

2 # PRJT2 : [0, 249, 8]; exp_num (1), is_atom (FALSE)

3 # CSEK2 : [0, 249, 8]; 스캔 _ 유형 (ASC), I_INDEX2 (T1), 스캔 _ 범위 [6,6]

 

ROWID의 정확한 포지셔닝은 더 이상 정확한 포지셔닝 CSEK를 사용하지 않지만 C2의 정확한 필터링 인 I_TEST1 전체 인덱스 스캔은 CSEK를 사용하고 BLKUP가 없음을 알 수 있습니다.

추천

출처blog.csdn.net/qq_42726883/article/details/108487376