AW: Abfrage: Ist Datensatz bereits vorhanden?
Zitat:
Zitat:
|
AW: Abfrage: Ist Datensatz bereits vorhanden?
Zitat:
Ob Sql-Light Count kennt, weiß ich nicht. Jedoch überprüfe ich meine Tabellen so:
Code:
Das liefert mir direkt die Anzahl der Records, in denen der Name "Mustermann" lautet.
select count(NAME) from KUNDEN where NAME = 'Mustermann';
|
AW: Abfrage: Ist Datensatz bereits vorhanden?
Wie soll denn der Datenbankserver die Anzahl der Datensätze ermitteln, ohne die Tabelle bzw. den Index komplett zu durchlaufen?
|
AW: Abfrage: Ist Datensatz bereits vorhanden?
Bei Verwendung des SQL-Befehls Count muß er das gewiß. Zählt man jedoch die Anzahl der zurückgelieferten Datensätze (MyQuery.RecordCount) muß er das nicht, falls das betreffende Feld (Name) indiziert ist. Die zurückgelieferte Datenmenge, die nun gezählt wird, ist zudem bereits reduziert – falls nicht alle Kunden "Mustermann" heißen.
|
AW: Abfrage: Ist Datensatz bereits vorhanden?
Zitat:
Ich würde bei größeren DBMS dann doch lieber eine Stored Procedure schreiben. |
AW: Abfrage: Ist Datensatz bereits vorhanden?
Was bedeutet wohl mehr Last für den "Server"?
Lokal eine Datensatzanzahl zu bestimmen oder eine Datensatzmenge an den Client zu schicken, der diese dann "zählt"? Wir können sicher festhalten, dass die Frage nach Anzahl oder bloßer Existenz von Datensätzen, die bestimmten Kriterien entsprechen, die unaufwändigste ist. Der Aufwand "beschränkt" sich hier auf die vollständige "Findung" relevanter Datensätze oder im 2. Fall auf die "Findung" eines einzigen Datensatzes. Die zugehörigen Daten dann an den Client zu übertragen, der sie als Query angefragt hat, ist in jedem Fall ein Zusatzaufwand, der die Sache nicht schneller oder schonender macht. Wie sich das unter SQlite verhält, wo "Server" und "Client" identisch sind, sei mal dahin gestellt. Eine Stored Procedure ist bei dem Verfahren und anderen kein Allheilmittel, sie hilft nur, Datenübertragung zwischen Server und Client zu sparen. Konkret macht das bei einem "Select count(*)" oder einer SP, die das gleiche abruft und als Parameter zurückgibt keinen Unterschied. |
AW: Abfrage: Ist Datensatz bereits vorhanden?
Zitat:
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. Zitat:
Code:
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.
if EXISTS (select * from Tabelle where ID=:ID)
update Tabelle.. else insert into Tabelle |
AW: Abfrage: Ist Datensatz bereits vorhanden?
Zitat:
|
AW: Abfrage: Ist Datensatz bereits vorhanden?
Zitat:
Auch bei einem Count(*) verwendet der Server genauso die Indize wie beim Stupiden "Select * from" mit Zählen beim Client. Zusätzlich muss er auch noch die eigentlichen Datensätze aus der Tabelle auslesen, die Daten für den Transport über Netzwerk und Co. aufbauen und abschicken. Beim Count(*) braucht er wenn er den Passenden Index hat überhaupt nicht in die eigentliche Tabelle schauen bzw. diese Auslesen. |
AW: Abfrage: Ist Datensatz bereits vorhanden?
Zitat:
http://de.wikipedia.org/wiki/Auswertungsplan |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz