문제

SQL 문이 어떻게 실행되는지 이해하려고 할 때 때로는 설명 계획을 살펴보는 것이 좋습니다.설명 계획을 해석(이해하기)하려면 어떤 프로세스를 거쳐야 합니까?"아, 이것은 화려하게 작동합니까?" "오 아니, 그건 옳지 않다."

도움이 되었습니까?

해결책

전체 테이블 스캔은 나쁘고 인덱스 액세스는 좋다는 댓글을 볼 때마다 몸서리쳐집니다.전체 테이블 스캔, 인덱스 범위 스캔, 빠른 전체 인덱스 스캔, 중첩 루프, 병합 조인, 해시 조인 등의미 있는 결론에 도달하기 위해 분석가가 이해하고 데이터베이스 구조 및 쿼리 목적에 대한 지식과 결합되어야 하는 단순한 액세스 메커니즘입니다.

전체 스캔은 단순히 데이터 세그먼트(테이블 또는 테이블(하위)파티션)의 블록 중 많은 부분을 읽는 가장 효율적인 방법이며, 종종 성능 문제를 나타낼 수 있지만 이는 컨텍스트에서만 가능합니다. 쿼리 목표를 달성하기 위한 효율적인 메커니즘인지 여부입니다.데이터 웨어하우스 및 BI 담당자로서 제가 성능에 대해 가장 먼저 경고하는 플래그는 인덱스 기반 액세스 방법과 중첩 루프입니다.

따라서 계획 설명을 읽는 방법에 대한 메커니즘에 대해서는 Oracle 설명서가 좋은 가이드입니다. http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/ex_plan.htm#PFGRF009

성능 조정 가이드(Performance Tuning Guide)도 잘 읽어 보십시오.

또한 실행 중에 경험한 실제 카디널리티와 쿼리의 다양한 단계에서 카디널리티 추정치를 비교하기 위해 설명 계획을 사용할 수 있는 기술인 "카디널리티 피드백"에 대한 Google이 있습니다.나는 볼프강 브라이틀링(Wolfgang Breitling)이 이 방법의 창시자라고 믿습니다.

따라서 결론은 다음과 같습니다.액세스 메커니즘을 이해합니다.데이터베이스를 이해하세요.쿼리의 의도를 이해합니다.경험 법칙을 피하십시오.

다른 팁

이 주제는 이런 질문에 답하기에는 너무 방대합니다.시간을 내어 읽어야 합니다 오라클의 성능 튜닝 가이드

아래 두 가지 예는 INDEX를 사용한 FULL 스캔과 FAST 스캔을 보여줍니다.

비용과 카디널리티에 집중하는 것이 가장 좋습니다.예제를 살펴보면 인덱스를 사용하면 쿼리 실행 비용이 줄어듭니다.

좀 더 복잡하지만(100% 처리할 수는 없음) 기본적으로 비용은 CPU 및 IO 비용의 함수이고 카디널리티는 Oracle이 구문 분석할 것으로 예상하는 행 수입니다.이 두 가지를 모두 줄이는 것은 좋은 일입니다.

쿼리 비용은 쿼리와 Oracle 옵티마이저 모델의 영향을 받을 수 있다는 점을 잊지 마십시오(예:COST, CHOOSE 등) 및 통계 실행 빈도를 확인할 수 있습니다.

예시 1:

스캔 http://docs.google.com/a/shanghainetwork.org/File?id=dd8xj6nh_7fj3cr8dx_b

인덱스를 사용하는 예 2:

색인 http://docs.google.com/a/fukuoka-now.com/File?id=dd8xj6nh_9fhsqvxcp_b

그리고 이미 제안한 대로 TABLE SCAN에 주의하세요.일반적으로 이러한 문제는 피할 수 있습니다.

순차 스캔과 같은 것을 찾는 것이 어느 정도 유용할 수 있지만 현실은 숫자에 있습니다...숫자가 단지 추정일 경우를 제외하고!일반적으로 무엇입니까? 멀리 쿼리를 보는 것보다 더 유용합니다. 계획 실제를 보고 있다 실행.Postgres에서는 이것이 EXPLAIN과 EXPLAIN ANALYZE의 차이점입니다.EXPLAIN ANALYZE는 실제로 쿼리를 실행하고 모든 노드에 대한 실제 타이밍 정보를 가져옵니다.그러면 무엇이 있는지 알 수 있습니다. 실제로 기획자가 하는 일이 아닌, 일어나는 일이 생각한다 일어날 것이다.순차 스캔은 전혀 문제가 되지 않고 쿼리의 다른 문제인 경우가 많습니다.

또 다른 핵심은 실제로 비용이 많이 드는 단계가 무엇인지 식별하는 것입니다.많은 그래픽 도구는 다양한 크기의 화살표를 사용하여 계획 비용의 다양한 부분을 나타냅니다.그런 경우에는 얇은 화살표가 들어오고 두꺼운 화살표가 나가는 단계를 찾으십시오.GUI를 사용하지 않는 경우 숫자를 눈으로 보고 숫자가 갑자기 훨씬 커지는 부분을 찾아야 합니다.조금만 연습하면 문제 영역을 찾아내는 것이 상당히 쉬워집니다.

