[SQL] 어떻게 PostgreSQL을 테이블에 행을 계산 속도를합니까?
SQL어떻게 PostgreSQL을 테이블에 행을 계산 속도를합니까?
우리는 PostgreSQL의 테이블의 행 수를 계산해야합니다. 우리의 경우, 어떤 조건이 충족 될 필요가없고,이 크게 향상 쿼리 속도의 경우 행 추정치를 얻을 완벽하게 받아 들일 수있다.
기본적으로, 우리는 정확한 결과를 얻지 못하고 의미 경우에도 가능한 한 빨리 실행 <표>에서 SELECT COUNT (ID)를합니다.
감사! 모든 제안을 이해할 수있을 것이다!
해결법
-
==============================
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.당신이 가까운이 방법을 추정 얻을 수 있도록 카운트는, 큰 테이블에 대한 느린 :
당신이 가까운이 방법을 추정 얻을 수 있도록 카운트는, 큰 테이블에 대한 느린 :
SELECT reltuples::bigint AS estimate FROM pg_class WHERE relname='tableName';
과 매우 빠른 결과가 떠 있지만, 여전히 가까운 추정되지 않습니다.
-
==============================
3.제외 (희망 'ID가'이다) 인덱스 필드에 COUNT ()를 실행 - 차선책은 실제로 INSERT에 대한 트리거를 사용하여 일부 테이블의 행 수를 캐시하는 것입니다. 당연히, 대신 캐시를 확인 할 수 있습니다.
제외 (희망 'ID가'이다) 인덱스 필드에 COUNT ()를 실행 - 차선책은 실제로 INSERT에 대한 트리거를 사용하여 일부 테이블의 행 수를 캐시하는 것입니다. 당연히, 대신 캐시를 확인 할 수 있습니다.
근사 위해 당신은 (https://wiki.postgresql.org/wiki/Count_estimate에서)이 시도 할 수 있습니다 :
select reltuples from pg_class where relname='tablename';
-
==============================
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.당신은 시스템 테이블 "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.데이터베이스가 작은 경우, 당신은 제안 @ 마이크 - 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)
from https://stackoverflow.com/questions/14570488/how-do-i-speed-up-counting-rows-in-a-postgresql-table by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] JPA 기본 쿼리를 선택하고 캐스트 객체 (0) | 2020.06.04 |
---|---|
[SQL] 모든 열은 'X'가 들어 SQL 서버 SELECT (0) | 2020.06.04 |
[SQL] 삽입 등) (최대 + 1 문제 설정치 (0) | 2020.06.04 |
[SQL] JDBC 더비 드라이버를 찾을 수 없습니다 (0) | 2020.06.04 |
[SQL] Yii2와 액티브를 사용하여 실제 SQL 쿼리를 로그? (0) | 2020.06.04 |