• Liebe User, bitte beachtet folgendes Thema: Was im Forum passiert, bleibt im Forum! Danke!
  • Hallo Gemeinde! Das Problem leidet zurzeit unter technischen Problemen. Wir sind da dran, aber das Zeitkontingent ist begrenzt. In der Zwischenzeit dürfte den meisten aufgefallen sein, dass das Erstellen von Posts funktioniert, auch wenn das Forum erstmal eine Fehlermeldung wirft. Um unseren Löschaufwand zu minimieren, bitten wir euch darum, nicht mehrmals auf 'Post Reply' zu klicken, da das zur Mehrfachposts führt. Grußworte.

MS Access allgemein

Mitglied seit
01.09.2002
Beiträge
1.456
Reaktionen
0
Hallo,

ich hab ein paar Fragen zu MS Access und SQL und so:

Und zwar hatte ich bisher relativ überschaubare Datenmengen, ca 12 MB CSV Datei - eingelesen und verarbeitet.

Jetzt wird das mehr und ich muss mich u.U. ein wenig mit Optimierung auseinandersetzen.

Frage ist (momentan) folgende:
Ich hab 170k Zeilen, alle mit einem bestimmten Datum versehen.
Jetzt will ich nur die Zeilen, welche mit einem Datum versehen sind, welches 2 Monate vor dem letzten Datum liegt.
Mein Code
Code:
SELECT * FROM Affenmann WHERE Datum < DATEADD("m", -2, (SELECT MAX(Datum) FROM Affenmann));

Ermittelt der jetzt jedesmal das Maximum neu?
 
Mitglied seit
25.08.2010
Beiträge
1.726
Reaktionen
0
Wenn mich meine alten relationalen Datenbankkenntnisse nicht täuschen, überprüft er bei jedem Datensatz ob das Datum < dem Datum des Ältesten ist.
D.h. in deinem Fall wird dann tatsächlich jedesmal zwei Abfragen an die DB geschickt.
Ich weiß leider nicht wie es mit Access funktioniert, aber es wäre hilfreich den Wert des "Maximums" auszulesen und dann aufgrund dessen die Abfrage nach den Datensätzen mit dem Datum ausführen.

Evtl könntest du mit LIMIT arbeiten, d.h. du zählst zuerst die Anzahl der Datensätze die du haben möchtest und dann mittels LIMIT holst du dann über SELECT die Datensätze, wobei ich glaube das zieht noch mehr Performance, da du ja auch noch sortieren musst.

Kleiner Denkanstoß aber noch zu deiner Abfrage, du erhälst so auch Datensätze mit dem Datum von vor einigen Jahren, d.h.:
Code:
Max = 14.02.2011
Result = 13.02.2011; 20.12.2010; 13.02.2010; 13.02.1999; [...]
 

parats'

Tippspielmeister 2012, Tippspielmeister 2019
Mitglied seit
21.05.2003
Beiträge
20.337
Reaktionen
1.792
Ort
St. Gallen
In deinem Fall geht es Zeile für Zeile durch und vergleicht entsprechend das Datum mit deinem Abfragewert. Bei 170k Zeilen sind es entsprechend 170k Durchläufe.
Willst du ein wenig optimieren, dann caste das Datum als integer und vergleiche entsprechend mit einem Integer. Beispiel: 2011-02-14 als Integer wäre eben 20110214.
Wir bewegen uns hier, natürlich abhängig von der Maschine, im wirklich kleinen performance Plus.
 
Mitglied seit
01.09.2002
Beiträge
1.456
Reaktionen
0
Danke, klingt doof.

Kann ich dann in einer abfrage sowas in der Art schreiben:
Code:
tmp = Select max(xxx) From abc;
Select * From abc Where datum < tmp;
Werd das morgen mal ausprobieren - evtl ist dann auch unser ITler wieder da und kann mir ein wenig weiterhelfen...

Insgesamt, was bringt des Performance Verbesserungen?
Über eine DB Server gehen oder alles lokal speichern?

Kann man irgendwo in MS Access Syntaxhighlighting einstellen?
 

parats'

Tippspielmeister 2012, Tippspielmeister 2019
Mitglied seit
21.05.2003
Beiträge
20.337
Reaktionen
1.792
Ort
St. Gallen
Syntaxhighlighting für VBA oder die Datenanbindung von SQL? In beiden Fällen nein, zumindest kenne ich nichts.
SQL-Querys habe ich immer im MSSQL-Studio geschrieben und danach per Copy-Paste. ;)
spar dir doch den tmp Mist und vergleiche direkt das Datum, kommt aufs gleiche hinaus.
 
Mitglied seit
01.01.1970
Beiträge
1.170
Reaktionen
0
Ermittelt der jetzt jedesmal das Maximum neu?

was verstehst du denn unter "jedesmal"?!
du schickst ein request an die datenbank und die liefert dir eine ergebnistabelle.
dh. du hast einen request.

und gerade solche "simplen" abfragestrukturen sind bereits von jeder aktuellen datenbank heraus optimiert.
dh. die wird sich für diese atomare transaktion das maximale datum intern cachen.

