복붙노트

[SQL] SQL 쿼리 복잡성 대 성능에 어떤 일반적인 규칙이 있습니까?

SQL

SQL 쿼리 복잡성 대 성능에 어떤 일반적인 규칙이 있습니까?

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. ==============================

    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. ==============================

    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. ==============================

    3.일반적으로 그들은 관련된 테이블과 m 당 레코드 수는 테이블의 숫자가 결합되는 O (N ^ m), 여기서 n로되어 있습니다 것입니다.

    일반적으로 그들은 관련된 테이블과 m 당 레코드 수는 테이블의 숫자가 결합되는 O (N ^ m), 여기서 n로되어 있습니다 것입니다.

    양자 모두. 심하게 (즉 좋은 절) 필터링 조인 할 때 인덱스는 직접 조회를 허용, 그들은 빠른 수 있도록 그들이 오른쪽 열에있을 때 합류했다.

    그들이 가입 또는 필터링되는 열을하지 않은 경우 인덱스는 아무런 도움이되지 않습니다.

  4. ==============================

    4.클러스터되지 않은 인덱스 작업 대 클러스터 방법 확인

    클러스터되지 않은 인덱스 작업 대 클러스터 방법 확인

    즉 쉽게 설명은 나의 좋은 친구 믈라덴 색인을 이해하는 간단한 기사를 작성했습니다 ...보기의 순수 기술적 관점에서입니다.

    인덱스는 확실히 도움이되지만 나는이 장점과 단점을 이해하고 읽고 추천 않습니다.

  5. from https://stackoverflow.com/questions/2065754/is-there-any-general-rule-on-sql-query-complexity-vs-performance by cc-by-sa and MIT license