문제

MySQL의 explain 출력은 매우 간단합니다.PostgreSQL은 조금 더 복잡합니다.나는 그것을 설명하는 좋은 자료를 찾을 수 없었습니다.

explain이 정확히 무엇을 말하고 있는지 설명하거나 적어도 좋은 리소스의 방향을 알려줄 수 있습니까?

도움이 되었습니까?

해결책

설명_EXPLAIN.pdf 도움이 될 수도 있습니다.

다른 팁

제가 항상 헷갈렸던 부분은 시작 비용과 총 비용입니다.나는 잊어버릴 때마다 이것을 구글에 검색하는데, 여기로 다시 돌아오지만 차이점을 설명하지 못하기 때문에 이 답변을 쓰고 있습니다.이것이 내가 에서 수집한 것입니다. 포스트그레스 EXPLAIN 선적 서류 비치, 내가 이해한 대로 설명했다.

다음은 포럼을 관리하는 애플리케이션의 예입니다.

EXPLAIN SELECT * FROM post LIMIT 50;

Limit  (cost=0.00..3.39 rows=50 width=422)
  ->  Seq Scan on post  (cost=0.00..15629.12 rows=230412 width=422)

PgAdmin의 그래픽 설명은 다음과 같습니다.

graphical explanation of first query

(PgAdmin을 사용하는 경우 구성 요소에 마우스를 올려 비용 세부 정보를 읽을 수 있습니다.)

비용은 튜플로 표현됩니다.비용 LIMIT ~이다 cost=0.00..3.39 그리고 순차적으로 스캔하는 비용 post ~이다 cost=0.00..15629.12.튜플의 첫 번째 숫자는 시작 비용 두 번째 숫자는 총 비용.내가 사용했기 때문에 EXPLAIN 그리고는 아니다 EXPLAIN ANALYZE, 이러한 비용은 실제 측정값이 아닌 추정치입니다.

  • 창업비용 까다로운 개념이다.해당 구성 요소 이전의 시간을 나타내는 것이 아닙니다. 시작하다.구성 요소가 실행되기 시작하는 시점(데이터 읽기)과 실행 시점 사이의 시간을 나타냅니다. 구성요소가 첫 번째 행을 출력합니다..
  • 총 비용 데이터 읽기를 시작할 때부터 출력 쓰기를 완료할 때까지 구성 요소의 전체 실행 시간입니다.

복잡하게도 각 "상위" 노드의 비용에는 하위 노드의 비용이 포함됩니다.텍스트 표현에서 트리는 들여쓰기로 표현됩니다. LIMIT 부모 노드이고 Seq Scan 그 아이입니다.PgAdmin 표현에서 화살표는 하위 항목에서 상위 항목을 가리킵니다(데이터 흐름 방향). 이는 그래프 이론에 익숙하다면 직관에 어긋날 수 있습니다.

문서에는 비용이 모든 하위 노드를 포함한다고 나와 있지만 상위 노드의 총 비용은 3.39 자녀의 총 비용보다 훨씬 적습니다. 15629.12.다음과 같은 구성 요소가 있기 때문에 총 비용은 포함되지 않습니다. LIMIT 전체 입력을 처리할 필요가 없습니다.참조 EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100 AND unique2 > 9000 LIMIT 2;포스트그레스 EXPLAIN 선적 서류 비치.

위의 예에서 두 구성 요소 모두 행 쓰기를 시작하기 전에 처리를 수행할 필요가 없기 때문에 시작 시간은 두 구성 요소 모두에 대해 0입니다.순차 스캔은 테이블의 첫 번째 행을 읽고 이를 내보냅니다.그만큼 LIMIT 첫 번째 행을 읽은 다음 내보냅니다.

구성 요소가 행 출력을 시작하기 전에 언제 많은 처리를 수행해야 합니까?여러 가지 이유가 있을 수 있지만 한 가지 명확한 예를 살펴보겠습니다.다음은 이전과 동일한 쿼리이지만 현재는 ORDER BY 절:

