[SQL] SQL 쿼리 복잡성 대 성능에 어떤 일반적인 규칙이 있습니까?
SQLSQL 쿼리 복잡성 대 성능에 어떤 일반적인 규칙이 있습니까?
1) 인덱스가 사용되지 않는 경우의가, 결합 수에 비해 SQL 쿼리 실행 시간의 O는 (n)이 있습니까? 그렇지 않으면, 우리는 가능성이 어떤 종류의 관계를 기대하는거야? 수 인덱싱은 실제 큰-O 시간 복잡성을 개선, 또는 일부 상수 계수를 전체 쿼리 시간을 줄일 수 있는가?
약간 모호한 질문, 나는 확실히 그것을 많이 변화하고있어하지만 난 여기에 일반적인 의미에서 이야기하고있다.
2) 당신은 같은 쿼리가있는 경우 :
SELECT T1.name, T2.date
FROM T1, T2
WHERE T1.id=T2.id
AND T1.color='red'
AND T2.type='CAR'
나는 바로 멀티 테이블 조건을 평가하기 전에, T1.color 및 T2.type에 처음으로 필터링 한 표를 할 것이다 DB를 가정하고 있는가? 이러한 경우, 쿼리가 더 복잡하게하는 것은 빠르고 적은 행이 조인 수준의 시험을 실시하고 있기 때문에 할 수 있을까?
해결법
-
==============================
1.이것은 사용되는 쿼리 계획에 따라 달라집니다.
이것은 사용되는 쿼리 계획에 따라 달라집니다.
심지어 인덱스없이, 현대 서버가 HASH 조인 및 병합 빠른 O보다하는 가입 사용할 수 있습니다 (N * M)
구체적으로는, HASH의 복잡성 가입 N은 해시 테이블이고, M (가) 룩업 테이블 인 O (N + M)이있다. 해싱 및 해시 조회는 일정 복잡성을 가지고있다.
병합의 복잡성 가입 O는 (N * 로그 (N) + M * 로그인 (M)가) : 그것은 테이블 플러스를 검색하는 시간을 모두 정렬하는 시간의 합계입니다.
SELECT T1.name, T2.date FROM T1, T2 WHERE T1.id=T2.id AND T1.color='red' AND T2.type='CAR'
정의 된 인덱스가없는 경우, 엔진은 해시 조인을 선택합니다 또는 MERGE는 가입하세요.
다음과 같이 HASH는 작품을 가입 :
다음과 같이 MERGE는 작품을 가입 :
확실한.
WHERE 절없이 쿼리
SELECT T1.name, T2.date FROM T1, T2
반환 더 많은 결과보기 및 실행 이상 더 간단하지만.
-
==============================
2.너무 많은 다른 것들을 가미하여주의하십시오. 당신은 행의 수에 따라 쿼리의 논리적 비용을 조사 할 필요가 실제로 반환되는 행의 수와있는 페이지의 수를 기준으로 관련이없는 물리적 비용을 기반으로 (아마도) 작은 논리적 비용을 조사한다.
너무 많은 다른 것들을 가미하여주의하십시오. 당신은 행의 수에 따라 쿼리의 논리적 비용을 조사 할 필요가 실제로 반환되는 행의 수와있는 페이지의 수를 기준으로 관련이없는 물리적 비용을 기반으로 (아마도) 작은 논리적 비용을 조사한다.
세 가지가 아니지만 강력하게 관련되어있다.
행의 수는 컨트롤에 이러한 비용의 최대 및 최소 쉽게 조사했다. 행은이 알고리즘을 결합을 통해 일치해야합니다. 이것은 또한 가장 관련이있다.
즉, 클라이언트 응용 프로그램과 데이터베이스 사이 / O 대역폭이 I를 때문에 반환 된 행의 수는 더 비싸다.
즉 물리적 I / O의의 더 큰 숫자이기 때문에 읽을 페이지 수는 가장 비용이 많이 드는 것입니다. 즉 부하가 모든 클라이언트에 영향을 데이터베이스 내부에 있기 때문에 그게 가장 비용이 많이 드는입니다.
하나 개의 테이블과 SQL 쿼리는 O (N)입니다. 즉 행의 수입니다. 이 페이지의 수에 따라 O (P)도 있습니다.
하나 개 이상의 테이블의 행은 검사된다 O (㎚ ...). 즉 알고리즘을 중첩 루프입니다. 1 : 1의 관계가 모두이기 때문에 관계의 중요도에 따라, 그러나, 결과 집합은 O (N)를 작게 할 수있다. 그러나 각 테이블은 일치하는 행을 검사해야합니다.
해시 가입을 대체 O (N * 로그 (N)) 인덱스 + 테이블이 O (n)이 직접 해시 조회로 읽습니다. 당신은 여전히 프로세스 O (n)의 행을 가지고 있지만, 일부 인덱스 읽기 우회.
병합을 대체 O (㎚) 중첩 루프와 O (로그 (N + M) (N + m)) 정렬 작업에 참여.
인덱스, 물리적 비용이 테이블은 단지 존재 선택된 경우 O (로그 (n)은 m)로 감소 될 수있다. 행이 필요한 경우, 인덱스는 행에 대한 액세스 속도,하지만 일치하는 모든 행을 처리 할 수 있어야합니다. O (㎚)에 상관없이 해당 인덱스의 결과 세트 크기 때문에.
이 작품에 대한 조사 페이지는 인덱스의 선택에 따라 작을 수 있습니다.
인덱스의 포인트는 너무 많은 조사 행의 수를 줄일 수 없습니다. 그것은 행을 페치의 물리적 I / O 비용을 줄일 수 있습니다.
-
==============================
3.일반적으로 그들은 관련된 테이블과 m 당 레코드 수는 테이블의 숫자가 결합되는 O (N ^ m), 여기서 n로되어 있습니다 것입니다.
일반적으로 그들은 관련된 테이블과 m 당 레코드 수는 테이블의 숫자가 결합되는 O (N ^ m), 여기서 n로되어 있습니다 것입니다.
양자 모두. 심하게 (즉 좋은 절) 필터링 조인 할 때 인덱스는 직접 조회를 허용, 그들은 빠른 수 있도록 그들이 오른쪽 열에있을 때 합류했다.
그들이 가입 또는 필터링되는 열을하지 않은 경우 인덱스는 아무런 도움이되지 않습니다.
-
==============================
4.클러스터되지 않은 인덱스 작업 대 클러스터 방법 확인
클러스터되지 않은 인덱스 작업 대 클러스터 방법 확인
즉 쉽게 설명은 나의 좋은 친구 믈라덴 색인을 이해하는 간단한 기사를 작성했습니다 ...보기의 순수 기술적 관점에서입니다.
인덱스는 확실히 도움이되지만 나는이 장점과 단점을 이해하고 읽고 추천 않습니다.
from https://stackoverflow.com/questions/2065754/is-there-any-general-rule-on-sql-query-complexity-vs-performance by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 스프링 JDBC를 사용하는 경우 (+20 라인 SQL) 긴 청소 방법을 구체화하기 위해? [닫은] (0) | 2020.07.22 |
---|---|
[SQL] 4 액세스 표 속성을 가입 난간 (0) | 2020.07.22 |
[SQL] PostgreSQL의 트림 후행 공백 (0) | 2020.07.22 |
[SQL] 삽입 후 새로운 ID를 얻기 (0) | 2020.07.22 |
[SQL] 여러 값에 Where 절을 사용하여 SQL 문 (0) | 2020.07.22 |