2016-05-03 2 views
1

Ich entwickle eine C# -Anwendung, die einen SQL Server (2008 R2) über LINQ verwenden.LINQ to SQL Server: andere Geschwindigkeit für die gleiche Abfrage auf andere Spalte

ich eine Abfrage wie diese:

datacontex.Table.Where(e => e.id == id).OrderByDescending(e => e.<item>).FirstOrDefault(); 

Das Problem ist, dass die Abfrage unterschiedliche Geschwindigkeit auf dem unterschiedliche „item“ basierte führt verwende ich.

Ich meine dies: Abfrage läuft in 1ms, wenn das Element "item1", läuft aber in 50-200ms wenn das Element "item2"

Alle "id", "item1" und "item2" sind nicht geclusterten Index. Der einzige Unterschied ist, dass item1 ist ein Datetime, Item2 ist ein int.

Die einzige Möglichkeit, beide Abfragen schnell auszuführen, besteht darin, den Index "id" so zu ändern, dass er auch "item2" enthält.

Warum das passiert?

BEARBEITEN: einige andere Details über die Tabelle. Die Tabelle enthält bis zu 100 verschiedene, nicht eindeutige "id". Für jede ID gibt es bis zu 5000 Zeilen. Item2 ist nicht eindeutig, aber die Paare (id, item2) sind eindeutig. Beispiel:

ID  ITEM2   ITEM1 
1  1  <auto generated timestamp> 
1  2 
1  3 
[...] [...] 
1  5000 

2  3000 
2  3001 
2  3002 
[...] [...] 
2  8000 

100  1001 
100  1002 
100  1003 
[...] [...] 
100  6000 
+0

Könnte die Varianz in den Werten sein. Ist dein 'item1' tendenziell einer von wenigen Werten, während' item2' vielfältiger ist? – juharr

+0

item1 ist eine numerische ID und kann bis zu 100 Mal in einer Tabelle dupliziert werden (jede Tabelle enthält bis zu 500.000 Elemente); item2 ist ein automatisch erstellter Zeitstempel. – ElmoDev001

+0

Dies ist aufgrund von Interpretationen schwierig zu beantworten, da wir die tatsächlichen Daten nicht sehen können. Meine Annahme ist, dass das von Ihnen übergebene item2 nicht vom genauen Typ ist (smalldatetime, date, datetime, datetime2 oder sogar als String übergeben) und implizit konvertiert wird, was zum Verlust des Index führt. –

Antwort

1

Es ist ein interessantes Problem. Ich würde erwarten, dass die int-Spalte schneller als die datetime sortiert, da es weniger Bytes pro Schlüssel und somit weniger IO im nicht-gruppierten Index gibt. Vielleicht haben Ihre Daten viele item2 Zeilen mit dem gleichen Wert?

Ich würde vorschlagen, das SQL zu isolieren, das generiert wird, und es in Management Studio auszuführen. Die SSMS-Performance-Tools können etwas enthüllen, siehe https://msdn.microsoft.com/en-us/library/ff650689.aspx.

+0

Ich habe meine ursprüngliche Frage bearbeitet, um einige Details zur Tabelle hinzuzufügen. – ElmoDev001

Verwandte Themen