Einzelnen Beitrag anzeigen

Benutzerbild von IBExpert
IBExpert

Registriert seit: 15. Mär 2005
672 Beiträge
 
FreePascal / Lazarus
 
#21

AW: FB 3.0 Update mit where exists durchläuft alle Record der upd tbl.

  Alt 16. Jun 2024, 16:35
bei mir braucht der merge in deiner db (nach set statistics auf allen tabellen)
16ms und auch nur je ein indexed read pro tabelle, hab mich zwar bisher mit merge noch nicht wirklich
angefreundet und mache dann lieber gleich execute blocks, aber technisch ist deine aussage mit den sqls
scheinbar korrekt.

wenn es immer nur eine record aus der unterdatenmenge gibt würde auch so was gehen (= operator vor der klammer)
update adressen a
set a.aktiv = 1
where a.adresseid =(select rec.adresseid
from rechnungen rec
where rec.rechnungsnr =530
)
braucht auch nur je 1 indexed read

bei mehreren records seh ich auch das problem für den optimierer, das der ja pro
adresse noch nicht wissen kann, ob es da eine rechnung gibt mit den kriterien, daher
klappert der alle ab. es könnte ja auch noch weitere bedingungen geben, die den dann
doch wieder ausschliessen.

ein wenig schneller wäre das hier (frag mich nicht warum, aber ich meine weil es eine
multirecord result menge im inneren select geben könnte wegen between)

update adressen a
set a.aktiv = 1
where exists(select rec.adresseid
from rechnungen rec
where rec.rechnungsnr between 530 and 530
)

der macht so nur 1 indexed read auf rechnung, aber weiterhin 1000 auf adresse

bei mir wäre das ergebnis ganz sicher dein execute block, ist zwar die ein oder andere zeile
quellcode mehr, aber einfach zu verstehen und auch in 5 jahren kapierst du den grund für den
code und die schachtelung noch.
Holger Klemt
www.ibexpert.com - IBExpert GmbH
Oldenburger Str 233 - 26203 Wardenburg - Germany
IBExpert and Firebird Power Workshops jederzeit auch als Firmenschulung
  Mit Zitat antworten Zitat