Mam tabelę z 7,2 milionami krotek, która wygląda następująco:
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)
Teraz chcę wybrać niektóre wartości, ale zapytanie jest niewiarygodnie wolne:
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
Kolumna MD5 z string
i ma indeks. Myślę więc, że moim problemem jest to, że cała tabela jest posortowana według identyfikatora, a nie według wartości skrótu, więc najpierw trzeba trochę posortować, a następnie pogrupować?
Tabela nostring
zawiera tylko listę skrótów, których nie chcę mieć. Ale potrzebuję obu tabel, aby mieć wszystkie wartości. Nie ma więc możliwości ich usunięcia.
dodatkowe informacje: żadna z kolumn nie może mieć wartości null (naprawiono to w definicji tabeli) i używam postgresql 9.2.
NULL
wartości w kolumniemethod
? Czy są duplikatystring
?