SQL 쿼리 성능 튜닝 - 빠른 쿼리를 만드는 방법

번역 https://mode.com/sql-tutorial/sql-performance-tuning

여기에서 시작? 이것은 SQL의 가이드를 사용하여 데이터 분석의 일부 튜토리얼의 시작을 참조 .

 

하위 쿼리는 그 교훈은 우리는 같은 결과 집합을 얻기 위해 문을 실행하여 빠르게 실현할 수 있습니다. 이 단원에서는 쿼리 최적화 점을 인식하고 방식을 최적화하는 방법을 배우게됩니다.

 

쿼리 시간 뒤에 이론

 

같은 "천장"에 의해 제한 모든 소프트웨어, 속도와 같은 컴퓨터에서 실행되는 데이터베이스 소프트웨어는 - 그것은 하드웨어가 처리 할 수있는 정보의 가장 큰 금액, 그것은 정보의 최대 금액을 처리 할 수 ​​있습니다. 빠르게 실행 쿼리를 처리해야합니다 컴퓨팅 소프트웨어 (즉, 하드웨어)의 수를 줄일 수 있는지 확인합니다. 당신은 SQL 계산 방법을 이해할 필요가 필요 계산의 양을 줄일 수 있습니다. 첫째, 우리는 몇 쿼리 시간의 표면에 영향을 차례로 요인의 수의 계산에 영향을 가정 해 봅시다 :

  • 테이블 크기 : 쿼리를 디자인 할 경우 하나 개 이상의 시트가 성능에 영향을 미칠 수, 행 또는 테이블의 많은 행 수백만있다.
  • 병합 : 두 개의 테이블, 크게 증가하는 결과 집합의 행 결합 수를 병합하는 경우, 다음 쿼리가 느려질 수 있습니다. 에서 하위 쿼리 코스 하나의 예를 거기에.
  • 중합 : 중합은 단순히 이들 라인이 더 계산을 필요로 수득보다 행 복수의 조회 결과를 생성한다.

쿼리 시간 또한 데이터베이스 자체와 관련된 무엇인가에 따라, 이러한 일들이 제어되지 않습니다 :

  • 다른 사용자가 쿼리를 실행 : 주어진 시간 내에 더 많은 동시 데이터베이스 쿼리, 더 많은 데이터베이스가 처리하는 모든 쿼리는 더 느리게 실행됩니다. 특히, 사람들이 위의 상황의 일부 쿼리의 많은 자원을 필요에 맞게 실행 쿼리 속도가 특히 가난한 될 것입니다.
  • 데이터베이스 소프트웨어 및 최적화 : 이것은 아마도 당신이 통제 할 수없는,하지만 당신은 당신이 사용하는 소프트웨어 시스템을 잘 알고있는 경우에, 당신은 당신의 쿼리를보다 효율적으로하기 위해 그것의 사용을 극대화 할 수 있습니다.

이제, 당신이 관심을 제어 할 수의 당신이 통제 할 수없는 것을 무시하자.

 

테이블의 행의 수를 줄이

 

당신은 크게 쿼리 속도를 개선 할 수있는 데이터를 필터링 할 필요가있다. 데이터를 필터링하는 방법 완전히 당신이 해결하려는 문제에 따라 달라집니다. 당신이 시간 필드 데이터가 예를 들어, 시간 제한의 작은 창은 쿼리가 훨씬 빠르게 실행 할 수 있습니다 :

SELECT *
  FROM benn.sample_event_table
 WHERE event_date >= '2014-03-01'
   AND event_date <  '2014-04-01'

그런 다음 최종 쿼리를 완료하기 위해 설정 한 전체 데이터를 실행하려면 제한을 제거, 데이터 탐색 적 분석의 제 1 서브 세트에 완료 할 수 있음을 기억하십시오. 마지막 쿼리는 오랜 시간 동안 실행할 수 있습니다,하지만 적어도 당신은 빨리 중간 단계를 실행할 수 있습니다.

제한 모드의 기본 조항 당신이 더 빠른 속도를 어떤 결과 분석의 다음 단계, 그리고 반환 결정하기에 충분한 --100 줄을 추가하는 이유입니다.

그래서 LIMIT을 사용한 경우, 중합 LIMIT 함수와 함께 사용하는 경우,이 함수는 중합이 완료 될 때 수행하고 결과 집합 행 지정된 수를 제한 반환하는 효과가 위의 예와 같이 동일하지 않은, 그 의미가 없다. 당신이 만약 라인이, 집계 함수의 사용의 결과를 얻을 수 (100)는 효과가 없습니다 제한 때문에 쿼리 속도가 속도를하지 않습니다이 모두 다음과 같은.

SELECT COUNT(*)
  FROM benn.sample_event_table
 LIMIT 100

