Ich habe eine Tabelle mit 7,2 Millionen Tupeln, die so aussieht:
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)
Jetzt möchte ich einige Werte auswählen, aber die Abfrage ist unglaublich langsam:
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)
Die hash
Spalte ist der MD5-Hash von string
und hat einen Index. Mein Problem ist also, dass die gesamte Tabelle nach ID und nicht nach Hash sortiert ist. Es dauert also eine Weile, sie zuerst zu sortieren und dann zu gruppieren.
Die Tabelle nostring
enthält nur eine Liste von Hashes, die ich nicht haben möchte. Aber ich brauche beide Tabellen, um alle Werte zu haben. Es ist also keine Option, diese zu löschen.
Zusätzliche Informationen: Keine der Spalten darf null sein (wie in der Tabellendefinition festgelegt) und ich verwende postgresql 9.2.
NULL
Werte in der Spaltemethod
? Gibt es Duplikate aufstring
?