wenn du jetzt aber "jedesmal" für eine zeile (zb. in einer schleife) den select abbrennst, und nebenher noch parallele transaktionen auf der datenbank ablaufen, macht es schon sinn, sich den wert zwischenzuspeichern.
wobei sich der max-wert dann aber auch logischerweise in einer anderen transaktion bereits geändert haben könnte.

wenn du auf nummer sicher gehen willst, "verjoine" das einfach, anstatt einen nested-select zu benutzen.
vermute aber mal, dass die internen optimierer aus nested-selects sowieso automatisch joins basteln.
 
Zuletzt bearbeitet:
Mitglied seit
01.09.2002
Beiträge
1.456
Reaktionen
0
Bedankt, jetzt weiß ich bescheid, dass der Access nicht ganz dum ist.

Jetzt hängts hier eher an der Datenqualität bzw. an der Frage, was wir überhaupt wissen und auswerten wollen, bzw. wie uns das weiterbringt (warum unsere iPhone-App abging, die Android-App dagegen eher nicht so...).
 

parats'

Tippspielmeister 2012, Tippspielmeister 2019
Mitglied seit
21.05.2003
Beiträge
20.337
Reaktionen
1.792
Ort
St. Gallen
Mh, konrekt noch ne was offenes?
 
Mitglied seit
18.07.2001
Beiträge
2.152
Reaktionen
2
Ort
Nürnberg
Blöde Frage: Verwendest du Access nur wegen der Tabellen oder nutzt du auch die ganzen form/report etc. features?
 
Mitglied seit
01.09.2002
Beiträge
1.456
Reaktionen
0
äh, bitte was? fomr/report?

Ich werte nur Daten aus - also wir bekommen die Daten als CSV, ich schmeiss die in den Access und ab.
Da ich halt SQL halbwegs beherrsch, so dass es funktioniert aber wohl nicht skaliert, nutz ich access statt Excel; was bei >170k Zeilen auch doof wäre.
Wir hosten und verwalten usw. die Datenbank nicht (darum sind auch so fantastische Ungereimtheiten drin: Benutzer geben ihr Alter im Feld Geburtsjahr ein und es wird nicht abgefangen - dann wird ne 19 vorangehängt und statt 20 ist dann halt jmd 90 jahre alt...).

Momentan nix offen - Sportunfall und 2 Tage krankgeschrieben...
 
Mitglied seit
18.07.2001
Beiträge
2.152
Reaktionen
2
Ort
Nürnberg
Aso, falls du wirklich mal wegen der Datenmenge Performance Probleme bekommst dann nimm lieber gleich SQL Server Express. Kost nix und geht in der Express Edition bis 10 GB. Da kannst du wenns wirklich mal hart wird mit Indexen ne Menge rausholen.

So als grober Anhaltspunkt würde ich btw. mal sagen das in der Regel der Query Optimizer der Datenbank mehr Plan hat als man selbst. Und das der max wert nur einmal ermittelt werden muss, weiss mit Sicherheit auch Access.
 

parats'

Tippspielmeister 2012, Tippspielmeister 2019
Mitglied seit
21.05.2003
Beiträge
20.337
Reaktionen
1.792
Ort
St. Gallen
Express geht bis afaik 4GB DB-Größe und unterstüzt nur max 2/4 Kerne.

Hast Du mal über die Integration Services der Microsoft Business Intelligence nachgedacht?
Lässt sich im Zweifel als Ad-Hoc Paket im Dateisystem ablegen und ist extrem mächtig, sofern man sich ein wenig reinfuchst. Verwende gerade für Flatfiles die IS von Microsoft, einfach sehr perfomant. :)
 
Mitglied seit
01.09.2002
Beiträge
1.456
Reaktionen
0
Kanonen, Spatzen, usw... ;)

Meine Datenbankenlernzeit liegt lange zurück - hab ich das damals richtig verstanden, dass ein Index mehr oder weniger einer vorgefertigte Suche ist? Also es wird neben der unsortierten tabelle noch eine vorsortierte nach dem Index irgendwo angelegt, so dass die Suche beschleunigt wird?
Weil wenn ich einfach eine Spalte vorsortiert hinterlege, dann aber zu den einzelnen Zeilen die restlichen Werte benötige, dann müsste ja wieder alles sequenteill durchsucht werden...
verdoppelt das dann nicht den Speicherbedarf?

Realitätsbezogene lernen und erfahren > Universitätsnebenfach :/
 

parats'

Tippspielmeister 2012, Tippspielmeister 2019
Mitglied seit
21.05.2003
Beiträge
20.337
Reaktionen
1.792
Ort
St. Gallen
Eine IDENTITY Spalte ist per default erst einmal nur Unique und indexiert.
Zweiteres ist jetzt nicht unbedingt eine Schattentabelle, allerdings werden entsprechende Indizes gesondert abgelegt um Abfragen gezielt perfomant absetzen zu können.

Du kannst übrigens ein Index auf jede Spalte legen.
 
Oben