Größere Datenmengen zügig extrahieren

Kalusie

Benutzer
Beiträge
5
Hallo zusammen,

ich habe eine Tabelle (Spalten: ID, DateTime, SeatNumber, Description) in einer Datenbank mit circa 2,3 Mio Datensätze.

Nun möchte ich Daten extrahieren, die in einem Zeitraum von einem Monat liegen, sprich mit der WHERE-Bedingung BETWEEN.

Problem ist, dass die Extraktion mehrere Stunden dauert, da das Statement sicherlich über alle 2,3 Mio Datensätze geht.

In dieser Tabelle wurde vom Hersteller bereits ein non-Clustered Index auf die Spalte DateTime gesetzt.

Kann man das irgendwie "besser" beschleunigen?

Viele Grüße
Kali
 
Werbung:
Ich finde die Angaben nicht unbedingt plausibel. Ist die where datum between Bedingung das einzige Kriterium?
Die Tabelle ist sehr schmal und 2,3 Mio Datensätze nicht viel, eine einfache Where Bedingung wie beschrieben würde mit einem Single Fullscan erledigt sein, also dauert sie so lange, wie es braucht, alle Datensätze einmal durchzuprüfen, Minuten, nicht mehrere Stunden.
Der Effekt muss also woanders her rühren, als von der bloßen Abfrage, die grob geschildert wurde.
- wenig CPU (z.B. ein Kern), der auch mit vielen anderen Dingen bereits permanent ausgelastet ist
- schmale Bandbreite im LAN oder WAN
- komplexere Where Bedingung
- Kriterien, die nicht zu den vorhandenen Indices passen
- Attribute, die vom Typ her nicht zum gespeicherten Wert passen
 
Also 2,3 Millionen Datensätzen sollten in wenigen Sekunden, im Höchstfall Minuten exportiert sein - selbst wenn WHERE Bedingung nicht durch einen Index beschleunigt werden kann. Da ist irgendwas anderes nicht in Ordnung .Was für ein Tool verwendest Du um die Daten zu exportieren? Kann es sein, dass das Tool die ganzen Datensätze erstmal in den Speicher lädt anstatt sie direkt zu exportieren?
 
Okay, also folgende Infos hab ich noch:
- CPU, Kerne: Die Hardware-Komponenten sind ausreichend Dimensioniert
-Bandbreite: Ausreichend, hängt als VM in der Infrastruktur

Die Datensätze in der Tabelle sehen so aus:
ID - DateTime - SeatNumber - Description
1123 2020-03-01 13:34:41.226 32 "Fleet 44"
34223 2020-01-11 15:54:31.252 21 "Fleet 311"
22342 2020-02-01 06:13:71.272 21 "Fleet 342"
3332 2002-05-01 17:14:46.242 432 "Fleet 32"

Ich extrahiere nun bspw. alle IDs die zwischen dem 01.01.2020 und dem 01.02.2020 liegen und die SeatNumber 21 haben:
Code:
Select ID
FROM tblSeat
WHERE SeatNumber = 21 AND
DateTime BETWEEN   CONVERT(datetime,'2021-01-01 00:00:00.000',120)  AND CONVERT(datetime,'2021-02-01 00:00:00.000',120)



Zum Tool: Ist nutze das MagementStudio von MS


Edit. Okay muss mich korrigieren, es sind genau:
13 823 762 832 Datensätze, sorry!
 
Zuletzt bearbeitet:
Du verwendest eine Funktion für das WHERE, CONVERT(). Hast Du dazu einen passenden funktionalen Index? Und warum verwendest Du da eine Funktion?
 
Um das mal nachzuvollziehen:

Code:
test=*# create table kalusie(id int generated always as identity primary key, datetime timestamp, seat int, description text);
CREATE TABLE
test=*# insert into kalusie (datetime, seat, description) select now()-(random()*1000)::int * '1day'::interval, (random()*1000)::int, 'blasfasel ' || s::int from generate_series(1,10000000) s;
INSERT 0 10000000
test=*# create index idx2 on kalusie (datetime, seat );
CREATE INDEX
test=*# explain (analyse) select * from kalusie where seat = 21 and datetime between '2021-01-01 00:00:00.000' and '2021-02-01 00:00:00.000';
                                                                                 QUERY PLAN                                                                                 
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Bitmap Heap Scan on kalusie  (cost=877.50..1840.79 rows=250 width=48) (actual time=4.420..4.870 rows=336 loops=1)
   Recheck Cond: ((datetime >= '2021-01-01 00:00:00'::timestamp without time zone) AND (datetime <= '2021-02-01 00:00:00'::timestamp without time zone) AND (seat = 21))
   Heap Blocks: exact=333
   ->  Bitmap Index Scan on idx2  (cost=0.00..877.43 rows=250 width=0) (actual time=4.377..4.377 rows=336 loops=1)
         Index Cond: ((datetime >= '2021-01-01 00:00:00'::timestamp without time zone) AND (datetime <= '2021-02-01 00:00:00'::timestamp without time zone) AND (seat = 21))
 Planning Time: 0.185 ms
 Execution Time: 4.957 ms
(7 rows)

test=*#

10 Millionen Rows, 4.9ms
 
Ich musste Convert nutzen, um die Zeit und nicht nur das das Datum zu Filter.
Und ich hab mich mit der Anzahl vertan, es sind 13,8 Mrd Datensätze.

Ein Index wurde vom Hersteller (non-Clustered) auf DateTime erstellt.
 
Nun ja, ich tue es mir jetzt nicht an, 14Mrd Rows auf meinem Spielcomputer zu erstellen, aber typischerweise wächst die Abfragezeit eher nicht linear, sondern deutlich langsamer. Ich bin mir mir recht sicher, daß PG (was ich verwende) auch bei 13Mrd. Rows kaum mehr als wenige Sekunden brauchen würde. Hängt natürlich auch von statistischen Parametern ab (auf wie viele Rows trifft WHERE zu?), von der Hardware, etc.
 
Werbung:
Zurück
Oben