| 

.NET C# Java Javascript Exception

1
Hallo,

bei einer Abfrage auf eine SQL-Server 2008 Datenbank mit sehr vielen Messwerten, ist mir ein merkwürdiges Verhalten bei Abfragen über ADO.NET aufgefallen.

Wenn ich in einer Abfrage Parameter übergebe, ist die Ausführung um den Faktor 100 langsamer.

Hier zunächst der SQL-String der Abfrage:
SELECT MAX(Timestamp) AS Datum, MAX(Value) AS Value
FROM tblValue
WHERE (Timestamp BETWEEN @DatumVon AND @DatumBis) AND (Tag_ID = @TagId)
GROUP BY DAY(Timestamp), MONTH(Timestamp), YEAR(Timestamp)


Zunächst hatte ich diese Abfrage in einem Dataset um die Daten per Fill zu laden. Nachdem ich immer wieder in einen Timeout gelaufen bin, dachte ich es liegt an dem typisierten Dataset, da die gleiche Abfrage direkt im SQL-Managementstudio in einer Sekunde ausgeführt wurde.
Also habe ich einen CommandReader mit dem gleichen SQL-String erstellt.
Ergebnis auch langsam.
Wenn ich probeweise in dem CommandReader im SQL-String die Parameter direkt durch konstante Werte ersetze ist das Ergebnis wieder in einer Sekunde da.
Hier der entsprechende SQL-String:
SELECT MAX(Timestamp) AS Datum, MAX(Value) AS Value
FROM tblValue
WHERE (Timestamp BETWEEN '1/1/2012' AND '4/1/2012') AND (Tag_ID = 11)
GROUP BY DAY(Timestamp), MONTH(Timestamp), YEAR(Timestamp)


Hier ein Auszug aus dem Quellcode:
'Beispielcode:

cmd = New SqlCommand

strSQL = "SELECT MAX(Timestamp) AS Datum, MAX(Value) AS Value "
strSQL += "FROM tblValue "
strSQL += "WHERE (Timestamp BETWEEN @DatumVon AND @DatumBis) AND (Tag_ID = @TagId) "
strSQL += "GROUP BY DAY(Timestamp), MONTH(Timestamp), YEAR(Timestamp) "


par = New SqlParameter("DatumVon", SqlDbType.DateTime)
par.Value = dtpVon.Value
cmd.Parameters.Add(par)

par = New SqlParameter("DatumBis", SqlDbType.DateTime)
par.Value = dtpBis.Value
cmd.Parameters.Add(par)

par = New SqlParameter("TagId", SqlDbType.Int)
par.Value = cmbTags.SelectedValue
cmd.Parameters.Add(par)

cmd.CommandText = strSQL
cmd.Connection = con

rdr = cmd.ExecuteReader(CommandBehavior.SequentialAccess)


Ich könnte natürlich die Parameter per Stringebearbeitung in den SQL-String einfügen, aber dass soll natürlich nicht die Lösung sein. Warum? Das muß und möchte ich hier nicht erklären.

Hat vielleicht jemand eine Idee?

Viele Grüße

Roland
News:
12.04.2012
RolandF 38 3
4 Antworten
1
Eventuell hilft es, die Statistiken im SQL Server mal zu aktualisieren.

Geh in das SQL-Server-Management-Studio --> Neue Abfrage --> EXEC sp_updatestats
13.04.2012
commänder 420 1 7
0
Ich weiß nicht ob es hier hilft und ob es überhaupt eine Auswirkung auf die Geschwindigkeit hat, aber ich glaube, dass die Art, wie du Parameter hinzufügst, veraltet ist.

Versuch es mal mit:

cmd.Parameters.AddWithValue("@DatumVon", dpbVon.Value);
cmd.Parameters.AddWithValue("@DatumBis", dpbBis.Value);
13.04.2012
Feroc 1,2k 2 9
0
Danke für Deine Antwort,

das war es leider nicht.
Diese Art der Parameterübergabe habe ich auch nur in dem Beispielcode verwendet, um den dbType angeben zu können (veraltet dürfte das aber auch nicht sein).
13.04.2012
RolandF 38 3
0
Super !!!
ich habe bestimmt schon 5 Stunden nach einer Lösung gesucht.
Das wars.
Wie kann ich mich bedanken?
13.04.2012
RolandF 38 3
Kein Problem ;-)
commänder 13.04.2012

Stelle deine Sql-server-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH