Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Eine weitere Access-Datei öffnen wenn...

Begonnen von Torsten., Februar 22, 2018, 09:13:39

⏪ vorheriges - nächstes ⏩

Lachtaube

Mit einen Mewhrfachindex über die Felder Gruppe, Textfeld1 lässt sich das Laufzeitverhalten vermutlich noch weiter verbessern.
Grüße von der (⌒▽⌒)

ebs17

Eine Variante, die man vielleicht auch prüfen könnte, wäre der Weg der Kreuztabellenabfrage:
TRANSFORM
   MIN(beschr_wert) AS Minvonbeschr_wert
SELECT
   gruppe,
   textfeld1
FROM
   tbl
GROUP BY
   gruppe,
   textfeld1
PIVOT
   sortnr

Falls die Textzusammensetzung notwendig ist, könnte man die so anschließen:
SELECT
   K.gruppe,
   K.[001] & (';' + K.[002]) & (';' + K.[003]) & (';' + K.[004]) & (';' + K.[005]) & (';' + K.[006]) AS liste,
   K.textfeld1
FROM
   tbl_Kreuztabelle AS K
Mit freundlichem Glück Auf!

Eberhard

Frithjiof

Hallo.

Ich habe mich der Sache auch mal angenommen und ein Beispiel gebastelt.
Hier werden zwischen  700.000 und 800.000 Datensätze in 7 - 8 Minuten verarztet. (Also weit unter 36 Stunden)

Im Modul mdTest die Prozedur <machtabelle> ausführen. Die erstellt
> 700.000 Datensätze
Anschließend die Prozedur <machErgebniss> ausführen.

Frithjof

Torsten.

Moin zusammen
@Eberhard
Ich habe zunächst den Code aus Antwort #14 in meine orig. DB eingebaut und funktioniert. Vielen Dank.
Ich werde jetzt versuchen den Code aus #16 auszuprobieren.
Melde mich dann wieder.

@Lachtaube
ZitatMit einen Mewhrfachindex über die Felder Gruppe, Textfeld1 lässt sich das Laufzeitverhalten vermutlich noch weiter verbessern.
Gut, nur wie stellt man denn fest wann eine Indizierung nötig/von Vorteil (wahrscheinlich wenn zu langsam) ist und welches Feld sollte den Index bekommen?
Z.B. der Hinweis von Eberhard in Antwort #7
ZitatZusätzlich sollte auf sortnr ein Index gesetzt werden.
da wäre ich nie drauf gekommen das umzusetzen, weil einfach das Verständnis fehlt - aber ich versuche zu lernen.

@Frithjof
Da werde ich mich mit beschäftigen, melde mich dazu dann wieder
Vorab vielen Dank

Gruß Torsten.

Lachtaube

Grüße von der (⌒▽⌒)

Torsten.

@Lachtaube
Ok, danke für die Quellen.

Gruß Torsten.

Torsten.

