AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Vorhandensein eines Records prüfen
Thema durchsuchen
Ansicht
Themen-Optionen

Vorhandensein eines Records prüfen

Ein Thema von hoika · begonnen am 13. Jul 2017 · letzter Beitrag vom 14. Jul 2017
Antwort Antwort
Benutzerbild von RP12Biker
RP12Biker

Registriert seit: 19. Feb 2007
Ort: In der Lüneburger Heide
165 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: Vorhandensein eines Records prüfen

  Alt 13. Jul 2017, 08:37
Wenn ich das richtig verstanden habe, dann interessiert Dich nur, ob ein/mehrere Datensätze da sind oder die Tabelle noch leer ist. Korrekt?

Hätte dazu folgenden Hack in meinen Firebird-Bookmarks gefunden. Ist rasend schnell, setzt aber eingeschaltete Statistics und einen Primärindex voraus. Alles was 0 liefert wurde in den Statistics bisher noch nicht angefasst.

Quelle: http://www.firebirdfaq.org/faq5/

Wobei es nicht ausgeschlossen ist, dass die Datenbank-Engine solch Konstrukte vielleicht auch selbst intern nutzt

Code:
SELECT RDB$RELATIONS.RDB$RELATION_NAME,
       CASE
         WHEN RDB$INDICES.RDB$STATISTICS = 0 THEN 0
         ELSE CAST(1 / RDB$INDICES.RDB$STATISTICS AS INTEGER)
       END
  FROM RDB$RELATIONS
  LEFT JOIN RDB$RELATION_CONSTRAINTS
       ON RDB$RELATIONS.RDB$RELATION_NAME = RDB$RELATION_CONSTRAINTS.RDB$RELATION_NAME
       AND RDB$CONSTRAINT_TYPE = 'PRIMARY KEY'
  LEFT JOIN RDB$INDICES
       ON RDB$RELATION_CONSTRAINTS.RDB$INDEX_NAME = RDB$INDICES.RDB$INDEX_NAME
WHERE RDB$VIEW_BLR IS NULL AND RDB$RELATION_ID >= 128
AND  RDB$RELATIONS.RDB$RELATION_NAME = 'HIER DEN TABELLENNAMEN'
ORDER BY 1;
Carsten

Geändert von RP12Biker (13. Jul 2017 um 08:39 Uhr)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Vorhandensein eines Records prüfen

  Alt 13. Jul 2017, 08:43
Hallo,
setzt aber eingeschaltete Statistics und einen Primärindex voraus
Was sind denn ausgeschaltete Statistics?

Wobei es nicht ausgeschlossen ist, dass die Datenbank-Engine solch Konstrukte vielleicht auch selbst intern nutzt
Schon möglich

Wenn der Query-Plan der gleiche ist, dann kann das eine nicht schneller sein als das andere.
Doch, wenn ich ein Count(*) machen, muss er alle passenden Einträge zusammenzählen,
bei First 1 kann die Indexsuche nach dem ersten Treffer abbrechen.
Der Query-Plan ist aber trotzdem der gleiche.
Heiko

Geändert von hoika (13. Jul 2017 um 08:46 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von RP12Biker
RP12Biker

Registriert seit: 19. Feb 2007
Ort: In der Lüneburger Heide
165 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Vorhandensein eines Records prüfen

  Alt 13. Jul 2017, 08:48
OK. Etwas im Wort vergriffen, aktuelle/aktualisierte Statistics trifft es besser.

Kannst ja einfach mal mit dem SQL und einer vollen Tabelle testen, ob es noch ein Quentchen schneller ist als mit FIRST 1.
Carsten
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.375 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Vorhandensein eines Records prüfen

  Alt 13. Jul 2017, 08:49
Interessant ist es eigentlich nur für Abfragen auf Tabellen mit großen Datenmengen.
Bei leeren Datenmengen ist der Unterschied normalerweise zu vernachlässigen. Das dürfte sich in allen Fällen im Millisekunden-Bereich bewegen.

Ich habe mal alle drei Verfahren auf MS-SQL getestet. Die Tabelle enthält über 40 Mio Datensätze.

Select Count(*) ist indiskutabel (Testserver: 50 Sekunden. Live-Server knapp 3 Sekunden).

Die beiden anderen Varianten haben keinen messbaren Unterschied und befinden sich im einstelligen Millisekunden-Bereich.

Der Hack von DelphiBandit funktioniert nur bei eingeschalteter Statistik, wie er schon selbst geschrieben hat. Meines Wissens kann das Ergebnis trotzdem falsch sein, da die Statistics nicht permanent aktualisiert werden.
Peter

Geändert von Jasocul (13. Jul 2017 um 08:55 Uhr)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Vorhandensein eines Records prüfen

  Alt 13. Jul 2017, 09:57
Hallo,
Select Count(*) ist indiskutabel (Testserver: 50 Sekunden. Live-Server knapp 3 Sekunden).

Hier kommt es auch an, wie viel der Server zählen muss (=Anzahl der Ergebnisse).

Aber wir reden ja nicht von MS-SQL, sondern von einem richtigen DB-Server (Firebird)
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

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

AW: Vorhandensein eines Records prüfen

  Alt 13. Jul 2017, 10:09
wie wäre es mit
select distinct 1 from mytable where myid is not null ganz klar schneller als
Code:
select Count(*)
wobei die Zeiten von Jasocul ja wirklich jehnseits von gut und böse sind.

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

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Vorhandensein eines Records prüfen

  Alt 13. Jul 2017, 10:57
Hallo,
select distinct 1 from mytable where myid is not null ganz klar schneller als
Das liefert doch aber zurück, ob es überhaupt einen Eintrag in der Tabelle gibt.

Ich denke, dass First schneller als Distinct ist.
Das Distinct muss ja erst die Ergebnismenge ermitteln, um dann darauf Distinct auszuführen.

Bei der SELECT RDB$RELATIONS.RDB$RELATION_NAME Abfrage stellt sich für mich die Frage,
was passiert, wenn der letzte Eintrag meiner Ergebnismenge (where myid=X) gelöscht wird.
Ist die Statistik dann trotzdem korrekt, zeigt also keine Einträge an,
oder wird der gelöscht Eintrag immer nicht berücksichtigt?.

Any record that has had its primary key modified will appear twice if the old version has not been garbage collected and deleted records will continue in the count until they are garbage collected.
Das sieht hier eben so aus, als ob auch die Garbage-Einträge mit gezählt werden.
Heiko

Geändert von hoika (13. Jul 2017 um 10:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

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

AW: Vorhandensein eines Records prüfen

  Alt 13. Jul 2017, 15:21
Hallo,
select distinct 1 from mytable where myid is not null ganz klar schneller als
Das liefert doch aber zurück, ob es überhaupt einen Eintrag in der Tabelle gibt.
das wolltest du doch? oder hab ich da was mißverstanden?

Wenn Du aus einem (Delphi) Programm heraus diese Frage stellst, reicht es ja auch nur den ersten Datensatz abzuholen, und den evtl vorhandenen Rest vergißt Du einfach??

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

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Vorhandensein eines Records prüfen

  Alt 13. Jul 2017, 18:32
Hallo,
es geht darum, festzustellen,
ob es mindestens einen Record einer bestimmten Where-Klausel gibt.

Select First 1 From RechnungsId From RechnungsPosition Where RechnungsId=1
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort


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:34 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