Saya punya meja dengan 7,2 juta tupel yang terlihat seperti ini:
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)
Sekarang saya ingin memilih beberapa nilai tetapi permintaannya sangat lambat:
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)
The hash
kolom adalah hash md5 dari string
dan memiliki indeks. Jadi saya pikir masalah saya adalah bahwa seluruh tabel diurutkan berdasarkan id dan bukan oleh hash, jadi butuh beberapa saat untuk mengurutkannya terlebih dahulu lalu mengelompokkannya?
Tabel nostring
hanya berisi daftar hash yang tidak ingin saya miliki. Tapi saya butuh kedua tabel untuk memiliki semua nilai. Jadi ini bukan opsi untuk menghapus ini.
info tambahan: tidak ada kolom yang bisa nol (perbaiki dalam definisi tabel) dan saya menggunakan postgresql 9.2.
NULL
nilai dalam kolommethod
? Apakah ada duplikat aktifstring
?