@Frithjof
Ich habe testweise einen Teildurchlauf gestartet, ca. Werte meiner Daten im Vergleich zu Deiner Demo_Ver_1 ist wie folgt:
840Tsd Ds in tbl
230Tsd Ds in tblErgebnis (erhalten mit Eberhards Code aus #14 ca. 7 Std.)
Nach Start "machErgebnis" habe ich ca. 1500 Ds nach 8 Min. erhalten.
Hochgerechnet auf das Ergebnis von 230Tsd DS würde es ca. 20 Std. dauern.

Zur Info noch:
In den 840Tsd Ds sind pro gleicher "Gruppe" bis zu 35 Ds.
Feld "Liste" in tblErgebnis ist dementsprechend ein Memo-Feld, falls das wichtig ist.

Gruß Torsten.



Torsten.

@Eberhard
im Vorschlag aus #16 funktioniert der Code für die Textzusammensetzung nicht.
Kannst Du bitte schauen was ich möglicherweise falsch gemacht habe?
DB ist angehängt.

Gruß Torsten

Frithjiof

Hallo Torsten.

Zitat
In den 840Tsd Ds sind pro gleicher "Gruppe" bis zu 35 Ds.
Feld "Liste" in tblErgebnis ist dementsprechend ein Memo-Feld, falls das wichtig ist.

Die Frage ist was sich zwischen deiner Originaldatei und der  Test-DB sonst noch alles unterscheidet? Ich habe in der Test-DB Tabelle  <tbl> lediglich einen Index auf die Gruppe gesetzt.

Ein Versuch mit
- tblErgebnis = Memo-Feld
- bis zu 35 Datensätzen in einer Gruppe
- mit > 1.000.000 Datensätzen in  Tabelle <tbl> .

Die Ergebnistabelle enthält 93.750 Datensätze.
Bearbeitungszeit: 219 Sekunden

Ein  Versuch mit 
- mit > 230.000 Datensätzen in <tbl> .
Die Ergebnistabelle enthält 31.750 Datensätze.
Bearbeitungszeit: 78 Sekunden

(Access 2013, ssd-platte, 8 GB Ram, core i5 )


Du kannst das einfach mit den Testdaten ausprobieren.
1.   Im Modul mdTest  <machtabelle>  ausführen.
Es werden zwischen 200.000 und 300.000 Datensätze erstellt.
(An den Forschleifen kann man noch rumspielen und die Anzahl erhöhen oder vermindern.)

2.   Anschließend <machErgebnis> ausführen.
Im Direktfenster wird ein Wert hochgezählt und am Ende die Bearbeitungszeit in Sekunden ausgegeben.

Frithjof

ebs17

In meinem Vorschlag bezieht sich die Bezeichnung "tbl_Kreuztabelle" auf die vorher gezeigte Kreuztabellenabfrage (Bezeichnung ist etwas unglücklich gewählt). Leider ließ sich diese Abfrage nicht direkt als Unterabfrage einbinden.
Mit freundlichem Glück Auf!

Eberhard

Frithjiof

@Torsten.
ich habe es jetzt noch mal ohne Index getestet. In der Tat läuft es ist es dann extrem lahm. (=aus Minuten werden Stunden)
Also setze in jedem Fall auf das Feld Gruppe einen Index.

Ansonsten ist meine Routine etwas schneller als Eberhards. 260 Sekunden zu 400 Sekunden bei ca. 1.000.000 Datensätzen und 100.000 Ergebnissen.

So, jetzt gehe ich Sonne.

Frithjof

Torsten.

@Frithjof
So, habe den Index gesetzt und es ist um ein vielfaches schneller geworden:
840Tsd DS zu 234Tsd in 316 Sekunden, allerdings unsortiert.
Würdest Du bitte noch die Sortierung nach "sortnr" einarbeiten?
Danach könnte ich mal die gesamten Tabelle auf mein Projekt umschreiben (Feldnamen etc.) und dann sehen wie schnell es geht.
Gruß Torsten.

Torsten.

@Eberhard
ZitatIn meinem Vorschlag bezieht sich die Bezeichnung "tbl_Kreuztabelle" auf die vorher gezeigte Kreuztabellenabfrage (Bezeichnung ist etwas unglücklich gewählt). Leider ließ sich diese Abfrage nicht direkt als Unterabfrage einbinden.

Ich lese Deine Info  8)"rauf und runter, rechts und links" 8) aber ich verstehe nicht wie ich es umsetzen muß um zum Ergebniss zu kommen. Bitte helfe mir das zu verstehen.

Vielen Dank, Torsten.

ebs17

In Beitrag #16 sind zwei Abfragen gezeigt. Die erste ist eine Kreuztabellenabfrage. Diese ist unter einem Namen abzuspeichern.
Die zweite Abfrage verwendet diese Kreuztabellenabfrage als Datenbasis, also müsstest Du
- beide Abfragen übernehmen,
- in der zweiten Abfrage den Namen der Kreuztabellenabfrage übernehmen, der unglücklich "tbl_Kreuztabelle" lautet.

Sinnvolle Indizierungen dabei:
=> zusammengesetzter Index auf gruppe + textfeld1
=> Index auf sortnr
Mit freundlichem Glück Auf!

Eberhard

Torsten.

Alles klar, verstanden.
Vielen Dank für die Geduld   :)