당신이 (쿼리를 가속화하기 위해) 카운트 기능을 수행하기 전에 데이터 세트를 제한하려면, 서브 쿼리에 제한하려고 :

SELECT COUNT(*)
  FROM (
    SELECT *
      FROM benn.sample_event_table LIMIT 100 ) sub

 참고 : 당신이하지 그렇게 사용하는 실제 결과를 얻을 수, 쿼리 로직을 테스트하기 위해 사용한다, 그래서 완전히 결과를 변경됩니다이 LIMIT를 사용합니다.

하위 쿼리를 사용할 때 문에 당신이 구현의 시작을 제한하고자 할 때, 일반적으로, 당신은 데이터의 양이 인식 제한해야합니다. 의미가 아니라 외부 쿼리보다 하위 쿼리에서 LIMIT, 그. 다시 말하지만, 단지 쿼리 속도를 만들기 위해, 그래서 당신은 최종 결과를 얻을 수 없습니다, 로직을 테스트 할 수 있습니다.

 

공동 탐구의 단순화

 

일부에서는이 확장 이전 추천입니다. 이전 문이 한계에게 데이터의 양을 실행하기 위해 같이, 테이블의 크기는 합병 이전 제한하는 것이 좋을 것이다. 이 경우, 아래의 예를 참조, 공동 이름 필드의 대학과 대학 스포츠 팀 및 선수 테이블 정보 테이블 :

SELECT teams.conference AS conference,
       players.school_name,
       COUNT(1) AS players
  FROM benn.college_football_players players
  JOIN benn.college_football_teams teams ON teams.school_name = players.school_name GROUP BY 1,2 

benn.college_football_players表中有26,298行。那就意味着对于另一张表的每一行,26,298行都要进行计算比较进行匹配。但是如果事先对benn.college_football_players这张表进行聚合,你可以减少需要匹配的行数。首先,让我们看一下这个聚合操作:

SELECT players.school_name,
       COUNT(*) AS players
  FROM benn.college_football_players players
 GROUP BY 1

위의 쿼리는 252 개 결과를 반환했습니다. 그래서 쿼리와 일치하는 다시 위의 하위 쿼리에 대한 쿼리와는 크게 외부 층에서 일치의 소비를 줄일 수 있습니다 :

SELECT teams.conference,
       sub.*
  FROM (
        SELECT players.school_name,
               COUNT(*) AS players
          FROM benn.college_football_players players
         GROUP BY 1
       ) sub
  JOIN benn.college_football_teams teams
  ON teams.school_name = sub.school_name 

그들과 거래를 할 수있는 데이터베이스에 대한 30,000 선이 어렵지 않다 때문에이 경우, 당신은 큰 차이를 찾을 수 없습니다. 이 경기 전에 중합 수술 후 수백만, 또는 더 많은 행 수백 인 경우, 당신은 상당한 개선을 볼 수 있습니다. 당신이 당신의 쿼리 논리의 합리성을 보장하기 위해 서브 쿼리를 사용 할 때 - 첫 작품의 정확성을 고려하고 속도를 실행 해보십시오.

 

설명

 

당신은 어떤 (유효) 쿼리 앞에 EXPLAIN 추가 할 수 있습니다, 당신은 쿼리 시간이 많이 소요의 추정치를 얻을 수 있습니다. 그것은 절대적으로 정확하지 않습니다, 그러나 그것은 유용한 도구입니다. 다음 문을 실행 해보십시오 :

EXPLAIN
SELECT *
  FROM benn.sample_event_table
 WHERE event_date >= '2014-03-01' AND event_date < '2014-04-01' LIMIT 100

이 출력을 얻을 수 있습니다. 그것은 쿼리 계획이라고, 그것은 당신에게 (다른 테이블, 같은 문) 쿼리 실행의 순서를 보여줍니다

목록의 맨 아래에 하나는 실행 처음이다. 그래서, 우리는 WHERE 절의 범위가 먼저 실행됩니다 위의 날짜 제한을 보여 할 계획입니다. 그리고, 데이터베이스 (600) (이 대략 도면이다) 라인을 스캔 할 것이다. 큰 숫자는 더 이상 실행 시간을 의미 - 당신은 소비 옆에있는 행의 수를 볼 수 있습니다. 이러한 오히려 절대 정확한 결과보다 단순한 기준이다. 소비가 감소 여부를 관찰하기 위해 다시 EXPLAIN 실행 비용이 단계의 비용을 수정 한 후 EXPLAIN 실행하고이 오른쪽 열기 EXPLAIN입니다. 마지막으로, LIMIT 마지막 문을 실행하고, 소비는 아주 작은입니다.

자세한 내용을 참조 포스트 그레스 문서 .

추천

출처www.cnblogs.com/heisenburg/p/11600847.html