Seite 1 von 1

Postgresql Abfrage anzahl Datensätze

Verfasst: Mi, 28. Feb 2018 13:33
von ramses
Hallo

ich möchte die Anzahl Datensätze die sich in einer Tabelle befinden abfragen.

Der Befehl:

Code: Alles auswählen

select count(*) from tabellen_name; 
liefert die die korrekte Anzahl Datensätze, benötigt dazu jedoch 8-10 MInuten.

Kennt jemand eine schnellere Lösung / Befehl?

Gruss Carlo

Re: Postgresql Abfrage anzahl Datensätze

Verfasst: Mi, 28. Feb 2018 13:51
von brandelh
Die Anzahl ohne Suchbegriff sollte doch sehr schnell verfügbar sein, greifst du über Alaska DBE zu oder über SQLexpress ?

Wie schnell ist es über das Systemtool der Datenbank ?

Re: Postgresql Abfrage anzahl Datensätze

Verfasst: Mi, 28. Feb 2018 14:06
von ramses
Hallo Hubert

ich verwende Natives-Sql also über Aufrufe der libpq.dll.
Die Alaska-DBE funktioniert nicht korrekt und SQLexpress habe ich nicht.
Postgresql Server ist Version 10.1_1

Das Systemtool der Datenbank pgAdmin4 v.2.1 benötigt auch die selbe Zeit 8-10 Minuten.

Gruss Carlo

Re: Postgresql Abfrage anzahl Datensätze

Verfasst: Mi, 28. Feb 2018 14:13
von brandelh
Sind die Daten komplex verknüpft oder sind es nur so viele ... aber wenn das Systemtool die gleiche Zeit braucht, liegt es nicht an Xbase++

Re: Postgresql Abfrage anzahl Datensätze

Verfasst: Mi, 28. Feb 2018 14:14
von Martin Altmann
Carlo,
gibt es eine "Spalte" mit einem Primärschlüssel? Die also für jeden Satz einen Eintrag enthält?
Wie lange dauert es, wenn du den Namen dieser "Spalte" statt des * verwendest?

Viele Grüße,
Martin

Re: Postgresql Abfrage anzahl Datensätze

Verfasst: Mi, 28. Feb 2018 14:16
von Tom
Mmh. 170.000 Datensätze, eine mit dem Upsize-Tool erzeugte Tabelle. In PgAdmin 3 Sekunden, im Code fast genau der gleiche Wert. Übrigens bei USE <table>, DbGoBottom() und ? RecNo() nur eine Sekunde.

Re: Postgresql Abfrage anzahl Datensätze

Verfasst: Mi, 28. Feb 2018 14:23
von ramses
Hallo Hubert

es ist eine einfache Tabelle mit einigen Feldern und 2 Indexdateien ohne jede Verknüpfung.

An xbase++ liegt es sicher nicht, ich verwende die DBE ja nicht.

Ich suche eine schnellere Variante der Abfrage "Anzahl Datensätze resp. Count(*) ".

Gruss Carlo

Re: Postgresql Abfrage anzahl Datensätze

Verfasst: Mi, 28. Feb 2018 14:29
von Martin Altmann
Carlo,
wenn Du eine schnellere Variante suchst, findest Du ein wenig mittels Google:
https://stackoverflow.com/questions/794 ... postgresql
Die Antworten sind recht interessant!

Viele Grüße,
Martin

Re: Postgresql Abfrage anzahl Datensätze

Verfasst: Mi, 28. Feb 2018 14:58
von ramses
Danke für eure Antworten.

@Martin, ja die gibt es es dauert dann etwa 4-6 MInuten, die Antworten aus Google die du ansprichst habe ich schon versucht, deren Ergebnisse sind schnell unter 1/100 Sek. liegen aber jeweils um mehrere Mio. Datensätze daneben.

@Tom das USE über die Postgres-DBE auf eine viel kleinere als die aktuelle Tabelle dauerte schon ca. 30 Sekunden. Dann war auch das Upsize Tool nicht kompatibel zur damaligen aktuellen Postgres-Version und die Doku für die Alaska Postgres-Funktionen fehlte oder war unvollständig. Deshalb verwende ich jetzt natives Postgres. Schade eigentlich.

Gruss Carlo

Re: Postgresql Abfrage anzahl Datensätze

Verfasst: Mi, 28. Feb 2018 21:33
von AUGE_OHR
ramses hat geschrieben: Mi, 28. Feb 2018 13:33 ich möchte die Anzahl Datensätze die sich in einer Tabelle befinden abfragen.
Kennt jemand eine schnellere Lösung / Befehl?
hast du ein Field __RECORD in deiner Table ?

Code: Alles auswählen

Query : SELECT * FROM fsicher___record_seq
Table have 10 Property 0.06 Sec.

sequence_name : fsicher___record_seq
last_value : 548329
start_value : 1
increment_by : 1
max_value : 9223372036854775807
min_value : 1
cache_value : 1
log_cnt : 0
is_cycled : f
is_called : t

Table have 548329 entry

Re: Postgresql Abfrage anzahl Datensätze

Verfasst: Mi, 28. Feb 2018 22:34
von ramses
Hallo Jimmy

nein ein Feld __record habe ich nicht. Die Tabellen wurden alle OHNE das upsize Tool auf "normale" Art erstellt. Ich habe in allen Tabellen ein Feld "id" des Typs "serial"
Die zuletzt verwendete Nummer lässt sich dann auch abfragen.

Code: Alles auswählen