EXPLAIN SELECT * FROM post ORDER BY body LIMIT 50;

Limit  (cost=23283.24..23283.37 rows=50 width=422)
  ->  Sort  (cost=23283.24..23859.27 rows=230412 width=422)
        Sort Key: body
        ->  Seq Scan on post  (cost=0.00..15629.12 rows=230412 width=422)

그리고 그래픽적으로:

graphical explanation of second query

다시 한 번 순차 스캔을 실행합니다. post 시작 비용이 없습니다.즉시 행 출력을 시작합니다.하지만 이 종류에는 상당한 시작 비용이 듭니다. 23283.24 그래야 하기 때문에 단일 행도 출력하기 전에 전체 테이블을 정렬합니다..종류의 총 비용 23859.27 전체 데이터 세트가 정렬되면 정렬된 데이터를 매우 빠르게 내보낼 수 있다는 사실을 반영하여 시작 비용보다 약간 높을 뿐입니다.

시작 시간을 확인하세요. LIMIT 23283.24 정렬의 시작 시간과 정확히 같습니다.이것은 아니기 때문이다 LIMIT 자체적으로 시작 시간이 높습니다.실제로 그 자체로는 시작 시간이 0이지만 EXPLAIN 각 상위의 모든 하위 비용을 적상하므로 LIMIT 시작 시간에는 하위 항목의 시작 시간 합계가 포함됩니다.

이러한 비용 롤업으로 인해 각 개별 구성 요소의 실행 비용을 이해하기 어려울 수 있습니다.예를 들어, 우리의 LIMIT 시작 시간이 0이지만 언뜻 보면 명확하지 않습니다.이러한 이유로 다른 여러 사람들이 이 링크에 연결되어 있습니다. explain.depesz.com, Hubert Lubaczewski(a.k.a.)가 만든 도구입니다.depesz) 이해에 도움이 됩니다. EXPLAIN 무엇보다도 부모 비용에서 자녀 비용을 빼는 것입니다.그는 다른 복잡성을 언급합니다. 짧은 블로그 게시물 그의 도구에 대해.

가장 많은 들여쓰기부터 가장 적은 들여쓰기까지 실행되며 계획의 맨 아래부터 맨 위까지 믿습니다.(따라서 들여쓰기된 섹션이 두 개 있는 경우 페이지 아래에 있는 섹션이 먼저 실행되고, 다른 섹션과 만나면 이들을 결합하는 규칙이 실행됩니다.)

아이디어는 각 단계마다 도착하여 일부 규칙에 따라 처리되는 1~2개의 데이터 세트가 있다는 것입니다.데이터 세트가 하나만 있는 경우 해당 작업은 해당 데이터 세트에 대해 수행됩니다.(예를 들어 인덱스를 스캔하여 원하는 행을 파악하고, 데이터 세트를 필터링하거나 정렬합니다.) 두 개가 있는 경우 두 개의 데이터 세트는 더 들여쓰기되어 표시되는 규칙에 따라 결합됩니다.대부분의 규칙의 의미는 합리적으로 쉽게 추측할 수 있습니다(특히 이전에 설명 계획을 많이 읽은 경우). 그러나 문서를 보거나 (더 쉽게) 문구를 입력하여 개별 항목을 확인할 수 있습니다. Google은 다음과 같은 몇 가지 키워드와 함께 EXPLAIN.

이것은 분명히 완전한 설명은 아니지만 일반적으로 원하는 것이 무엇이든 알아낼 수 있을 만큼 충분한 맥락을 제공합니다.예를 들어 실제 데이터베이스에서 다음 계획을 고려해보세요.

explain analyze
select a.attributeid, a.attributevalue, b.productid
from orderitemattribute a, orderitem b
where a.orderid = b.orderid
and a.attributeid = 'display-album'
and b.productid = 'ModernBook';

