Neusten Daten für alle FK's finden.

dotti

Mitglied
Hallo Forum,

ich versuche jetzt schon seit Tagen folgendes Problem möglichst mit reinem SQL(MySQL Datenbank) zu lösen:

Ausgangstabelle
---------------
Code:
ID			ID_Sensor		Zeitstempel			Messwert1		Messwert2
-------------------------------------------------------------------------
1			1				9:10				12				11
2			2				10:05				8				5
3			2				12:10				4				0
4			1				16:30				12				8
5			3				8:25				25				20
6			3				10:15				10				8
7			3				15:20				6				12
8			1				12:30				10				11
9			1				11:10				9				9
10			2				11:10				4				3
11			3				11:10				2				1

Ergebnis der Abfrage soll sein:
-------------------------------
Code:
ID			ID_Sensor		Zeitstempel			Messwert1		Messwert2
-------------------------------------------------------------------------
4			1				16:30				12				8
3			2				12:10				4				0
7			3				15:20				6				12

Es soll also für jeden Sensor der letzte Letzte Datensatz gefunden werden.

Wie stell ich sowas an, wenn es möglichst performant sein soll?


mfg


Klaus D.
 
Könnte das hier die Lösung sein?

SQL:
SELECT * FROM 
(SELECT ID, ID_Sensor, Zeitstempel, Messwert1, Messwert2
FROM tab_Ausgang
ORDER BY ID_Sensor ASC, Zeitstempel DESC) AS A
GROUP BY A.ID_Sensor

mfg


Klaus D.
 
Zuletzt bearbeitet von einem Moderator:
Zuerst pro sensor den höchsten Zeitstempfel ermitteln und das Resultat wieder mit der Tabelle selber verknüpfen

SQL:
SELECT
	t.*
FROM
	tab_ausgang AS t,
	(
		SELECT
			id_sensor,
			MAX(zeitstempel) AS max_zeitstempfel
		FROM
			tab_Ausgang
		GROUP BY
			id_sensor
	) AS mt
WHERE
	t.id = mt.id
	AND t.zeitstempel = mt.max_zeitstempfel
 
Zuletzt bearbeitet von einem Moderator:
Hallo yaslaw,

danke für deine Antwort.

Leider bekomme ich da immer die Meldung, dass es mt.id nicht gibt.
Und wenn ich zur Unterabfrage die ID Spalte hinzufüge werden zwar die
richtigen Zeitstempel ermittelt, jedoch nicht die Richtigen id's.


mfg


Klaus D.
 
id_sensor anstelle von id
Sowas passiert leider, wenn man Code schreibt ohne ihn zu testen:(
 
Hallo Leute,

so die hier gelöste Aufgabe stellt mich nun vor einem Zeit Problem.

Ich habe momentan ca. 300.000 Datensätze und folgende Abfrage, die ca 3sek benötigt.

SQL:
SELECT	D.id_Schnittstelle, 
	SST.Name AS Name_Schnittstelle, 
	DQ.id_Datenquelle, 
	DQ.Name AS Name_Datenquelle, 
	MAX(D.Zeitstempel) AS MAX_Zeitstempel 
FROM	tab_Datenquellen AS DQ, 
	tab_Schnittstellen AS SST, 
	tab_Datenquellen_Typ_700_Daten AS D 
WHERE	SST.id_Schnittstellen_Typ = 700 
	AND DQ.id_Datenquelle = SST.id_Datenquelle 
	AND SST.id_Schnittstelle = D.id_Schnittstelle 
GROUP BY D.id_Schnittstelle

Wie kann ich diese beschleunigen?

Was ich auch noch komisch finde, ist dass die Abfrage auf meinem Test Sytem mit 160.000 Datensätzen nur beim ersten Versuch in etwa so lange benötigt.
Mache ich die gleiche Abfrage mehrmals ist sie ab dem 2. mal in 0.x sek fertig.

Produktiv System ist eine QNAP NAS.
Test System ist eine WinXP VM mit XAMPP.
 
Zuletzt bearbeitet von einem Moderator:
Du beschwerst dich bei 300k Datensätzen über eine Performance von 3sec ? Das sind immerhin 100k Datensätze pro Sekunde ... und das ist schon verdammt schnell.

Und das immer nur die "erste" Abfrage so lange dauert liegt am Caching : der DB-Server merkt sich für einen gewissen Zeitraum eine gewissen Anzahl an Anfragen und die dazu passenden Ergebnisse in Abhängigkeit das die Daten nicht verändert werden. Das sollte man auch nicht versuchen zu unterdrücken da es bei vielen gleichen / änlichen Anfragen immer wieder zu gleichen / ähnlichen Ergebnissen kommt ist es weit weniger aufwändig diese dann aus dem RAM zu bedienen als erst wieder alle Daten zu laden , zu verarbeiten und das Ergebnis zusammenzusetzen.

Wenn du jetzt wirklich die Performanceschraube noch weiter anziehen willst musst du dich mal Key- und Index-optimierten Anfragen auseinander setzen. Diese Anfrage sind speziell so formuliert das sie aus den in der Tabelle angegeben Keys und Indizes ihre Vorteile nehmen da die DB diese Informationen schneller parat hat als wenn sie erst die Daten selbst durchgehen muss.

Auch kommt es auf die Größe der Datensätze an : wenn z.B. ein Datensatz eine Größe von ein paar Bytes + Overhead hat ist es klar das es sehr schnell geht *oder zumindest sehr schnell gehen sollte* als wenn ein Datensatz gleich mehrere kB oder sogar MB groß ist. Aber wenn du mit 100k Datensätze pro Sekunde bei einer solchen Anfrage nicht zu frieden bist müssen die Datensätze schon ziemlich groß sein.
 
Hallo SPiKe,

danke für deine Antwort.

Ich hab heute das ganze noch auf 0,1 sek verbessert :)

