Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Index setzen? (https://www.delphipraxis.net/190964-index-setzen.html)

Gruber_Hans_12345 24. Nov 2016 09:14

Datenbank: Firebird • Version: 2.5 • Zugriff über: IBConsole

Index setzen?
 
Ich habe folgendes SQL
Code:
SELECT MAX(DATUM), USERID FROM BUCHUNGEN GROUP BY USERID
das benötigt ca. 4sekunden bei 800000 Datensätze.

Habe nun schon alle Indexe gesetzt ASC und DESC für beide Felder - es ändert sich allerdings nichts an der Ausführungsgeschwindigkeit.

Gibt es da keinerlei Möglichkeiten?

TRomano 24. Nov 2016 10:36

AW: Index setzen?
 
Hast Du im Ausführungsplan geschaut, ob er die Indices auch benutzt ?

Gruber_Hans_12345 24. Nov 2016 10:50

AW: Index setzen?
 
Code:
PLAN (BUCHUNGEN ORDER BUCHUNGEN_USERID)
wobei BUCHUNGEN_USERID der Index ist.
mehr steht da nicht

TRomano 24. Nov 2016 10:54

AW: Index setzen?
 
Dann nutzt er zu mindestens für das ORDER BY einen Index. Gibt es auch für das Feld "DATUM" einen Index ?

Gruber_Hans_12345 24. Nov 2016 11:08

AW: Index setzen?
 
ja da gibt es auch einen Index (bzw zwei - einen ASC und einen DESC)

das sieht man wenn ich folgendes ausführe
Code:
SELECT MAX(DATUM) FROM BUCHUNGEN
das geht in 1ms und verwendet folgenden Plan

Zitat:

PLAN (BUCHUNGEN ORDER BUCHUNGEN_DATUM)
nur eben sobald ich das kombiniere und gruppiere dann siehts nicht mehr so toll aus

bra 24. Nov 2016 11:13

AW: Index setzen?
 
Wir hatten das Problem auch mal. Ich glaube bei max() verwendet Firebird immer einen full table scan. Versuche mal eine where bzw. having-Klausel mit einzubauen (having userid > -1), damit ließ sich das glaube beheben.
Dasselbe tritt auch bei count(*) auf.

Jumpy 24. Nov 2016 11:20

AW: Index setzen?
 
Was wäre mit einem gemeinsamen Index über die zwei Felder?

Gruber_Hans_12345 24. Nov 2016 11:31

AW: Index setzen?
 
Also der Index über beide Felder bringt leider auch nichts (hatte ich auch schon vorher drinnen sowohl ASC als auch DESC)
das having bringt leider auch nichts, nur ein where würde was bringen, wenn ich dadurch die Datenmenge verringere, aber wenn ich alle user brauche, dann hilft es nichts mehr

bra 24. Nov 2016 11:58

AW: Index setzen?
 
Zitat:

Zitat von Gruber_Hans_12345 (Beitrag 1354587)
das having bringt leider auch nichts, nur ein where würde was bringen, wenn ich dadurch die Datenmenge verringere, aber wenn ich alle user brauche, dann hilft es nichts mehr

Es geht nicht darum die Datenmenge zu verringern, sondern mit der where-Klausel den Index zu erzwingen. Das ist ein Problem von Firebird. Es gibt sicher eine Abfrage, die immer alles zurückliefert (z.B. userid > -1, wenn die nicht negativ sein können).
Siehe auch hier: http://www.firebirdfaq.org/faq205/ oder hier: https://sourceforge.net/p/firebird/m...ssage/1300057/
oder hier: http://www.delphipraxis.net/180221-f...index-max.html

Gruber_Hans_12345 24. Nov 2016 12:15

AW: Index setzen?
 
ja ich meinte ja, wenn ich im where ein userid < 20 mache, dann gehts schnell, weil auch weniger Datensätze kommen
wenn ich ein USERID > 0 mach oder > 10 (dann dauerts halt statt 4 sekunden 3.9 sekunden oder so)

und für das Datum habe ich ja einen DESC index, deswegen geht das reine SELECT MAX(DATUM) ohne gruppieren ja auch sehr sehr schnell... nur eben nicht mehr sobald ich nach dem feld gruppiere ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:49 Uhr.
Seite 1 von 4  1 23     Letzte »    

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 by Thomas Breitkreuz