verwendetes Datenbanksystem: <Oracle 11R2>
Hallo zusammen
ich bin dabei eine Reporting Homepage zu implementieren. Die Homepage besteht aus verschiedenen Seiten welche jeweils irgendwelche Report mit Grid + Chart darstellen.
In einem meiner Reports habe ich 1 Grid + 10 Charts. Die Daten die von der DB abgefragt werden sind für alle Elemente die selbe.
StringBuilder query = new StringBuilder();
query.Append("SELECT MEAS_DATE, ");
query.Append("TOTAL, VALUE_1, VALUE_2, VALUE_3, VALUE4 ");
query.Append("FROM REPORTING.example ");
query.Append("WHERE MEAS_DATE > SYSDATE - 31 ");
query.Append("GROUP BY MEAS_DATE DESC ");
SqlDataSource dataSource = new SqlDataSource();
dataSource.ProviderName = "System.Data.OracleClient";
dataSource.ConnectionString = DbHandler.getConnectionString("USR_XY", "myPwd");
dataSource.SelectCommand = query.ToString();
gridView.DataSource = dataSource;
gridView.DataBind();
Diese Abfrage gibt mir 30 Rows zurück und steht schön geschrieben im Grid.
Nun möchte ich 5 Grafiken machen.
Dazu modifiziere ich für jedes Chart die Datasource:
if (gridView.DataSource.GetType() == typeof(SqlDataSource))
{
SqlDataSource modifiedSource = gridView.DataSource as SqlDataSource;
modifiedSource.SelectCommand = "SELECT * FROM (SELECT * FROM (" + modifiedSource.SelectCommand + " ) ORDER BY " + sortColumnDBName + " DESC) WHERE ROWNUM <= 10";
chart.DataSource = modifiedSource;
}
Wobei sortColumnDBName das zu sortierende DB Field ist.
Das funktioniert an und für sich ganz gut. Ist aber bei steigender Anzahl Charts alles andere als effizient. Da für 5 Charts + 1 GridView 6 mal die DB abgefragt ist.
Ich möchte das Ganze nun ein wenig optimieren und die Daten nur einmal zu lesen versuchen. Gibt es da eine hübsche Möglichkeit? Evtl was mit LINQ? Oder muss ich alles in einer DataTable + DataView zwischenspeichern und dann selber sortieren?
Danke schon mal im Voraus.
Gruss
Marc
huhu,
als erste mal - hier gibts c# und sql tags - dann kann man das ganze besser lesen.
Aber zu deinem Problem. Was bedeutet ineffizient? 6 Queries stören eine DB im allgemeinen nicht wirklich. Du kannst mal den Profiler laufen lassen, um die ineffiziez zu überprüfen (alles gen > 200ms von der DB ist definitv ineffizient).
Ok, wen du das getestet hast, dann bemüh mal die Stopwatch (sieht bei Dir nach Winforms aus) um nen Zeitfresser zu finden - alternativ nen Profiler dazwischenschalten.
Deinn Code an sich sieht nicht übel aus. Ich bin mir jetzt abe nicht sichre ob das ganze nicht in nem Dataset am Client passiert.
Linq und Konsorten sind nur eine Möglichkeit "eleganter" zu programmieren, in der Laufzeit hilft es nur, wenn man extrem grobe Schnitzer macht. Ansonsten sind diese Bibliotheken im allgemeinen etwas langsamer als selbst programmiert. Allerdings so wenig, dass sich es definitiv lohnt, diese zu verwenden (aufgrund der persöhnlich gesparten Arbeit).
😃
Xynratron
Herr, schmeiss Hirn vom Himmel - Autsch!
Die Erfahrung zeigt immer wieder, dass viele Probleme sich in Luft auslösen, wenn man sich den nötigen Abstand bzw. Schlaf gönnt.