ferson2020
그는 물었다 8년 전
139

postgresql 카운트입니다 (달랐다.) 매우 느린

나는 아주 간단한 SQL 쿼리:

SELECT COUNT(DISTINCT x) FROM table;

내 약 1.5 만 표에 행뿐만. 이 호스팅하면서 질의입니다 아주 천천히. 비해 7.5s 걸린다

 SELECT COUNT(x) FROM table;

이는 435ms 정도가 걸린다. 변경 (change my 쿼리하지 성능을 향상시킬 수 있는 방법은 없나? # 39, ve i& 그룹짓기 및 일반 카운트입니다 x 에서 인덱스 권장하며, 일을 했다. 둘 다 동일한 7.5s 실행 시간.

Ry-
그는 8년 전 댓글을 달았습니다
0

39, 그래서 내가 don& 것 같지는 않다. 서로 다른 값을 받고 있는 것은 그저 1.5 만 행뿐만 속도가 느릴 것입니다.

Ry-
그는 8년 전 댓글을 달았습니다
4

그냥 C # 에서 1.5 억 정수 값을 받고 있는 노력은 한 것 같습니다, 다른 컴퓨터에서 메모리를 1 초 대신할 수 있습니다. 그런 만큼 you& # 39, re 아마도 아웃해야 운빨이야.

wildplasser
그는 8년 전 댓글을 달았습니다
0

질의 계획이 아주 많이 의존하고 있는 테이블 구조를 (인덱스) 및 설정에 튜닝함으로써 상수입니다 (작업), 메모리, effective_cache_size random_page_cost). 이 두 번째 합리적인 비용으로 튜닝함으로써 쿼리하지 이내에 집행될 수 있다는 것.

ferson2020
그는 8년 전 댓글을 달았습니다
0

좀 더 정확히요? 어떤 인덱스화하고 튜닝함으로써 상수입니다 약간만이라도 asm0001.asm 이해했소 데 필요한 두 번째? 단순하게, solaris. 이는 두 개의 단으로 구성된 첫 번째 열에 있는 테이블 기본 키 # 39, & # 39 m, y, I& 이렇게 distinct& # 39. 두 번째 열에 1.5 만 행뿐만 함께 x int 유형의 질의합니다.

wildplasser
그는 8년 전 댓글을 달았습니다
0

나는 그저 실험. 비용이 1.7 초, 나를 너회의 ы '다른' 는 약 400 밀리초입니다. (발, 카운트입니다 *) 비용을 통해 플래너 스테 것입니다. BRB.

ferson2020
그는 8년 전 댓글을 달았습니다
0

다시 고유해야 수 있는 어떤 종류의 스테 보호하리요 이 플래너?

tobixen
그는 8년 전 댓글을 달았습니다
0

두 개의 한다. 대략의 수행여 &quot 선택할 수 있다면, 다른 발 설명하란말야 table&quot 에서 얻을 수 있습니다. 이 플래너 볼 수 있도록 시용되는 행뿐만 것으로 보고 있다. 다른 생각. 아마 one way) 또는 다른 수의 구분되는 색인에서 엔트리입니다 찾을 수 있다. 난 순간, t # 39 시간은 아직 죄송합니다. don& 조사하고 있다고 밝혔다. 아, 세 번째 제안이다. 카운터를 사용하여 예비형 통계 있는 테이블을 통해 업데이트되도록 트리거입니다. 그러나 매우 좋은 일은 없었다. 정말 내장된 인덱스화하여 것 하나 빼놓을 수 없는 비교적 빠르게 할 수 있습니다.

wildplasser
그는 8년 전 댓글을 달았습니다
0

이 스테 더 이하 속임수 계속 count+distinct 다른 레이어 (주며 이로 인해 &quot hash"; 사용할 계획) 이 해시된 계획하십시오 work_mem 필요합니다. 설정값입니다 work_mem = 64. 강제로 인덱스화할 (또는 테이블) 는 두 배 수준인 스캑 느립니다. LOL 은 하는 것이 보다, 그냥 포스트리스 C #; -)

ferson2020
그는 8년 전 댓글을 달았습니다
0

I am not 와 동일한 쿼리하지 &quot 사용하여 hash"; 계획. # 39 m,,,, 점점 &quot i& unique&quot &quot group&quot sort&quot ";).

vyegorov
그는 8년 전 댓글을 달았습니다
1

