Tôi có một bảng với 7,2 triệu tuple trông như thế này:
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)
Bây giờ tôi muốn chọn một số giá trị nhưng truy vấn rất chậm:
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)
Các hash
cột là băm md5 của string
và có một chỉ mục. Vì vậy, tôi nghĩ rằng vấn đề của tôi là toàn bộ bảng được sắp xếp theo id chứ không phải theo hàm băm, vì vậy phải mất một thời gian để sắp xếp nó trước và sau đó nhóm lại?
Bảng nostring
chỉ chứa một danh sách các giá trị băm mà tôi không muốn có. Nhưng tôi cần cả hai bảng để có tất cả các giá trị. Vì vậy, nó không phải là một lựa chọn để xóa chúng.
thông tin bổ sung: không có cột nào có thể là null (đã sửa trong định nghĩa bảng) và tôi đang sử dụng postgresql 9.2.
NULL
giá trị trong cột làmethod
gì? Có trùng lặp trênstring
?