C# LINQ到SQL Server:不同列上相同查询的速度不同

C# LINQ到SQL Server:不同列上相同查询的速度不同,c#,sql-server,linq,C#,Sql Server,Linq,我正在通过LINQ开发一个使用SQL Server(2008 R2)的C#应用程序 我有这样一个问题: datacontex.Table.Where(e => e.id == id).OrderByDescending(e => e.<item>).FirstOrDefault(); datacontex.Table.Where(e=>e.id==id).OrderByDescending(e=>e.).FirstOrDefault(); 问题在于,查询根据我使用的不

我正在通过LINQ开发一个使用SQL Server(2008 R2)的C#应用程序

我有这样一个问题:

datacontex.Table.Where(e => e.id == id).OrderByDescending(e => e.<item>).FirstOrDefault();
datacontex.Table.Where(e=>e.id==id).OrderByDescending(e=>e.).FirstOrDefault();
问题在于,查询根据我使用的不同“项”执行不同的速度

我的意思是:如果item是“item1”,查询将在1ms内运行,但如果item是“item2”,查询将在50-200ms内运行

所有“id”、“item1”和“item2”都是非聚集索引。 唯一的区别是item1是datetime,item2是int

让这两个查询快速运行的唯一方法是将“id”索引更改为还包括“item2”

为什么会发生这种情况

编辑:有关该表的一些其他详细信息。 该表最多包含100个不同的非唯一“id”。 每个id最多有5000行。Item2不是唯一的,但对(id,Item2)是唯一的。例如:

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
ID项2项1
1        1     
1        2
1        3
[...]    [...]
1      5000
2      3000
2      3001
2      3002
[...]    [...]
2      8000
100     1001
100     1002
100     1003
[...]    [...]
100     6000

这是一个有趣的问题。我希望int列的排序速度比datetime快,因为每个键的字节数更少,因此非聚集索引上的IO更少。可能您的数据中有许多具有相同值的
item2


我建议隔离生成的SQL并在ManagementStudio中运行它。SSMS性能工具可能会揭示一些信息,请参阅。

可能是值的差异。您的
item1
是否倾向于成为少数几个值中的一个,而
item2
则更为多样化?item1是一个数字id,在一个表中最多可以复制100次(每个表最多包含500.000个项);item2是一个自动创建的时间戳。根据解释很难回答这个问题,因为我们看不到实际数据。我猜您传递的item2不是确切的类型(smalldatetime、date、datetime、datetime2甚至作为字符串传递),而是隐式转换的,导致索引丢失。请原谅,我在第一条注释中弄错了:item1(“快”)是时间戳,item2(“慢”)是int16。请使用SQL Server探查器查看要发送到SQL Server的SQL查询,并检查执行计划。这将清楚地告诉你区别在哪里。我编辑了我的原始问题,以添加有关表格的一些详细信息。