Postgresql SQL 문장의 효율적인 작업 보기

Explain 명령은 데이터베이스 성능을 해결하는 데 있어서 가장 권장되는 명령입니다. 대부분의 성능 문제는 이 명령을 통해 간단하게 해결할 수 있습니다. Explain은 SQL 문장의 실행 효과를 볼 수 있고 더 좋은 색인과 검색 문장을 최적화하여 더 좋은 최적화 문장을 작성하는 데 도움을 줄 수 있습니다.

설명 구문:


explain select … from … [where ...]

예:


explain select * from dual;

여기에는 다음과 같은 간단한 예가 있습니다.


EXPLAIN SELECT * FROM tenk1;
               QUERY PLAN
----------------------------------------------------------------
   Seq Scan on tenk1 (cost=0.00..458.00 rows=10000 width=244)

EXPLAIN에서 참조하는 데이터는 다음과 같습니다.


1). 예상 시작 비용(출력 스캐닝이 시작되기 전에 소모되는 시간, 예를 들어 하나의 정렬 노드에서 줄을 잇는 시간).
2). 예상 총비용.
3). 예상된 이 계획 노드의 출력 행수
4). 예상 계획 노드의 행 평균 너비 (바이트) 입니다.
이 비용 (cost) 의 계산 단위는 디스크 페이지의 접근 수량입니다. 예를 들어 1.0은 순서대로 디스크 페이지를 읽을 것입니다.그 중에서 상부 노드의 지출은 그 모든 하위 노드의 지출을 포함할 것이다.이곳의 출력 줄 수 (rows) 는 노드 처리/스캐닝을 계획하는 줄 수가 아닙니다. 보통 더 적습니다.일반적으로 맨 윗줄의 예상 수량은 실제 되돌아오는 줄 수를 조회하는 데 더 가깝다.

이제 시스템 테이블 기반 질의를 수행합니다.


SELECT relpages, reltuples FROM pg_class WHERE relname = 'tenk1';
검색 결과에서 알 수 있듯이tenk1표는 358개의 디스크 페이지와 10000개의 기록을 차지하고 있으나,cost의 값을 계산하기 위해서는 다른 시스템의 매개 변수 값을 알아야 한다.

postgres=# show cpu_tuple_cost;
   cpu_tuple_cost
  ----------------
   0.01
  (1 row)
cost = 458( ) + 10000( ) * 0.01(cpu_tuple_cost 
추가:postgresql SQL COUNT(DISTNCT FIELD) 최적화

배경


특정 시간대 키워드의 모든 총수를 통계하고null(statistics는 400w+의 데이터가 있고 표 크기는 600M)을 포함하기 때문에
sql 쓰기:

select count(distinct keyword) +1 as count from statistics;

문제


백그라운드 조회지만 너무 느려요. 집행시간이 38.6s인데 어떻게 최적화하나요?

해결하다


방법 1 (치수)


이 시간을 정해서 실행하고 sql 결과를 캐시합니다. 그리고 프로그램이 캐시 결과에 접근하면 페이지 접근이 빨라지지만 본질적으로 sql 실행이 느린 문제를 해결하지 못했습니다.

방법 2 (근본 치료)


sql를 최적화하려면 우선count(distinct FIELD)가 왜 이렇게 느린지 말해 보세요. 여기는 더 이상 설명하지 않겠습니다. 이 편을 보십시오https://www.jb51.net/article/65680.htm
컨텐츠 최적화:

select count( distinct FIELD ) from table
로 수정

select count(1) from (select distinct FIELD from table) as foo;

비교하다


실행 과정 비교, explian anaylze sql 문장으로 볼 수 있습니다
이상의 개인적인 경험으로 여러분께 참고가 되었으면 좋겠습니다. 또한 많은 응원 부탁드립니다.만약 잘못이 있거나 완전한 부분을 고려하지 않으신다면 아낌없이 가르침을 주시기 바랍니다.

좋은 웹페이지 즐겨찾기