【发布时间】:2011-10-19 22:19:44
【问题描述】:
我得到了一个非常简单的 LINQ 查询:
List<table> list = ( from t in ctx.table
where
t.test == someString
&& t.date >= dateStartInt
&& t.date <= dateEndInt
select t ).ToList<table>();
被查询的表有大约 3000 万行,但列 test 和 date 被索引。
当它应该返回大约 5000 行时,需要几分钟才能完成。
我还检查了 LINQ 生成的 SQL 命令。 如果我在 SQL Server 上运行该命令,则需要 2 秒才能完成。
这里的 LINQ 有什么问题? 这只是一个非常简单的查询,没有任何连接。
这是 SQL Profiler 显示的查询:
exec sp_executesql N'SELECT [t0].[test]
FROM [dbo].[table] AS [t0]
WHERE ([t0].[test] IN (@p0)) AND ([t0].[date] >= @p1)
AND ([t0].[date] <= @p2)',
N'@p0 nvarchar(12),@p1 int,@p2 int',@p0=N'123test',@p1=110801,@p2=110804
编辑:
真的很奇怪。在测试时,我注意到它现在要快得多。 LINQ 查询现在需要 3 秒来处理大约 20000 行,这还不错。
更令人困惑的是: 这与我们的生产服务器上的行为相同。一个小时前真的很慢,现在又快了。当我在开发服务器上进行测试时,我没有在生产服务器上进行任何更改。我能想到的唯一问题是两台服务器都是虚拟化的,并且与许多其他服务器共享 SAN。
我怎样才能知道这是否是问题所在?
【问题讨论】:
-
SQL Server 将缓存查询,因此您可能执行的测试不公平。
-
你看过执行计划了吗?索引是否碎片化?
-
使用 SQL Server Profiler 查看真正执行的查询。
-
我不明白的是,我们得到了另一个包含大约 6 亿行的巨大表,并且对该表的查询只需一秒钟(使用 LINQ)。差异从何而来?我从未使用过 SQL Server Profiler,但我现在就试试。
-
table的构造函数中有什么?它的属性设置器中发生了什么?
标签: c# linq performance datacontext