it-swarm-ko.tech

쿼리의 Explain Plan을 어떻게 해석합니까?

SQL 문의 실행 방법을 이해하려고 시도 할 때 Explain 계획을 보는 것이 좋습니다. 설명 계획을 해석 (이해)하기 위해 어떤 과정을 거쳐야합니까? "아, 이것이 훌륭하게 작동하고 있습니까?" "아뇨, 맞지 않습니다."

87
user290

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

전체 스캔은 단순히 데이터 세그먼트 (테이블 또는 테이블 (파티션) 파티션)의 많은 블록을 읽는 가장 효율적인 방법이며 성능 문제를 나타내는 경우가 많습니다. 쿼리의 목표를 달성하기위한 효율적인 메커니즘인지 여부 데이터웨어 하우스 및 BI 전문가라고 말하면, 성능을 나타내는 가장 중요한 경고 플래그는 인덱스 기반 액세스 방법과 중첩 루프입니다.

따라서 Explain Plan을 읽는 방법의 메커니즘에 대해서는 Oracle 문서가 좋은 안내서입니다. http://download.Oracle.com/docs/cd/B28359_01/server.111/b28274/ex_plan.htm# PFGRF009

Performance Tuning Guide도 잘 읽어보십시오.

또한 "카디널리티 피드백"에 대한 Google이 있으며, 설명 계획을 사용하여 쿼리의 여러 단계에서 카디널리티 추정을 실행 중에 경험 한 실제 카디널리티와 비교할 수 있습니다. 볼프강 브라 이틀 링은이 방법의 저자라고 생각합니다.

결론 : 액세스 메커니즘을 이해하십시오. 데이터베이스를 이해하십시오. 쿼리의 의도를 이해하십시오. 경험 법칙을 피하십시오.

78
David Aldridge

이 주제는 너무 커서 이런 질문에 대답 할 수 없습니다. Oracle 's Performance Tuning Guide 를 읽는 데 약간의 시간이 걸립니다.

13
Tony Andrews

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

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

좀 더 복잡합니다 (그리고 100 % 처리하지는 않지만) 기본적으로 비용은 CPU와 IO 비용의 함수이며 카디널리티는 Oracle의 행 수입니다. 이 두 가지를 모두 줄이는 것이 좋습니다.

쿼리 비용은 쿼리 및 Oracle 옵티 마이저 모델 (예 : COST, CHOOSE 등) 및 통계 실행 빈도에 영향을받을 수 있습니다.

예 1 :

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

인덱스를 사용하는 예 2 :

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

이미 제안했듯이 TABLE SCAN을 조심하십시오. 당신은 일반적으로 이것을 피할 수 있습니다.

5
Mark Nold

순차적 스캔과 같은 것을 찾는 것이 다소 유용 할 수 있지만 실제 수치는 수치에 불과합니다. 쿼리를 보는 것보다 일반적으로 far 더 유용한 것은 무엇입니까? plan 실제 실행 . Postgres에서 이것은 EXPLAIN과 EXPLAIN ANALYZE의 차이점입니다. EXPLAIN ANALYZE는 실제로 쿼리를 실행하고 모든 노드에 대한 실제 타이밍 정보를 얻습니다. 그러면 플래너 thinks 대신 실제로 무슨 일이 일어나고 있는지 볼 수 있습니다. 일어날 것이다. 많은 경우 순차 스캔이 전혀 문제가 아니라 쿼리의 다른 문제라는 것을 알게 될 것입니다.

다른 열쇠는 실제 비싼 단계가 무엇인지 식별하는 것입니다. 많은 그래픽 도구는 서로 다른 크기의 화살표를 사용하여 계획의 다른 부분 비용을 나타냅니다. 이 경우 얇은 화살표가 들어오고 두꺼운 화살표가 나오는 단계를 찾으십시오. GUI를 사용하지 않는 경우 숫자를 확인하고 갑자기 더 커지는 위치를 찾아야합니다. 약간의 연습으로 문제 영역을 선택하는 것이 상당히 쉬워집니다.

4
decibel

실제로 이와 같은 문제의 경우 가장 좋은 방법은 ASKTOM 입니다. 특히 그 질문에 대한 그의 답변에는 온라인 오라클 문서에 대한 링크가 포함되어 있으며, 여기에는 많은 종류의 규칙이 설명되어 있습니다.

명심해야 할 것은 계획을 설명하는 것이 가장 좋은 추측이라는 것입니다.

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

하지만 당신은 물어봐야합니다. 그는 그것에 대해 모든 것을 알고있다 :)

3
EvilTeach

Explain의 출력은 각 단계가 얼마나 오래 걸 렸는지 알려줍니다. 첫 번째는 오랜 시간이 걸렸던 단계를 찾아서 의미를 이해하는 것입니다. 순차 스캔과 같은 것은 더 나은 색인이 필요하다는 것을 알려줍니다. 이는 주로 특정 데이터베이스와 경험에 대한 연구의 문제입니다.

2
Tom Leys

하나의 "아뇨, 맞지 않습니다"는 종종 table scan 형식입니다. 테이블 스캔은 특별한 인덱스를 사용하지 않으며 메모리 캐시에서 유용한 모든 것을 제거하는 데 기여할 수 있습니다. 예를 들어 postgreSQL에서는 다음과 같이 보입니다.

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

때로는 테이블 스캔이 인덱스를 사용하여 행을 쿼리하는 것보다 이상적입니다. 그러나 이것은 당신이 찾고있는 것 같은 붉은 깃발 패턴 중 하나입니다.

2
convex hull

기본적으로 각 작업을 살펴보고 작업 방법에 대한 지식을 바탕으로 작업이 "합리적"인지 확인하십시오.

예를 들어, 각 열 C와 D에서 A와 B라는 두 개의 테이블을 조인하고 (AC = BD) 계획에 테이블에 클러스터 된 인덱스 스캔 (SQL Server 용어-Oracle 용어를 모름)이 표시되는 경우 A, 그런 다음 테이블 B에서 일련의 클러스터형 인덱스 탐색에 대한 중첩 루프 조인이 문제가 있다고 생각할 수 있습니다. 이 시나리오에서는 엔진이 결합 된 열의 인덱스를 통해 한 쌍의 인덱스 스캔을 수행 한 다음 병합 조인을 수행 할 수 있습니다. 추가 조사로 인해 잘못된 통계가 옵티마이 저가 해당 조인 패턴 또는 실제로 존재하지 않는 인덱스를 선택하게 할 수 있습니다.

2
Jonathan Rupp

계획의 각 하위 섹션에서 소요 된 시간의 백분율을보고 엔진이 수행하는 작업을 고려하십시오. 예를 들어, 테이블을 스캔하는 경우 스캔중인 필드에 인덱스를 넣는 것을 고려하십시오.

1
Steven A. Lowe

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

http://www.sql-server-performance.com/tips/query_execution_plan_analysis_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? 

이를 피하는 것이 항상 가능한 것은 아니지만 피할 수있을수록 쿼리 성능이 빨라집니다.

1
dpollock