Query plan als code formatiert um ihn lesbar zu machen

Es scheint das benutzen eines array member ein sequentiele scan auslösst, aber wann die gemacht werd mit ein varchar, dann auf einen mal index scan. Die ziel tabelle hat ungefähr 10 millionen reien.

Hier die plans, mann sieht das der erste query ungeheur lang dauern werd (und dauert…), der 2e viel schneller sein werd:

BAG=# explain update dataland set bagpandid=(select pandid from vbo_actueel where vboids[0]=identificatie) where bagpandid is null;
                                             QUERY PLAN
----------------------------------------------------------------------------------------------------
 Update on dataland  (cost=22113.20..471395813338.50 rows=676805 width=170)
   ->  Bitmap Heap Scan on dataland  (cost=22113.20..471395813338.50 rows=676805 width=170)
         Recheck Cond: (bagpandid IS NULL)
         ->  Bitmap Index Scan on dataland_bagpandid_idx  (cost=0.00..21944.00 rows=676805 width=0)
               Index Cond: (bagpandid IS NULL)
         SubPlan 1
           ->  **Seq Scan** on vbo_actueel  (cost=0.00..696500.91 rows=1 width=17)
                 Filter: ((dataland.vboids)[0] = (identificatie)::bpchar)
(8 rows)

BAG=# explain update dataland set bagpandid=(select pandid from vbo_actueel where bagpandid=identificatie) where bagpandid is null;
                                              QUERY PLAN
-------------------------------------------------------------------------------------------------------
 Update on dataland  (cost=22113.20..2393079.83 rows=676805 width=170)
   ->  Bitmap Heap Scan on dataland  (cost=22113.20..2393079.83 rows=676805 width=170)
         Recheck Cond: (bagpandid IS NULL)
         ->  Bitmap Index Scan on dataland_bagpandid_idx  (cost=0.00..21944.00 rows=676805 width=0)
               Index Cond: (bagpandid IS NULL)
         SubPlan 1
           ->  **Index Scan** using pk_vbo_identificatie on vbo_actueel  (cost=0.56..2.78 rows=1 width=17)
                 Index Cond: ((dataland.bagpandid)::text = (identificatie)::text)

Der 2e query ist nur beispiel, kan nicht so richtig gemacht werden.
Ich hoffe zu verstehen was die Ursache ist…
(und endschuldige meine fehlerhafte deutsche sprache…)
Danke, Jan

Ich glaube es gefunden zu haben.
Es ist ein unterschied in typen varchar (oder varchar[]) und character(16) (character(16)[]).
Die sind viel weniger kompatibel als ich dachte.
Nach umsetzung (dauert ziemlich, muss eine komplette conversion gemacht haben) erscheint das erwartete plan auch wenn ein array mittglied genutzt werd.
Und ich sollte vboids[1] genutzt haben…
Also, etwas gelernt.

Dazu müßte man mehr wissen. Um in ARRAY’s zu suchen bieten sich GIN oder GiST - Indexe an.

Die such-term ist ein array member, also braucht selbst nicht gesucht zu werden.
Aber danke für ihnen hinweis auf gin und gist. Ich verwende gist für geometrie und gin für arrays.
Arrays, weil nicht normiert, benütze ich meistens wenn subqueries mehrere resultaten producieren können und ich ‘limit 1’ nicht geeignet finde.

Dieses Thema wurde automatisch 60 Tage nach der letzten Antwort geschlossen. Es sind keine neuen Nachrichten mehr erlaubt.