Hallo zusammen,
ich logge bei uns im Werk verschiedene Anlagenparameter von mehreren Steuerungsmaschinen mit.
Es werden etwas mehr als 300 Parameter aller 10s, manche auch nur aller 10 Minuten mitgeloggt und in eine SQL-Datenbank gespeichert.
Als SQL-Anwendung benutzte ich SQL-Express.
Alle Abfragen der Datenbank habe ich über gespeicherte Prozeduren realisiert.
Das System läuft nun seit ca. 1 gutem Jahr recht stabil.
Ich bin heute dabei eine neue Funktion zu integrieren und rufe dabei per gespeicherter Prozedur 6 Messwerte für 2 Anlagen über einen Zeitraum von z.B. 8 Tagen ab.
Es handelt sich dabei um Produktions- bzw. Stillstandszeiten.
Die Abfrage für die 2 Anlagen sind jeweils 2 getrennte Abfragen. An Messwerte kommt bei einem Logzyklus von 10s natürlich einiges zusammen.
Was jetzt aber sehr merkwürdig ist, ist das die Abfrage der einen Tabelle so rund 0.05 s dauert. Die der anderen Tabelle jedoch > 11 s.
So richtig kann ich mir da keinen Reim drauf machen.
Hier mal die Funktion, die beim Betätigen des Abfrage-Buttons ausgeführt wird
Spoiler anzeigen
Die gespeicherte Prozedur sieht so aus:
Und aufgerufen wird diese über das Programm folgendermaßen:
Spoiler anzeigen
Die Aufrufe für die andere Anlage (Konti1) sind identisch.
Hat jemand vielleicht einen Tipp, wo mein Fehler liegt das die eine Abfrage soviel länger dauert als die andere?
Wo könnte ich nach Fehlern suchen?
Habt schon mal vielen Dank!
[Update:] ich habe es jetzt mehrmals im Einzelschritt debugged und kann noch sagen, dass die Zeitverzögerung beim Befehl "DA.Fill(ds)" auftritt.
ich logge bei uns im Werk verschiedene Anlagenparameter von mehreren Steuerungsmaschinen mit.
Es werden etwas mehr als 300 Parameter aller 10s, manche auch nur aller 10 Minuten mitgeloggt und in eine SQL-Datenbank gespeichert.
Als SQL-Anwendung benutzte ich SQL-Express.
Alle Abfragen der Datenbank habe ich über gespeicherte Prozeduren realisiert.
Das System läuft nun seit ca. 1 gutem Jahr recht stabil.
Ich bin heute dabei eine neue Funktion zu integrieren und rufe dabei per gespeicherter Prozedur 6 Messwerte für 2 Anlagen über einen Zeitraum von z.B. 8 Tagen ab.
Es handelt sich dabei um Produktions- bzw. Stillstandszeiten.
Die Abfrage für die 2 Anlagen sind jeweils 2 getrennte Abfragen. An Messwerte kommt bei einem Logzyklus von 10s natürlich einiges zusammen.
Was jetzt aber sehr merkwürdig ist, ist das die Abfrage der einen Tabelle so rund 0.05 s dauert. Die der anderen Tabelle jedoch > 11 s.
So richtig kann ich mir da keinen Reim drauf machen.
Hier mal die Funktion, die beim Betätigen des Abfrage-Buttons ausgeführt wird
C#-Quellcode
- // Daten nach Auswahl der Anlage erfassen
- tAbfrageStart = DateTime.Now;
- switch (DropDownListAnlageTest.Text)
- {
- case "Konti1": dsStatistik = GetMesswerteZeitraumKonti1(strStartDatumZeit, strEndDatumZeit);
- break;
- case "Konti2": dsStatistik = GetStatistikZeitraumKonti2(strStartDatumZeit, strEndDatumZeit);
- break;
- default:
- break;
- }
- tAbfrageEnde = DateTime.Now;
- tAbfrageDauer = tAbfrageEnde - tAbfrageStart;
- tAbfrageZeiten.Add(tAbfrageDauer.ToString());
Die gespeicherte Prozedur sieht so aus:
Quellcode
- BEGIN
- -- SET NOCOUNT ON added to prevent extra result sets from
- -- interfering with SELECT statements.
- SET NOCOUNT ON;
- -- Insert statements for procedure here
- SELECT id, Zeitstempel, aktuelleLaufmeter, RakelLaminiereinheitPumpeGeschwindigkeit, RandschnittMesserBS, RandschnittMesserAS FROM Konti2
- WHERE Zeitstempel BETWEEN @Startzeitpunkt AND @Endzeitpunkt
- ORDER BY id ASC
- END
Und aufgerufen wird diese über das Programm folgendermaßen:
C#-Quellcode
- DataSet GetStatistikZeitraumKonti2(string Startzeitpunkt, string Endzeitpunkt)
- {
- DataSet ds = new DataSet();
- DataTable dt = new DataTable();
- SqlConnection conn = new SqlConnection(connectionString);
- SqlDataAdapter DA = new SqlDataAdapter();
- SqlCommand cmd = new SqlCommand();
- cmd.Connection = conn;
- cmd.CommandType = CommandType.StoredProcedure;
- cmd.CommandText = "Get_StatistikZeitraumKonti2";
- cmd.Parameters.AddWithValue("@Startzeitpunkt", Startzeitpunkt);
- cmd.Parameters.AddWithValue("@Endzeitpunkt", Endzeitpunkt);
- DA.SelectCommand = cmd;
- conn.Open();
- ds.Reset();
- DA.Fill(ds);
- DA.Dispose();
- conn.Close();
- conn.Dispose();
- return ds;
- }
Die Aufrufe für die andere Anlage (Konti1) sind identisch.
Hat jemand vielleicht einen Tipp, wo mein Fehler liegt das die eine Abfrage soviel länger dauert als die andere?
Wo könnte ich nach Fehlern suchen?
Habt schon mal vielen Dank!
[Update:] ich habe es jetzt mehrmals im Einzelschritt debugged und kann noch sagen, dass die Zeitverzögerung beim Befehl "DA.Fill(ds)" auftritt.
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Grimsey“ ()