Query: select * from tabellenname_id_seq;
Ergebnis nach 41ms  
last_value  xxxxxxxxxxx
Der Wert last_value zeigt dann einfach die letzte verwendet Nummer des Datensatzzählers der Tabelle. Dieser liegt auch um Mio. daneben da es nur ein fortlaufender Zähler ist der bei jedem "insert" einfach erhöht wird ..... und keinen Bezug zu den aktuell noch vorhandenen Datensätze hat ...

Ich habe nun noch alle Ports geupdatet und nun die Postgesql Version 10.2 im Einsatz, auch mit der ist es aber nicht besser.

Gruss Carlo

Re: Postgresql Abfrage anzahl Datensätze

Verfasst: Mi, 28. Feb 2018 23:43
von AUGE_OHR
ramses hat geschrieben: Mi, 28. Feb 2018 22:34Dieser liegt auch um Mio. daneben da es nur ein fortlaufender Zähler ist der bei jedem "insert" einfach erhöht wird
JA ... aber im welchen Verhältnis liegt der Wert und wofür willst du die "genaue" Anzahl :?:
ich verwenden die Anzahl z.b. für einen Progressbar und der kann nur +- 1% anzeigen

"Lücken" beim hoch zählen von SERIAL kommen doch nur durch "löschen" ... das mag ich schon bei DBF nicht [-X
neben __RECORD habe ich auch das Field __DELETED was mir reicht um einen gelöschten Satz zu erkennen.
damit gibt es bei mir keine "Lücken" und die Abfrage auf ein SERIAL Field ist dann "genau"

Re: Postgresql Abfrage anzahl Datensätze

Verfasst: Do, 01. Mär 2018 7:16
von brandelh
Wir sollten mal klären, wie groß die Datenbank tatsächlich ist, wenn das Ergebnis um Millionen Datensätze daneben liegt ;-)

Bei MySQL gibt es Metadaten in extra Tabellen, ob diese Info dort stünde weiß ich auch nicht, aber wenn wäre das der richtige Weg.

Re: Postgresql Abfrage anzahl Datensätze

Verfasst: Do, 01. Mär 2018 8:11
von ramses
Guten Morgen zusammen
wofür willst du die "genaue" Anzahl
Als "Inventarwert" wieviele Datensaätze sind vorhanden.
Field __DELETED was mir reicht um einen gelöschten Satz zu erkennen
Damit markierts du einen Satz als gelöscht ohne den Satz wirklich aus der Datenbank zu entfernen. Die Serial zeigt dann auch nicht den "Bestand der gültigen" Datensätze sondern wie bei mir den Wert "Angelegte Sätze seit Beginn" den niemand wirklich interessiert.
Wir sollten mal klären, wie groß die Datenbank tatsächlich ist, wenn das Ergebnis um Millionen Datensätze daneben liegt
Diese Tabelle belegt ca. 350 GB mit ca. 500 Mio Datensätzen.

Gruss Carlo

Re: Postgresql Abfrage anzahl Datensätze

Verfasst: Do, 01. Mär 2018 9:15
von brandelh
Ja das sind Datenmengen ... wenn es um die Statistik geht, würde ich da morgens früh eine Abfrage starten und den Tag mit dem richtigen Wert beginnen ...
ansonsten diesen zurückliefern, bei normaler Eingabe sind die paar hundert dann sicher nicht von Belang, beim Import größerer Datenmengen müsste der Wert neu berechnet werden.

Re: Postgresql Abfrage anzahl Datensätze

Verfasst: Do, 01. Mär 2018 9:28
von AUGE_OHR
ich verstehe nicht wie "last_value" bei dir "so" daneben liegen soll ... :shock:

was COUNT(*) angeht :
PDF v9.1 Seite 300

Note: Users accustomed to working with other SQL database management systems might be
disappointed by the performance of the count aggregate when it is applied to the entire table. A
query like:

Code: Alles auswählen

SELECT count(*) FROM sometable;
will be executed by PostgreSQL using a sequential scan of the entire table.
unabhängig von den 10min ist das COUNT(*) ja wohl nicht alles was du machst.
wie lange dauert denn die ganze Arbeit wenn du dich durch 500 Mio Datensätzen durch arbeitest :?:

Re: Postgresql Abfrage anzahl Datensätze

Verfasst: Do, 01. Mär 2018 9:45
von brandelh
Na wenn die Anzahl gelöschter Datensätze hoch ist, ist auch die Abweichung groß ...

Re: Postgresql Abfrage anzahl Datensätze

Verfasst: Do, 01. Mär 2018 10:32
von ramses
Hi
wie lange dauert denn die ganze Arbeit wenn du dich durch 500 Mio Datensätzen durch arbeitest
ein

Code: Alles auswählen

select * from tebellenname where mw1 >= 20000 and mw1 <= 30000;
(entspricht einem "set filter to mw1 >= 20000 .and. mw1 <= 30000" auf eine DBF in xbase)
dauert 97ms und liefert 2034 Datensätze (zu einer Zeit in der die Datenbank eine Belastung von 10'000-15'000 BlockI/O Sek. bewältigt)

Nachtrag: "Durcharbeiten" -> Eine Auswertung durch alle Sätze dauert auf einem Rechner einige Tage oder als Teilaufgaben auf mehrere Rechner aufgeteilt etwas kürzer.

Ja die Anzahl gelöschter Sätze wird täglich grösser und Postgres bereinigt den Platz zum Glück ohne weiteres zutun wie Pack usw.

Gruss Carlo