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
Antwort Antwort
Seite 3 von 4     123 4      
Dejan Vu
(Gast)

n/a Beiträge
 
#21

AW: Abfrage: Ist Datensatz bereits vorhanden?

  Alt 20. Jul 2014, 19:26
Wie soll denn der Datenbankserver die Anzahl der Datensätze ermitteln, ohne die Tabelle bzw. den Index komplett zu durchlaufen?
Bei Verwendung des SQL-Befehls Count muß er das gewiß.
Natürlich nicht.
Nehmen wir ein stinknormales RDBMS. Tabellen und B-Tree Index (ist am gebräuchlichsten).
Dann haben wir 3 Fälle, wie ein 'COUNT(*) WHERE field = :foo' ermittelt wird.
  1. Index auf 'field' vorhanden. Die Einträge sind sortiert vorhanden im Index. Das RDBMS findet den 1.Eintrag der WHERE - Bedingung. Da es sich um eine Äquivalenz ('=') handelt, zählt man einfach die Einträge 'rechts' vom gefundenen Eintrag, die gleich sind ('Index-Seek').
  2. Anderer Index vorhanden, der 'field' enthält. Das RDBMS liest den Index ein, was wesentlich schneller geht und rennt sequentiell durch, um alle Records mit der Bedingung zu finden. ('Index Scan').
  3. Kein Index vorhanden. Das RDBMS muss die gesamte Tabelle durchlaufen ('Table Scan').
In jedem der drei Fälle gibt es noch Optimierungsmöglichkeiten, je nach Feld- und Indegröße sowie WHERE-Bedingung. Ist die Tabelle sehr klein, kann ein Table-Scan schneller sein, als eine Index-Suche, das entscheidet der Optimizer. mySQL kennt andere Indexstrukturen, die sich sicherlich für den einen oder anderen Fall besser eignen, aber im Groben wird selbst SQLite das so handhaben, wie beschrieben. Das ist ja banale Algorithmik.
  Mit Zitat antworten Zitat
BenneX

Registriert seit: 9. Jul 2014
21 Beiträge
 
#22

AW: Abfrage: Ist Datensatz bereits vorhanden?

  Alt 20. Jul 2014, 23:27
Hallo Leute! Danke für die vielen Antworten INSERT OR REPLACE war genau was ich gesucht habe!

Könnt Ihr mir noch verraten wie ich nun die Ergebnisse einer SELECT abfrage als GRID auf meinem Formular anzeigen lassen kann? Finde dazu leider keine weiteren Informationen ...

Grüße,
BenneX!

Geändert von BenneX (20. Jul 2014 um 23:35 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#23

AW: Abfrage: Ist Datensatz bereits vorhanden?

  Alt 21. Jul 2014, 00:51
Ist eigenlich ganz simpel:
Code:
DataSet -> DataSource -> DBGrid
Delphi-Referenz durchsuchenTDataSource.DataSet und Delphi-Referenz durchsuchenTDbGrid.DataSource
Das DataSet ist natürlich deine Query-Komponente mit der Abfrage
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#24

AW: Abfrage: Ist Datensatz bereits vorhanden?

  Alt 21. Jul 2014, 07:40
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)
Bitte? Was nun? Kein Allheilmittel oder doch und dann je nachdem das gleiche Argument?
Schneller gedacht, als getippt?

Ich schreibs nochmal:
Eine SP ist per se nicht schneller als ein einzelnes SQL Statement, besonders dann, wenn die SP nur wirklich das SQL Statment kapselt.
Daher spare <Ich> mir gern den Impact, ein SP statisch zu erstellen, wenn ich das gleich mit einem Select erreiche.
Warum ist eine SP häufig schneller? Weil sie Traffic zwischen Client und Server spart oder auch Techniken einsetzen kann, die mit reinem SQL nicht funktionieren.
Natürlich gibt es noch ein halbes dutzend andere Gründe, SP zu nutzen..
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#25