------------------------------------------------------------------------------------------------------------------------------------------------------------

 Merge Join  (cost=125379.14..125775.12 rows=3311 width=29) (actual time=841.478..841.478 rows=0 loops=1)
   Merge Cond: (a.orderid = b.orderid)
   ->  Sort  (cost=109737.32..109881.89 rows=57828 width=23) (actual time=736.163..774.475 rows=16815 loops=1)
         Sort Key: a.orderid
         Sort Method:  quicksort  Memory: 1695kB
         ->  Bitmap Heap Scan on orderitemattribute a  (cost=1286.88..105163.27 rows=57828 width=23) (actual time=41.536..612.731 rows=16815 loops=1)
               Recheck Cond: ((attributeid)::text = 'display-album'::text)
               ->  Bitmap Index Scan on (cost=0.00..1272.43 rows=57828 width=0) (actual time=25.033..25.033 rows=16815 loops=1)
                     Index Cond: ((attributeid)::text = 'display-album'::text)
   ->  Sort  (cost=15641.81..15678.73 rows=14769 width=14) (actual time=14.471..16.898 rows=1109 loops=1)
         Sort Key: b.orderid
         Sort Method:  quicksort  Memory: 76kB
         ->  Bitmap Heap Scan on orderitem b  (cost=310.96..14619.03 rows=14769 width=14) (actual time=1.865..8.480 rows=1114 loops=1)
               Recheck Cond: ((productid)::text = 'ModernBook'::text)
               ->  Bitmap Index Scan on id_orderitem_productid  (cost=0.00..307.27 rows=14769 width=0) (actual time=1.431..1.431 rows=1114 loops=1)
                     Index Cond: ((productid)::text = 'ModernBook'::text)
 Total runtime: 842.134 ms
(17 rows)

직접 읽어보시고 의미가 있는지 확인해 보세요.

내가 읽은 것은 데이터베이스가 먼저 id_orderitem_productid 인덱스를 사용하여 원하는 행을 찾습니다. orderitem, 를 누른 다음 퀵 정렬(데이터가 RAM에 맞지 않으면 사용된 정렬이 변경됨)을 사용하여 해당 데이터 세트를 정렬한 다음 별도로 설정합니다.

다음으로 스캔합니다. orditematt_attributeid_idx 원하는 행을 찾으려면 orderitemattribute 그런 다음 퀵 정렬을 사용하여 해당 데이터 세트를 정렬합니다.

그런 다음 두 개의 데이터 세트를 가져와 병합합니다.(병합 조인은 두 개의 정렬된 데이터 세트를 병렬로 탐색하여 일치할 때 조인된 행을 내보내는 일종의 "압축" 작업입니다.)

내가 말했듯이 계획은 내부 부분에서 외부 부분으로, 아래에서 위로 진행됩니다.

온라인 도우미 도구도 사용할 수 있습니다. 데페스, 분석 결과 중 비용이 많이 드는 부분이 어디에 있는지 강조 표시됩니다.

그것도 하나 있는데, 여기 같은 결과, 문제가 어디에 있는지 더 명확하게 보여줍니다.

PgAdmin 설명 계획의 그래픽 표현을 보여줍니다.둘 사이를 앞뒤로 전환하면 텍스트 표현의 의미를 이해하는 데 실제로 도움이 될 수 있습니다.그러나 단지 무엇을 할 것인지 알고 싶다면 항상 GUI를 사용할 수도 있습니다.

PostgreSQL의 공식 문서 explain의 출력을 이해하는 방법에 대한 흥미롭고 철저한 설명을 제공합니다.

pgadmin을 설치하면 텍스트 출력을 제공할 뿐만 아니라 무슨 일이 일어나고 있는지 확인하는 데 정말 유용하다고 생각되는 필터, 정렬 및 하위 집합 병합을 보여주는 다이어그램을 그리는 설명 버튼이 있습니다.

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