실제로 이와 같은 문제의 경우 가장 좋은 방법은 애스크톰.특히 그 질문에 대한 그의 대답에는 이러한 종류의 규칙이 많이 설명되어 있는 온라인 Oracle 문서에 대한 링크가 포함되어 있습니다.

명심해야 할 한 가지는 계획 설명이 실제로 최선의 추측이라는 것입니다.

sqlplus 사용법을 배우고 AUTOTRACE 명령을 실험해 보는 것이 좋습니다.일부 어려운 숫자를 사용하면 일반적으로 더 나은 결정을 내릴 수 있습니다.

하지만 꼭 물어보세요.그는 그것에 대해 모두 알고 있습니다 :)

explain의 출력은 각 단계에 걸린 시간을 알려줍니다.첫 번째는 오랜 시간이 걸린 단계를 찾아 그 의미를 이해하는 것입니다.순차 스캔과 같은 것들은 더 나은 인덱스가 필요하다는 것을 알려줍니다. 이는 대부분 특정 데이터베이스와 경험에 대한 연구의 문제입니다.

"아, 아냐, 그건 옳지 않아"는 종종 다음과 같은 형태로 나타납니다. 테이블 스캔.테이블 스캔은 특별한 인덱스를 활용하지 않으며 메모리 캐시에서 유용한 모든 항목을 제거하는 데 기여할 수 있습니다.예를 들어 postgreSQL에서는 다음과 같은 모습을 볼 수 있습니다.

Seq Scan on my_table  (cost=0.00..15558.92 rows=620092 width=78)

때로는 인덱스를 사용하여 행을 쿼리하는 것보다 테이블 스캔이 이상적일 때도 있습니다.그러나 이는 귀하가 찾고 있는 것으로 보이는 위험 신호 패턴 중 하나입니다.

기본적으로 각 작업을 살펴보고 작동 방식에 대한 지식을 바탕으로 해당 작업이 "합리적인"지 확인합니다.

예를 들어 두 테이블 A와 B를 각각의 열 C와 D(A.C=B.D)에 조인하고 계획에 클러스터형 인덱스 스캔(SQL Server 용어 - oracle 용어는 확실하지 않음)이 표시되는 경우 A, 그런 다음 테이블 B에서 일련의 클러스터형 인덱스 검색에 대한 중첩 루프 조인을 수행하면 문제가 있다고 생각할 수 있습니다.이 시나리오에서는 엔진이 한 쌍의 인덱스 스캔(조인된 열의 인덱스에 대해)을 수행한 후 병합 조인을 수행할 것으로 예상할 수 있습니다.추가 조사를 통해 최적화 프로그램이 해당 조인 패턴을 선택하게 만드는 잘못된 통계나 실제로 존재하지 않는 인덱스가 드러날 수 있습니다.

계획의 각 하위 섹션에 소요되는 시간의 비율을 살펴보고 엔진이 수행하는 작업을 고려하세요.예를 들어, 테이블을 스캔하는 경우 스캔 중인 필드에 인덱스를 배치하는 것을 고려하십시오.

저는 주로 인덱스나 테이블 스캔을 찾습니다.이는 일반적으로 where 문이나 Join 문에 있는 중요한 열의 인덱스가 누락되었음을 나타냅니다.

에서 http://www.sql-server-performance.com/tips/query_execution_plan_analytic_p1.aspx:

실행 계획에 다음 중 하나가 표시되면 경고 표시를 고려하여 잠재적 성능 문제에 대해 조사해야합니다.그들 각각은 성능 관점에서 이상적이지 않습니다.

* Index or table scans: May indicate a need for better or  additional indexes.
* Bookmark Lookups: Consider changing the current clustered index,
  consider using a covering index, limit
  the number of columns in the SELECT
  statement.
* Filter: Remove any functions in the WHERE clause, don't include wiews
  in your Transact-SQL code, may need
  additional indexes.
* Sort: Does the data really need to be sorted? Can an index be used to
  avoid sorting? Can sorting be done at
  the client more efficiently? 

이것들을 피하는 것이 항상 가능하지는 않지만, 더 많이 피할수록 더 빠른 쿼리 성능이 있습니다.

경험 법칙

(아마도 자세한 내용을 읽어보고 싶을 것입니다.

나쁜

여러 개의 대형 테이블에 대한 테이블 스캔

좋은

고유 인덱스 사용
색인에는 모든 필수 필드가 포함되어 있습니다.

가장 일반적인 승리

내가 본 성능 문제의 약 90%에서 가장 쉬운 승리는 많은 테이블(4개 이상)이 포함된 쿼리를 2개의 작은 쿼리와 임시 테이블로 나누는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top