![]() |
AW: FB 3.0 Update mit where exists durchläuft alle Record der upd tbl.
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. |
AW: FB 3.0 Update mit where exists durchläuft alle Record der upd tbl.
Ich verwende sehr intensiv Exists weil ich mal gelesen habe "WHERE Feldname in (select ..." sollte eher durch Exists ersetzen. Ich habe mir um die Performance keine Gedanken gemacht. Ich habe zufällig nie größere Datenmenge zu verarbeiten und deshalb ist es nicht aufgefallen. Execute Block verwende ich liebend gern. Ist für mich überhaupt kein Problem. Und wenn ich irgendwann mal auf D12 umsteige (hatte noch keine Zeit) dann ist zukünftig eh kein Problem im Code da ab D12 Das SQL in einem Block im Code abgelegt werden kann durch dreifache Anführungszeichen.
Mit MERGE habe ich einiges experimentiert und nicht wirklich einen Einsatzfall gesehen. Alle meine Versuche hatten nahezu den gleichen Performance. Aber vermutlich gibt es einen Fall bei dem MERGE Sinnvoll sein kann. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz