加速 SQL 到 Linq ToList
我有一个大约有 380,000 行的 SQL 表。
在 SQL SMSS 中,我执行此查询:
SELECT Longitude, Latitude, street FROM [Stops].[dbo].[Members]
WHERE ABS(Latitude - 51.463419) < 0.005 AND ABS(Longitude - 0.099) < 0.005
它几乎立即返回大约 20 个结果。
我有一个 WCF Web 服务将我的数据公开给我的 Windows 手机应用程序:
public class Service1 : IService1
{
double curLatitude = 51.463;
double curLongitude = 0.099;
public List<Member> GetMembers()
{
DataClassesDataContext db = new DataClassesDataContext();
var members = from member in db.Members
where (Convert.ToDouble(member.Latitude) - curLatitude) < 0.005 && (Convert.ToDouble(member.Longitude) - curLongitude) < 0.005
select member;
return members.ToList();
}
}
我相信它正在执行相同的查询,但还将项目添加到列表中。
问题是,这需要 7 分钟以上,然后我遇到一些奇怪的异常,所以永远不会完成。 VS2010 中的 WCF 服务测试器在执行此操作时会填满内存并使用大量 CPU。 我的感觉是 ToList 正在做一些奇怪的事情?
I have a SQL table with about 380,000 rows.
In SQL SMSS I perform this query:
SELECT Longitude, Latitude, street FROM [Stops].[dbo].[Members]
WHERE ABS(Latitude - 51.463419) < 0.005 AND ABS(Longitude - 0.099) < 0.005
It returns about 20 results almost instantly.
I have a WCF webserice to expose my Data to my Windows phone application:
public class Service1 : IService1
{
double curLatitude = 51.463;
double curLongitude = 0.099;
public List<Member> GetMembers()
{
DataClassesDataContext db = new DataClassesDataContext();
var members = from member in db.Members
where (Convert.ToDouble(member.Latitude) - curLatitude) < 0.005 && (Convert.ToDouble(member.Longitude) - curLongitude) < 0.005
select member;
return members.ToList();
}
}
I beleive it is doing the same query, but also adding the items to a List.
The problem is, is that it takes 7+ minutes then I get some strange exception so never completes. The WCF service tester in VS2010 just fills up with memory and uses lots of CPU when permforming this.
My feeling is that the ToList is doing something odd?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您的 LINQ 版本中缺少abs-部分。
一些旁注。
您可以通过至少两种可能的方式跟踪 SQL 查询。
TextWriter
)并检查 Visual Studio 中的输出窗口。您应该处置您的 DataClassesDataContext,最好的方法是将其放在 using 块中:
You are missing the abs-part in your LINQ version.
Some side notes.
You can track the SQL query in at least two possible ways.
db.Log = Console.Out;
(or anotherTextWriter
) and check the output window in Visual Studio.You should dispose your DataClassesDataContext, the best way is to put it in a using block:
这里有很多问题:(
所以;首先要做的就是确定时间都花在哪里了。
任何或所有这些可能这里需要优化。
There are a number of issues here:
So; the first thing to do is identify where the time is going.
Any or all of those might need optimising here.