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:
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:
Hier ein Auszug aus dem Quellcode:
[highlight=vbnet]
' 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 )
[/highlight]
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
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:
Code:
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)
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:
Code:
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)
[highlight=vbnet]
' 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 )
[/highlight]
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
Comment