SQL:
SELECT	SST.id_Schnittstelle, 
		SST.Name AS Name_Schnittstelle, 
		DQ.id_Datenquelle, 
		DQ.Name AS Name_Datenquelle, 
		DM.MAX_Zeitstempel 
FROM	tab_Datenquellen AS DQ, 
		tab_Schnittstellen AS SST, 
		(
		SELECT	id_Schnittstelle, 
				Max(Zeitstempel) AS MAX_Zeitstempel 
		FROM	tab_Datenquellen_Typ_700_Daten
		GROUP BY id_Schnittstelle 
		) AS DM
WHERE	DQ.id_Datenquelle = SST.id_Datenquelle 
		AND SST.id_Schnittstelle = DM.id_Schnittstelle

Mir hat sehr geholfen, dass ich nun mehr verstehe was die DB arbeitet bei einer Abfrage.
Dadurch konnte ich die Arbeit besser stukturieren und somit die Zeit erheblich verkürzen.

Bei meinem ersten Versuch mussten die 300.000 DS erst mit zwei weiteren Tabellen verknüpft werden was für die DB bedeutet hat , nicht 300.000 sondern ca. 30. 000.000 DS zu bearbeiten und
anschließend wurden die nötigen Infos herausgefildert.
Dadurch konnte vermutlich der Index auf dem Zeitstempel nicht mehr genutzt werden.

Jetzt reduziere ich erst die Anzahl der DS durch die SUB Abfrage auf ca. 100 und führe dann erst die Verknüpung mit den anderen Tabellen aus. Das spart imens an Zeit...
 
Zuletzt bearbeitet von einem Moderator:
Moin dotti,

Verständnisfrage: was ist denn aus der ursprünglichen Bedingung mit dem aktuellsten Timestamp geworden?

Im jetzigen Subselect sehe ich nur ein "Zeitstempel AS MAX_Zeitstempel" statt "Max(Zeitstempel) AS MAX_Zeitstempel".

Ist denn dein Ergebnisresultset dennoch wie erwartet?

Biber (allerdings noch vor dem Frühstück)
 
Zuletzt bearbeitet:
Da hat sich der Tippfehlerteufel im Forum eingeschlichen...
Bei meinen Test's mit der Datenbank hatte ich das natürlich richtig.
Sonst wäre nur Müll rausgekommen...
Hab das mal eben korregiert...

P.S. Das Abfragebeispiel hier im Forum ist stark vereinfacht. Es soll nur das angewante Prinzip zeigen.
 
Zuletzt bearbeitet:
Zurück