Tengo una tabla con 7.2 millones de tuplas que se ve así:
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)
Ahora quiero seleccionar algunos valores, pero la consulta es increíblemente lenta:
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)
La hash
columna es el hash de md5 string
y tiene un índice. Entonces, creo que mi problema es que toda la tabla está ordenada por id y no por hash, por lo que lleva un tiempo ordenarla primero y luego agruparla.
La tabla nostring
contiene solo una lista de hashes que no quiero tener. Pero necesito que ambas tablas tengan todos los valores. Por lo tanto, no es una opción eliminarlos.
información adicional: ninguna de las columnas puede ser nula (fijada en la definición de la tabla) y estoy usando postgresql 9.2.
NULL
valores en la columnamethod
? ¿Hay duplicados enstring
?