C# LINQ到SQL Server:不同列上相同查询的速度不同
我正在通过LINQ开发一个使用SQL Server(2008 R2)的C#应用程序 我有这样一个问题: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(); 问题在于,查询根据我使用的不
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查询,并检查执行计划。这将清楚地告诉你区别在哪里。我编辑了我的原始问题,以添加有关表格的一些详细信息。