2008-10-24 4 views
17

나는 직장에서 일부 SQL 쿼리를 최적화하도록 임무를 부여 받았다. 내가 발견 한 모든 것이 Explain Plan을 사용하여 문제 영역을 식별합니다. 내가 계획을 설명하는 것이 정확히 무엇인지를 알 수없는 문제는 나에게 말하고있다. 비용, 카디널리티 및 바이트가 발생합니다.Explain Plan을 사용하여 쿼리를 최적화하는 방법은 무엇입니까?

이것은 무엇을 나타내는 것이며이를 가이드로 사용하는 방법은 무엇입니까? 낮은 숫자가 더 좋습니까? 더 좋았어? 모든 입력은 크게 감사하겠습니다.

또는 쿼리를 최적화하는 가장 좋은 방법이 있다면 관심이 있습니다.

답변

8

실제로 무엇을하고 있는지에 따라 그 이상을 얻습니다. 이 explain plan 페이지를 확인하십시오. 여기서 오라클을 사용하고 있으며 스크립트를 실행하여 계획 출력을 표시하는 방법을 알고 있다고 생각합니다. 시작하는 것이 더 중요 할 수있는 것은 특정 인덱스의 사용 여부와 해당 인덱스의 활용 방법을 왼쪽에서 살펴 보는 것입니다. "(전체)", "(인덱스 Rowid)"등의 항목을 볼 수 있습니다. 비용은 더 낮은 비용으로보아야 할 다음 것이고 인덱스를 사용하지 않는 조인을하는 경우 매우 큰 비용이 발생할 수 있음을 알 수 있습니다. explain plan columns에 대한 세부 정보도 읽어보세요.

+0

도움을 주시면 감사하겠습니다. 특히 링크를 클릭하십시오. 그것은 나에게 지금부터 만들기 시작하고있다. 도움에 다시 한번 감사드립니다. –

+1

인덱스를 사용하지 않는 조인은 좋지 않을 수 있으며 절대적으로 최상일 수 있습니다.그것은 모두 의존합니다. 색인으로 모든 전체 테이블 스캔을 제거하려고 시도하지 마십시오. –

6

막대 사탕의 희미한 끝 부분이 있습니다.

엄청난 양의 추가 정보 및 경험없이 설명 계획을보고 최적의 성능을 내지 못하는 원인 (있는 경우)을 결정하는 방법은 절대적으로 없습니다. 쿼리 튜닝을 10 단계 프로세스로 줄일 수 있다면 자동화 된 프로세스로 수행 할 수 있습니다. 나는 당신이 이것에 효과적이기 위하여 당신이 이해할 필요가있는 모두를 목록으로 만들 것을 대략이었다 그러나 저것은 아주 긴 명부 일 것입니다.

내가 생각할 수있는 유일한 짧은 대답은 ... 추측 할 수없는 것보다 더 많은 바이트를 처리 할 계획의 단계를 찾는 것입니다. 그런 다음 색인 또는 분할을 통해 그 수를 줄일 수있는 방법에 대해 생각하십시오.

진심으로, 오라클 Fundementals

을 기반으로 비용에 조나단 루이스 책을 얻을 오라클 데이터베이스 아키텍처에 톰 카이트의 책을 얻고 몇 주 동안 숲에서 오두막을 임대.

+0

나는 이것이 직장에서 원래 나에게 설명되었던 것처럼 간단하지 않다는 느낌을 받기 시작했다. 도서 제안을 주셔서 감사합니다, 그들은 읽을 도서 목록에 추가됩니다. –

+1

대기열에 추가하지 말고 상단으로 이동 한 다음 읽을 수있는 모든 작업을 수행하십시오. 나는 Lewis의 책을 먼저 말하고 싶다. 그것은 설명 계획이 의미하는 바에 관한 것입니다. 그러나 그렇게 쓰여진 것은 아닙니다. –

4

엄청난 전문 분야입니다 (일명 검은 색 예술).

나는 일반적으로 걸릴 접근 방식은 다음과 같습니다

  1. 문제의 SQL 문을 실행,
  2. 이 (찾아 dbms_xplan) 실제 계획을 가져,
  3. 행 (기수) 대의 예상 수를 비교 실제 행 수 큰 차이는 문제가 해결되어야 함을 나타냅니다. (예 : 인덱스, 히스토그램)
  4. 프로세스의 속도를 높이기 위해 색인을 생성 할 수 있는지 고려하십시오 (일반적으로 계획이 개념적으로 먼저 수행되어야한다고 생각하는 곳). 인덱스를 사용해보십시오.

데이터베이스에 묻는 컨텍스트에서 다른 인덱스의 O() 영향을 이해해야합니다. b-tree, 해시 테이블 등과 같은 데이터 구조를 이해하는 데 도움이됩니다. 그런 다음 프로세스를 작동 및 반복 할 수있는 인덱스를 만듭니다.

