ฉันมีตารางที่มี 7.2 ล้านสิ่งอันดับซึ่งมีลักษณะดังนี้:
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)
ตอนนี้ฉันต้องการเลือกค่าบางอย่าง แต่แบบสอบถามช้าอย่างไม่น่าเชื่อ:
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
คอลัมน์กัญชา md5 ของstring
และมีดัชนี ดังนั้นฉันคิดว่าปัญหาของฉันคือตารางทั้งหมดเรียงลำดับตาม id ไม่ใช่แฮชดังนั้นจึงใช้เวลาสักครู่ในการจัดเรียงก่อนแล้วจึงจัดกลุ่ม
ตารางnostring
นี้มีรายการแฮชที่ฉันไม่ต้องการเท่านั้น แต่ฉันต้องการทั้งสองตารางเพื่อให้มีค่าทั้งหมด ดังนั้นจึงไม่มีตัวเลือกให้ลบสิ่งเหล่านี้
ข้อมูลเพิ่มเติม: ไม่มีคอลัมน์ใดที่สามารถเป็นโมฆะ (แก้ไขได้ในคำจำกัดความของตาราง) และฉันใช้ postgresql 9.2
NULL
ค่าในคอลัมน์method
คืออะไร? มีการทำซ้ำstring
หรือไม่