Laden...

Sortieren und TOP N mit SqlDataSource

Erstellt von thomae vor 13 Jahren Letzter Beitrag vor 13 Jahren 628 Views
T
thomae Themenstarter:in
94 Beiträge seit 2006
vor 13 Jahren
Sortieren und TOP N mit SqlDataSource

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.

  1. Top 10 aller Total Rows absteigend nach Total geordnet
  2. Top 10 aller Value_1 Rows absteigend nach Value_1 geordnet
  3. Top 10 aller Value_2 Rows absteigend nach Value_2 geordnet
  4. Top 10 aller Value_3 Rows absteigend nach Value_3 geordnet
  5. Top 10 aller Value_4 Rows absteigend nach Value_4 geordnet

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

X
1.177 Beiträge seit 2006
vor 13 Jahren

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.