hallo,
die folgende query läuft extremst langsam, d.h. nach 2 stunden habe ich das ganze abgebrochen ablaufen müsste das ganze in 1/2h bis 1h, ich weiß nicht wo genau der haken liegt.
ich habe folgende tables:
PERSON (id, costumer_number,…)
PERMISSION_XYZ(id 1:1 ref PERMISSION(ID), person ref PERSON(ID),…)
PERMISSION(id, flag,…)
TEMP_TABLE(id, costumer_number, XYZ_flag, …);
indizes:
unique-constraint auf PERSON(costumer_number)
index auf PERMISSION_XYZ(person)
index auf TEMP_TABLE(costumer_number)
die tables enthalten zwischen 2 millionen und 10 millionen reihen. was ich versuche, ist ein batch-update der in PERMISSION enthaltenen flags vom TEMP_TABLE.
die query:
update PERMISSION
set permission_flag = tmp.post_flag
from PERMISSION_POST post, PERMISSION_TEMP tmp, PERSON pers
where post.id = PERMISSION.id
and post.person = pers.id
and pers.costumer_number = costumer_number;
hier auch ein explain der query:
"Hash Join (cost=626966.65..1130850.79 rows=2107422 width=22)"
" Hash Cond: ((pers.costumer_number)::text = (tmp.costumer_number)::text)"
" -> Hash Join (cost=548438.67..973084.93 rows=2107422 width=29)"
" Hash Cond: (permission.id = post.id)"
" -> Seq Scan on permission (cost=0.00..184169.88 rows=10773488 width=18)"
" -> Hash (cost=509746.90..509746.90 rows=2107422 width=19)"
" -> Merge Join (cost=379210.79..509746.90 rows=2107422 width=19)"
" Merge Cond: (pers.id = post.person)"
" -> Index Scan using person_pkey on person pers (cost=0.00..93956.39 rows=2136130 width=15)"
" -> Sort (cost=379210.79..384479.35 rows=2107422 width=16)"
" Sort Key: post.person"
" -> Seq Scan on permission_post post (cost=0.00..38997.22 rows=2107422 width=16)"
" -> Hash (cost=40311.99..40311.99 rows=2138399 width=15)"
" -> Seq Scan on permission_temp tmp (cost=0.00..40311.99 rows=2138399 width=15)"
bin kein profi. was ich hier nicht verstehe ist warum postgres seq-scans macht obwohl doch indexe für die relevanten spalten zur verfügung stehen
vlt kann jemand von euch ein mögliches problem ausmachen thx!
ps: ich weiß ich könnte das ganze noch mit eine where-clausel “and tmp.post <> per.permisison_flag” verfeinern, aber das macht auch nicht den riesigen unterschied, da ich doch mit vielen änderungen rechne…