나는 720 만 튜플이있는 테이블을 가지고 있습니다.
table public.methods
column | type | attributes
--------+-----------------------+----------------------------------------------------
id | integer | not null DEFAULT nextval('methodkey'::regclass)
hash | character varying(32) | not null
string | character varying | not null
method | character varying | not null
file | character varying | not null
type | character varying | not null
Indexes:
"methods_pkey" PRIMARY KEY, btree (id)
"methodhash" btree (hash)
이제 일부 값을 선택하고 싶지만 쿼리 속도가 매우 느립니다.
db=# explain
select hash, string, count(method)
from methods
where hash not in
(select hash from nostring)
group by hash, string
order by count(method) desc;
QUERY PLAN
----------------------------------------------------------------------------------------
Sort (cost=160245190041.10..160245190962.07 rows=368391 width=182)
Sort Key: (count(methods.method))
-> GroupAggregate (cost=160245017241.77..160245057764.73 rows=368391 width=182)
-> Sort (cost=160245017241.77..160245026451.53 rows=3683905 width=182)
Sort Key: methods.hash, methods.string
-> Seq Scan on methods (cost=0.00..160243305942.27 rows=3683905 width=182)
Filter: (NOT (SubPlan 1))
SubPlan 1
-> Materialize (cost=0.00..41071.54 rows=970636 width=33)
-> Seq Scan on nostring (cost=0.00..28634.36 rows=970636 width=33)
hash
컬럼의 MD5 해시 인 string
및 인덱스를 갖는다. 그래서 내 문제는 전체 테이블이 해시가 아닌 id로 정렬되어 있기 때문에 먼저 정렬 한 다음 그룹화하는 데 시간이 걸립니까?
이 테이블 nostring
에는 내가 원하지 않는 해시 목록 만 포함되어 있습니다. 그러나 모든 값을 가지려면 두 테이블이 모두 필요합니다. 따라서 삭제할 수있는 옵션이 아닙니다.
추가 정보 : 열 중 어느 것도 null (테이블 정의에서 수정되지 않음) 일 수 없으며 postgresql 9.2를 사용하고 있습니다.
NULL
열 값 의 백분율은method
얼마입니까? 에 중복이string
있습니까?