AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Abfrage: Ist Datensatz bereits vorhanden?
Thema durchsuchen
Ansicht
Themen-Optionen

Abfrage: Ist Datensatz bereits vorhanden?

Ein Thema von BenneX · begonnen am 20. Jul 2014 · letzter Beitrag vom 23. Jul 2014
 
Dejan Vu
(Gast)

n/a Beiträge
 
#19

AW: Abfrage: Ist Datensatz bereits vorhanden?

  Alt 20. Jul 2014, 14:26
Doch, ist es: Wenn er durch seine Where-Klausel die Datenmenge bereits stark eingeschränkt hat, muß er eben nicht die ganze Tabelle durchsuchen, um die Anzahl der zurückgelieferten Datensätze zu zählen:
Überlege einfach nochmal: Natürlich muss 'er' das, denn um zu wissen, ob Name='Mustermann' ist, muss er die ganze Tabelle durchscannen (oder eben über einen Index-Seek). Und nach dem ersten Treffer könnte es ja noch einen zweiten geben. Beim Index ist das nicht ganz so tragisch, aber im Extremfall sind es 1 Quatrillion 'Mustermann'-Einträge. Und da kann man sich dann schon vorstellen, das das etwas länger dauert, ne wahr?

Also nochmal: Wir müssen natürlich den Worst-Case betrachten und der lautet: Auf der Spalte ist kein Index und 'Mustermann' ist der letzte Record. Daraus folgt: Table-Scan bis zum bitteren Ende. Oder es ist überhaupt kein 'Mustermann' vorhanden, und auch daraus folgt: Table-Scan bis zum letzten Datensatz.

Nehmen wir an, wir hätten einen Index. Dann muss bei einem Treffer trotzdem weitergezählt werden, was überflüssig ist, denn wir wollen ja nur wissen, ob es einen Eintrag gibt, und nicht wie viele.

In *jedem* Fall ist 'EXISTS' schneller oder gleich schnell wie 'COUNT'. Gleich schnell ist es nur in dem Fall, wo kein Treffer vorliegt.

Wenn Du die Anzahl wissen willst, führt naturgemäß kein Weg an einem COUNT vorbei, das ist ja irgendwie logisch. Hier wird doch aber nur verlangt, ob es einen entsprechenden Datensatz überhaupt gibt.

Eine Stored Procedure ist bei dem Verfahren und anderen kein Allheilmittel,
Na ja doch: Ob nun ein 'REPLACE OR INSERT' aufgerufen wird oder ein Einzeiler ist performancetechnisch ein und dieselbe Soße (über Nanosekunden wollen wir uns nicht streiten)
Code:
if EXISTS (select * from Tabelle where ID=:ID)
  update Tabelle..
else
  insert into Tabelle
Ich kann auch das ganze IF-Statement zum Server schicken (wenn der das denn kann). In jedem Fall (SQLite oder nicht) ist es immer besser, die Daten-hin-und-her-schickerei zwischen Server und Client zu minimieren und vor allen Dingen kein COUNT anstelle von EXISTS zu verwenden.

Geändert von Dejan Vu (20. Jul 2014 um 14:30 Uhr)
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:09 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