LinQ Performance

17/09/2009 - 10:42 von Harald Bacik | Report spam
Hallo

Ich habe mal eine Frage zum Thema Performance mit LinQ 2 SQL Diese ist
nàmlich zum Ko

Folgenden Code verwende ich:

For i As Integer = 0 To Beschichtungen.Count - 1

Dim zVariable As Integer = i
Dim fCombination = (From Query In Combination Where _
Query.Hst_Code_Schicht1.ToLower.Trim
= _

Beschichtungen.Item(zVariable).Hst_Code_Schicht.ToLower.Trim).FirstOrDef
ault
If Not fCombination Is Nothing Then
Beschichtungen.Item(i).Zeigen fCombination.Lieferbarkeit
End If
Next

Wobei 'i' einen Wert von 19 zugewiesen bekommt. - Ergo wird diese
Schleife 19x durchlaufen. Das dauert 5 Sekunden! - Da ich mehrere
solcher Schleifen durchlaufe, betràgt die Abfrage Zeit dann so in etwa
30 Sekunden. - Was einfach viel zu lange ist. Vor LinQ hatte ich einfach
eine normale SQL Abfrage im gleichen Stil darüber laufen lassen & da war
ich mit allen Abfragen bei in etwa 1-2 Sekunden.

Woran liegt das?

Danke für jeden Tipp

Harald
 

Lesen sie die antworten

#1 Elmar Boye
17/09/2009 - 13:42 | Warnen spam
Hallo Harald,

Harald Bacik schrieb:
Ich habe mal eine Frage zum Thema Performance mit LinQ 2 SQL Diese ist
nàmlich zum Ko



Da kann man nur sagen: Nicht den Boten aufhàngen ;-)
Folgenden Code verwende ich:

For i As Integer = 0 To Beschichtungen.Count - 1

Dim zVariable As Integer = i
Dim fCombination = (From Query In Combination Where _
Query.Hst_Code_Schicht1.ToLower.Trim
= _

Beschichtungen.Item(zVariable).Hst_Code_Schicht.ToLower.Trim).FirstOrDef
ault
If Not fCombination Is Nothing Then
Beschichtungen.Item(i).Zeigen > fCombination.Lieferbarkeit
End If
Next



Zu àhnlichem Code hatte ich Dir vor Wochen schon geschrieben,
dass das nicht besonders effizient ablaufen kann.
Nur ohne die Datenstrukturen vorliegen zu haben,
kann man nur mit sehr vagen Vermutungen operieren.


Wobei 'i' einen Wert von 19 zugewiesen bekommt.



Deine Schleife führt zu der entsprechenden Anzahl von Abfragen (also 19 usw).
was aus sich von SQL niemals effizient ist. Eine Abfrage sollte hier eher
alle möglichen Kombinationen liefern und die Suche gegen diese Werte im
Speicher erfolgen.

Hinzukommt, das etwas wie Hst_Code_Schicht1.ToLower.Trim die Verwendung
von Indizes beim SQL Server verhindert, so sie denn vorhanden sind und
bis hin zu einem vollstàndigen Table Scan führen kann (nicht muß!),
also die ganze Tabelle abgeklappert wird.

Zudem müssen sie jedes Mal neu kompiliert, sprich in eine SQL Abfrage verwandelt
werden, was sich durch kompilierte Abfragen vermeiden làßt:
<URL:http://msdn.microsoft.com/de-de/lib...5.aspx>

- Ergo wird diese
Schleife 19x durchlaufen. Das dauert 5 Sekunden! - Da ich mehrere
solcher Schleifen durchlaufe, betràgt die Abfrage Zeit dann so in etwa
30 Sekunden. -



Und am Ende bist du so vielleicht sogar noch gut bedient,
Denn werden die Daten mehr, kann das überproportional anwachsen.

Was einfach viel zu lange ist. Vor LinQ hatte ich einfach eine normale
SQL Abfrage im gleichen Stil darüber laufen lassen & da war
ich mit allen Abfragen bei in etwa 1-2 Sekunden.



Vermutlich sah das Endergebnis dort doch ein klein wenig anders aus.
Denn eine eins zu eins Übersetzung von obigem Code in SQL sàhe
sehr scheusslich aus ;-)

Gruß Elmar

Ähnliche fragen