복붙노트

[SQL] 어떻게 PostgreSQL을 테이블에 행을 계산 속도를합니까?

SQL

어떻게 PostgreSQL을 테이블에 행을 계산 속도를합니까?

우리는 PostgreSQL의 테이블의 행 수를 계산해야합니다. 우리의 경우, 어떤 조건이 충족 될 필요가없고,이 크게 향상 쿼리 속도의 경우 행 추정치를 얻을 완벽하게 받아 들일 수있다.

기본적으로, 우리는 정확한 결과를 얻지 못하고 의미 경우에도 가능한 한 빨리 실행 <표>에서 SELECT COUNT (ID)를합니다.

감사! 모든 제안을 이해할 수있을 것이다!

해결법

  1. ==============================

    1.빠른 견적 :

    빠른 견적 :

    SELECT reltuples FROM pg_class WHERE oid = 'my_schema.my_table'::regclass;
    

    느린 계산에 포스트 그레스 위키의 조언을 포함하여 -이 쿼리 우수 지금까지 제공됩니다. (지금 업데이트 된.) relname는 pg_class에서 고유하지 않습니다. 데이터베이스의 여러 스키마에서 같은 relname 여러 테이블이있을 수 있습니다. 즉 정기적으로 내 설치의 경우입니다.

    그 테이블의 몇 가지에보기입니다으로 그리고 pg_stat_user_tables에 대한 쿼리는 여러 번 느립니다.

    당신이 테이블 이름을 스키마가 필요하지 않은 경우, regclass 형에 캐스트가 가장 일치를 선택하기 위해 현재 search_path의를 관찰한다. 테이블이 search_path의에서 스키마의 존재하지 않는 (또는 볼 수없는) 경우 그리고 당신은 오류 메시지가 표시됩니다.

    설명서의 객체 식별자의 유형에 대한 세부 사항.

    새로운 옵션과 관련 대답 :

  2. ==============================

    2.당신이 가까운이 방법을 추정 얻을 수 있도록 카운트는, 큰 테이블에 대한 느린 :

    당신이 가까운이 방법을 추정 얻을 수 있도록 카운트는, 큰 테이블에 대한 느린 :

    SELECT reltuples::bigint AS estimate 
    FROM pg_class 
    WHERE relname='tableName';
    

    과 매우 빠른 결과가 떠 있지만, 여전히 가까운 추정되지 않습니다.

  3. ==============================

    3.제외 (희망 'ID가'이다) 인덱스 필드에 COUNT ()를 실행 - 차선책은 실제로 INSERT에 대한 트리거를 사용하여 일부 테이블의 행 수를 캐시하는 것입니다. 당연히, 대신 캐시를 확인 할 수 있습니다.

    제외 (희망 'ID가'이다) 인덱스 필드에 COUNT ()를 실행 - 차선책은 실제로 INSERT에 대한 트리거를 사용하여 일부 테이블의 행 수를 캐시하는 것입니다. 당연히, 대신 캐시를 확인 할 수 있습니다.

    근사 위해 당신은 (https://wiki.postgresql.org/wiki/Count_estimate에서)이 시도 할 수 있습니다 :

    select reltuples from pg_class where relname='tablename';
    
  4. ==============================

    4.당신은 단순히 삽입 또는 삭제 한 후 트리거를 사용하여 테이블의 계수의 정확한 값을 요청할 수 있습니다 이 같은

    당신은 단순히 삽입 또는 삭제 한 후 트리거를 사용하여 테이블의 계수의 정확한 값을 요청할 수 있습니다 이 같은

    CREATE TABLE  tcounter(id serial primary key,table_schema text, table_name text, count serial);
    
    insert into tcounter(table_schema, table_name,count) select 'my_schema', 'my_table', count(*) from my_schema.my_table;
    

    사용 트리거

    CREATE OR REPLACE FUNCTION ex_count()
    RETURNS trigger AS
    $BODY$
    BEGIN
        IF (TG_OP='INSERT') THEN
          UPDATE tcounter set count = count + 1 where table_schema = TG_TABLE_SCHEMA::TEXT and table_name = TG_TABLE_NAME::TEXT;
        ELSIF  (TG_OP='DELETE') THEN
          UPDATE tcounter set count = count - 1 where table_schema = TG_TABLE_SCHEMA::TEXT and table_name = TG_TABLE_NAME::TEXT;
        END IF;
    RETURN NEW;
    END$BODY$
    LANGUAGE plpgsql VOLATILE
    COST 100;
    
    CREATE TRIGGER tg_counter  AFTER INSERT OR DELETE
      ON my_schema.my_table  FOR EACH ROW  EXECUTE PROCEDURE ex_count();
    

    그리고 계산을 요구

    select * from tcounter where table_schema =  'my_schema' and table_name = 'my_table'
    

    그것은 당신이 초기화 첫 번째 레코드에 대해 한 번 COUNT (*)를 선택 의미

  5. ==============================

    5.당신은 시스템 테이블 "pg_stat_user_tables"에서 견적을 얻을 수 있습니다.

    당신은 시스템 테이블 "pg_stat_user_tables"에서 견적을 얻을 수 있습니다.

    select schemaname, relname, n_live_tup 
    from pg_stat_user_tables 
    where schemaname = 'your_schema_name'
    and relname = 'your_table_name';
    
  6. ==============================

    6.데이터베이스가 작은 경우, 당신은 제안 @ 마이크 - sherrill - 고양이 리콜과 같은 모든 테이블의 추정치를 얻을 수 있습니다. 이 명령은 모든 테이블 생각을 나열합니다.

    데이터베이스가 작은 경우, 당신은 제안 @ 마이크 - sherrill - 고양이 리콜과 같은 모든 테이블의 추정치를 얻을 수 있습니다. 이 명령은 모든 테이블 생각을 나열합니다.

    SELECT schemaname,relname,n_live_tup 
    FROM pg_stat_user_tables 
    ORDER BY n_live_tup DESC;
    

    출력은 다음과 같이 될 것이다 :

     schemaname |      relname       | n_live_tup
    ------------+--------------------+------------
     public     | items              |      21806
     public     | tags               |      11213
     public     | sessions           |       3269
     public     | users              |        266
     public     | shops              |        259
     public     | quantities         |         34
     public     | schema_migrations  |         30
     public     | locations          |          8
    (8 rows)
    
  7. from https://stackoverflow.com/questions/14570488/how-do-i-speed-up-counting-rows-in-a-postgresql-table by cc-by-sa and MIT license