Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将SQL加速到Linq ToList_C#_Sql_Linq_Linq To Sql_.net 4.0 - Fatal编程技术网

C# 将SQL加速到Linq ToList

C# 将SQL加速到Linq ToList,c#,sql,linq,linq-to-sql,.net-4.0,C#,Sql,Linq,Linq To Sql,.net 4.0,我有一个SQL表,大约有380000行 在SQL SMSS中,我执行以下查询: SELECT Longitude, Latitude, street FROM [Stops].[dbo].[Members] WHERE ABS(Latitude - 51.463419) < 0.005 AND ABS(Longitude - 0.099) < 0.005 从[Stops].[dbo].[Members]选择经度、纬度和街道 其中ABS(纬度-51.463419)

我有一个SQL表,大约有380000行

在SQL SMSS中,我执行以下查询:

 SELECT Longitude, Latitude, street FROM [Stops].[dbo].[Members]   
 WHERE ABS(Latitude - 51.463419) < 0.005 AND ABS(Longitude - 0.099) < 0.005 
从[Stops].[dbo].[Members]选择经度、纬度和街道
其中ABS(纬度-51.463419)<0.005,ABS(经度-0.099)<0.005
它几乎立即返回大约20个结果

我有一个WCF webserice可将我的数据公开给我的Windows phone应用程序:

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();
    }
}
公共类服务1:IService1
{
双卷曲度=51.463;
双卷曲度=0.099;
公共列表GetMembers()
{
DataClassesDataContext db=新DataClassesDataContext();
var members=来自db.members中的成员
其中(转换为双(成员纬度)-卷曲度)<0.005和(转换为双(成员经度)-卷曲度)<0.005
选择成员;
return members.ToList();
}
}
我相信它也在做同样的查询,但也在将项目添加到列表中

问题是,这需要7分钟以上的时间,然后我会遇到一些奇怪的异常,因此无法完成。VS2010中的WCF service tester只是填满了内存,并且在填充时使用了大量CPU。
我的感觉是ToList做了一些奇怪的事情?

您的LINQ版本缺少abs部分

一些旁注。
您可以通过至少两种可能的方式跟踪SQL查询

  • 使用SQL profiler并在那里检查查询(然后可以在SQL Management Studio中粘贴查询,并将输出与上面的查询进行比较)
  • 插入
    db.Log=Console.Out
    (或另一个
    TextWriter
    )并检查Visual Studio中的输出窗口
  • 您应该处理DataClassesDataContext,最好的方法是将其放在using块中:

    public List<Member> GetMembers()
    {
        using(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();
        }
    }
    
    public List GetMembers()
    {
    使用(DataClassesDataContext db=newdataclassesdatacontext())
    {
    var members=来自db.members中的成员
    其中(换算为双(成员纬度)-卷曲度)<0.005
    &&(转换为双(成员经度)-卷曲度)<0.005
    选择成员;
    return members.ToList();
    }
    }
    
    这里有许多问题:

    • (编辑:忽略这一点;我将380000错误地理解为正在获取的数据)这是一个非常大的数据量,需要通过网络查询和传输;例如,在查询分析器中需要多长时间?在任何地方都至少需要这么长时间
    • 当将其加载到LINQ to SQL时,您会有物质化开销和标识管理器开销;后者可以通过禁用数据上下文上的对象跟踪来解决;前者更为棘手——如果你怀疑这一点很重要(有时可能是),那么也许像“dapper”这样的东西可以将其加载(它有一个更高效的materialiser,并且不包括身份管理器)
    • WCF必须序列化这些数据,这可能需要相当多的CPU和内存,然后需要通过网络传输(这需要带宽)。如果您可以随意更改格式,其他序列化程序可能会在此处节省CPU和带宽
    所以,;首先要做的是确定时间的去向

    • 我将从查询分析器运行它开始;可能缺少索引
    • 将ObjectTrackingEnabled设置为false
    • 然后,将数据访问与WCF分开,看看哪一个是罪魁祸首—时间只是数据到列表步骤
    • 之后,time DataContractSerializer序列化此数据,并在序列化时测量数据的大小(我个人会将其与protobuf net进行比较,但这可能不是一个选项,取决于您的场景)
    • 然后测量网络上的时间

    任何或所有这些都可能需要在此处进行优化。

    是的,我添加了Math.Abs。马上就可以加载了。否则,它可能会返回6000个结果。我现在觉得自己很傻:——)@Ash,去掉腹肌会让半个世界或者类似的东西得到回报。返回10万条记录比返回7条记录花费的时间多得多。abs部件将其缩小到非常接近实际位置的点。将其放在块中处理有什么好处?@DanSewell在处理DataContext时,底层的
    DbConnection
    立即关闭。否则,sql连接可能处于打开状态,但未使用。谢谢您的评论。结果是我用C#查询时返回的结果太多了。什么是查询分析器?我还没有找到。@Dan Query Analyzer是SQL Server Management Studio的旧名称(对不起,我的不好),编写、测试和优化SQL queriesQuery Analyzer的理想工具是一个旧工具,现在已被SQL Management Studio取代。啊,是的,我正在使用SSMS(也称为!)我在这里有点困惑,因为我的C#中的SQL到Linq查询与普通SQL查询不同。SSM会理解这一点吗?只需补充一点:您可能想看看“实时”分析工具;例如,我们使用(并编写了)“mvc mini profiler”来确保我们始终可以直接访问数据库的每个查询,以及参数值、计时、行计数、重复等。然后我们可以进行简单的检查,以查看是否发生了意外情况。而且影响几乎为零(这是必须的;我们对性能非常非常挑剔)。例如,我可以一目了然地告诉您有多少SQL查询(以及哪个TSQL)用于构建此页面,以及每个查询花费了多长时间。