오라클이 색인을 사용하지 않기로 결정한 경우 INDEX() 힌트를 적용하고 새로운 계획을 살펴보십시오. 비용은 선택한 계획보다 큽니다. 이것이 귀하의 지수를 선택하지 않은 이유입니다.암시 된 계획은 왜 당신의 색인이 좋지 않은지에 대한 통찰력으로 이어질 것입니다.

+0

오라클이 인덱스를 사용하지 않기로 결정한 것은 처음에는 이상한 것처럼 보였습니다. 당신의 설명이 끝나기 전까지는 이제 내가 깨달은 것보다 더 깊이 깨달았습니다. 그들이 우리와 함께 일할 경험이 풍부한 DBA를 얻을 수 있다면 우리는 더 나아질 것입니다. –

7

또한 Oracle을 사용하고 있다고 가정합니다. 또한 처음에는 설명 계획 웹 페이지를 체크 아웃하는 것이 좋습니다. 최적화에는 많은 부분이 있지만 학습 할 수 있습니다.

몇 가지 팁은 다음과 같습니다 누군가의 작업이 최적화

첫째, 그들은 거의 항상 적절한 성능보다는 궁극적 인 성능을 찾고 있습니다. 쿼리의 실행 시간을 3 분에서 3 초로 줄이면 요청할 때까지 2 초로 줄일 수 있습니다.

둘째, 최적화중인 쿼리가 논리적으로 올바른지 확인하려면 빠른 확인을 수행하십시오. 그것은 불합리하게 들리지만, 느린 실행 쿼리에 대한 조언을 구한 횟수를 말할 수는 없으며 때로는 오답을주는 경우가 있습니다. 그리고 결과적으로 쿼리를 디버깅하는 것이 속도를 향상시키는 것으로 나타났습니다.

특히, 설명 계획에서 "Cartesian Join"구를 찾으십시오. 거기에서 보게되면 의도하지 않은 데카르트 조인을 발견했을 가능성이 아주 큽니다. 의도하지 않은 데카르트 조인의 일반적인 패턴은 FROM 절이 쉼표로 구분 된 테이블을 나열하고 조인 조건이 WHERE 절에 있다는 것입니다. 하나의 조인 조건이 누락되어 있다는 점을 제외하면 Oracle은 데카르트 조인을 수행 할 수밖에 없습니다. 대형 테이블의 경우 성능이 저하됩니다.

질의가 논리적으로 정확한 Explain plan에서 Cartesian Join을 볼 수는 있지만 이전 버전의 Oracle과 연관시킵니다.

또한 사용되지 않은 화합물 색인을 찾으십시오. 복합 인덱스의 첫 번째 열이 쿼리에 사용되지 않으면 오라클은 비효율적으로 인덱스를 사용하거나 전혀 사용하지 않을 수 있습니다. 저를 예를 들어 보겠습니다 :

쿼리이었다 :

select * from customers  
where 
    State = @State 
    and ZipCode = @ZipCode 

합니다 (DBMS는 오라클은하지 않았다, 그래서 구문은 달랐다, 나는 원래의 구문을 잊어 버린).

인덱스를 빠르게 살펴 보면 (국가, 주, 우편 번호) 열이있는 고객의 인덱스가 순서대로 나타납니다. 나는

select * from customers 
    where Country = @Country 
     and State = @State 
     and ZipCode = @ZipCode 

을 읽을 수있는 쿼리를 변경하고 최적화 좋은 이점에 인덱스를 사용할 수 있었기 때문에 지금은 대신 약 6 분 6 초 만에 달렸다. 나는 응용 프로그램 프로그래머에게 그들이 조건에서 국가를 생략 한 이유를 물었습니다. 그리고 이것은 그들의 답변이었습니다. 그들은 모든 주소가 'USA'와 동등한 국가라는 사실을 알고 있었기 때문에 그 기준을 벗어나서 쿼리의 속도를 높일 수 있다고 생각했습니다!

데이터베이스 검색을 최적화하는 것은 계산 시간을 면제하는 것과 실제로 같지 않습니다. 여기에는 데이터베이스 디자인, 특히 인덱스와 적어도 최적화 프로그램이 어떻게 수행되는지에 대한 개요가 포함됩니다.

일반적으로 옵티 마이저를 능가하려고 시도하는 대신 옵티 마이저를 사용하여 공동 작업하는 것이 더 나은 결과를 얻을 수 있습니다.

최적화가 완료되면 행운을 빌어 요!

+0

조언 해 주셔서 감사합니다. 또한 Cartesian Join 문제에 대해서도 언급 했었습니다. 위에서 언급 한 몇 가지 다른 쿼리에서 언급 한 바와 같이 커다란 변화가 있었고 이제는 쿼리가 실제로 반환 한 것입니다. 그림을 이동. –