AW: Abfrage: Ist Datensatz bereits vorhanden?

  Alt 21. Jul 2014, 10:17
..oder auch Techniken einsetzen kann, die mit reinem SQL nicht funktionieren.
Jetzt werden sie wieder wach, die Erbsenzähler.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#26

AW: Abfrage: Ist Datensatz bereits vorhanden?

  Alt 21. Jul 2014, 10:45
Ach so, klar. Da habe ich dich missverstanden.

Ich verwende SP, um Datenbanklogik zu kapseln. z.B. hat nicht jedes RDBMS den REPLACE/INSERT Befehl. In einem anderen Fall haben wir den Zugriff auf eine Legacy-DB mit SP und Views abstrahiert, dann die neue Applikation gebaut und anschließend sukkezzive die DB ausgetauscht. Dank Abstraktionslayer (SP/View) kein Problem.

Aber das ist ein gaaanz anderes Thema und diesmal keine Erbsenzählerei.
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#27

AW: Abfrage: Ist Datensatz bereits vorhanden?

  Alt 21. Jul 2014, 10:53
OT
@K-H: Meinst Du mich? Ein Fedehandschuh?

Ich fand lediglich die "Formulierung" von dejan vu etwas wirr. Und da immer gern mal propagiert wird, dass eine SP eben schneller ist (egal ob es passt oder nicht) und also am besten usw., musste ich da mal nachhaken.

Genaugenommen ist es hier im Thread nicht mal Erbsenzählerei, sondern eher Bohnen (server) oder so, wo es um Erbsen (sqlite) geht.

Also, wer Äpfel mit Birnen vergleicht oder Bohnen mit Erbsen, macht wahrscheinlich einen riesen Fehler.
Interessiert die meisten nicht die Bohne, also danke für Deine Aufmerksamkeit!
/OT
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#28

AW: Abfrage: Ist Datensatz bereits vorhanden?

  Alt 21. Jul 2014, 11:20
@Jobo
Ich meinte das reine SQL.

Die meisten Behauptungen, die hier aufgestellt wurden, kann ich leider nicht mehr nachvollziehen. Ein count(*) ist nach meiner Erfahrung immer noch der schnellste Weg zu sehen ob etwas da ist oder nicht.

In den Anfangszeiten des MS-SQL-Servers waren diese Diskussionen allerdings noch notwendig, ich hatte angenommen, daß die Zeiten der Abfragen mit Optimierungshinweisen, der täglichen Indexpflege und der richtigen Join-Reihenfolge in der Zwischenzeit vorbei sind. So kann man sich täuschen.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
BenneX

Registriert seit: 9. Jul 2014
21 Beiträge
 
#29

AW: Abfrage: Ist Datensatz bereits vorhanden?

  Alt 21. Jul 2014, 11:56
Ist eigenlich ganz simpel:
Code:
DataSet -> DataSource -> DBGrid
Delphi-Referenz durchsuchenTDataSource.DataSet und Delphi-Referenz durchsuchenTDbGrid.DataSource
Das DataSet ist natürlich deine Query-Komponente mit der Abfrage
Hallo Sir Rufo,

Danke für Deine Antwort.

Ich habe folgendes ausprobiert:
DBGrid1 auf meine Form gezogen
und mittels

markieren Delphi-Quellcode:
table := Datenbank.GetTable('SELECT * FROM OGame');
DBGrid1.DataSource := table;
table ist hierbei TSQLiteTable.

Leider kriege ich nur den Fehler: Inkompatible Typen TDataSource und TSQLiteTable.

Wo liegt mein Fehler?

Grüße!
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#30

AW: Abfrage: Ist Datensatz bereits vorhanden?

  Alt 21. Jul 2014, 11:58
Das DBGrid mit einer TDatasource (das ist eine Komponente) verbinden und die Datasource mit einem TDataset (Deiner Tabelle).
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


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 00:30 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