제발, 테이블 정의를 포함시키십시오 함께 indexe ('\d 파스크라 의' '좋은' 출력입니다 1) 모든 및 정확히까지 열 수 있는 문제가 있다. # 39; d '분석' 모두 볼 수 있는 좋은 것이라고 it& 설명하란말야 질의입니다.

답변 4 개

이 사용할 수 있습니다.

SELECT COUNT(*) FROM (SELECT DISTINCT column_name FROM table_name) AS temp;

이 것보다 훨씬 빠릅니다.

COUNT(DISTINCT column_name)

Ankur
rogerdpack
그는 6년 전 댓글을 달았습니다
30

신성 쿼리합니다 배트맨! 이 위로 질주하고 내 postgres 카운트입니다 4.5 둔덕이에요 구분되어 190 년대

DavidMann10k
그는 6년 전 댓글을 달았습니다
18

난 왜 이 작동됨 사랑이었냐고요 설명을 할 수 있다. 좋은 팁!

Ankur
그는 6년 전 댓글을 달았습니다
19

내가 찾은 이 스레드할 켜짐이 [www.postgresql.org] (http://www.postgresql.org) 가 ich5r 마찬가지입니다. [링크] (http://www.postgresql.org/message-id/CAONnt 72Mtg6kyAFDTHXFWyPPY-QRbAtuREak + + [email protected]). 답글 (대표 제프 제인) 한 것이라고 할 수 있다 (다른 ()) 이 테이블을 사용하는 대신 신규인지 작동합니까 해시보다.

St.Antario
그는 5년 전 댓글을 달았습니다
5

@Ankur 질문 드려도 될까요? 이후 '정렬' 수 (고유 ()) 가 보유하고 있는 것으로, 특히 말해둘꼐요 도움됐네 인덱스화할 비교적 적은 양의 '' 'column_name workmem' (해싱 생산할 수 있는 많은 양의 레이트블리 배치). 그 이후, 사용 횟수 it& # 39 의 나쁜 것이 항상 (다른 () # 39 isn&, t?

musmahn
그는 2년 전 댓글을 달았습니다
0

아는 사람, & # 39 는 쿼리합니다 돌아갈 수 있다면 왜 이 두 개의 다른 결과를 NULL& # 39. 가치를 column_name?

GolezTrol
그는 2년 전 댓글을 달았습니다
1

(열) '만' 카운트입니다 @musmahn 들려주시겠습니까 비사양 null 값을. 'count (*)' 들려주시겠습니까 행뿐만. 그래서 더 이상 카운트입니다 한 첫 번째 / 또 널 행 (once). '수 (column_name)' 을 변경하십시오 동작하도록 마찬가지다.

Shiwangini Shishulkar
그는 일 년 전 댓글을 달았습니다
1

39, t, t # 39 이 wasn& @ankur me.didn& 훨씬 유용할 수 있는 뛰어난 개선이 요구된다.

-- My default settings (this is basically a single-session machine, so work_mem is pretty high)
SET effective_cache_size='2048MB';
SET work_mem='16MB';

\echo original
EXPLAIN ANALYZE
SELECT
        COUNT (distinct val) as aantal
FROM one
        ;

\echo group by+count(*)
EXPLAIN ANALYZE
SELECT
        distinct val
       -- , COUNT(*)
FROM one
GROUP BY val;

\echo with CTE
EXPLAIN ANALYZE
WITH agg AS (
    SELECT distinct val
    FROM one
    GROUP BY val
    )
SELECT COUNT (*) as aantal
FROM agg
        ;

결과:

original                                                      QUERY PLAN                                                      
----------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=36448.06..36448.07 rows=1 width=4) (actual time=1766.472..1766.472 rows=1 loops=1)
   ->  Seq Scan on one  (cost=0.00..32698.45 rows=1499845 width=4) (actual time=31.371..185.914 rows=1499845 loops=1)
 Total runtime: 1766.642 ms
(3 rows)

group by+count(*)
                                                         QUERY PLAN                                                         
----------------------------------------------------------------------------------------------------------------------------
 HashAggregate  (cost=36464.31..36477.31 rows=1300 width=4) (actual time=412.470..412.598 rows=1300 loops=1)
   ->  HashAggregate  (cost=36448.06..36461.06 rows=1300 width=4) (actual time=412.066..412.203 rows=1300 loops=1)
         ->  Seq Scan on one  (cost=0.00..32698.45 rows=1499845 width=4) (actual time=26.134..166.846 rows=1499845 loops=1)
 Total runtime: 412.686 ms
(4 rows)

with CTE
                                                             QUERY PLAN                                                             
------------------------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=36506.56..36506.57 rows=1 width=0) (actual time=408.239..408.239 rows=1 loops=1)
   CTE agg
     ->  HashAggregate  (cost=36464.31..36477.31 rows=1300 width=4) (actual time=407.704..407.847 rows=1300 loops=1)
           ->  HashAggregate  (cost=36448.06..36461.06 rows=1300 width=4) (actual time=407.320..407.467 rows=1300 loops=1)
                 ->  Seq Scan on one  (cost=0.00..32698.45 rows=1499845 width=4) (actual time=24.321..165.256 rows=1499845 loops=1)
       ->  CTE Scan on agg  (cost=0.00..26.00 rows=1300 width=0) (actual time=407.707..408.154 rows=1300 loops=1)
     Total runtime: 408.300 ms
    (7 rows)

또 다른 방법을 통해 제작될 수 있는 경우와 같은 계획을 스테 것입니다 (창 기능)

tobixen
그는 8년 전 댓글을 달았습니다
2

캐싱과는 효과를 고려해 본 적이 있으십니까? 하는 경우 3 &quot 설명하란말야 analyze"; 그 후, 첫 번째 셨으며 불러오기 속도가 느릴 수 있지만 빠른 메모리에서 가져오는 rmw 디스켓에서 두 수 있습니다.

wildplasser
그는 8년 전 댓글을 달았습니다
0

랑하니: 가장 먼저 설정을 effective_cache_size 면변형. 내거냐 는 2GB, 이어스.

ferson2020
그는 8년 전 댓글을 달았습니다
0

I set 변경 없이 내 effective_cache_size 2GB 의 성능. # 39; d 제안하세요 다른 설정을 you& 면변형을? 그렇다면 어떤?

wildplasser
그는 8년 전 댓글을 달았습니다
0

1) 즉 어떻게 했나요? (너 HUP it?) 2) 많은 메모리를 사용할 수 있는 실제 가지고 있습니까? 3) 저희들을 계획은. 4) 아마 나의 시스템이 더 빨리, 또는 당신 애두요 동시 로드형 다루는 데 있다. @ferson2020: 확인

ferson2020
그는 8년 전 댓글을 달았습니다
0

It i set 문으로:

39, & # 39 2GB& effective_cache_size 설정되었습니다 =;;

이 나는한다 메모리 용량을 사용할 수 있습니다. 나 포함 노력했다고 하지만, t # 39 부합되는 쿼리하지 계획하십시오 won& 셀명 기입란.

wildplasser
그는 8년 전 댓글을 달았습니다
0

1) 예상 row_width 뭐니? 2) 의 'do you have a 가용 인덱스화할 다른 x)' 열? 3) 를 넣을 수 있다면 다른 곳에서 쿼리하지 (깃허브?) 원래 질문은 꽂으십시오 편집하십시오 같아.

'카운트입니다 경우 (다른 (x))' 가 '수 (x)' 이 질의에서는 크게 보다 느린 속도를 높일 수 있습니다 다음 다른 테이블, 예를 들어 'x 값을 유지하여 들려주시겠습니까 table_name_x_counts (not null x_count 정수 x, int not null)' 를 트리거합니다. 하지만 당신의 쓰기 성능 고통받을거야 아웃하기로 업데이트했는지 you& # 39 한 후 여러 값을 트랜잭션까지; d 'x' 이렇게 해야 하는 일부 명시성 오더할 줄일 수 있다.

난 역시 동일한 오토메이티드 검색: 때문에 내가 필요한 일부 지점에서 시간 total_count 함께 각기 다른 값을 제한값 / 오프셋된 .

39 의 리틀이에요 it& 때문에 각기 다른 값을 얻기 위해 함께 할 수 있는 까다로운 총 카운트입니다 제한값 / 오프셋입니다. # 39 의 총 수를 제한할 수 있도록 열심히 일반적으로 it& 함께 / 오프셋입니다. 마지막으로 I got the way to do -

서로 다른 COUNT () 를 통해 ',' 에서 2 () 에 total_count table_name 제한값 오프셋된 0;

성능도 쿼리하지 높음입니다.