Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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# 如何使包含多个谓词条件的Linq到SQL查询更快?_C#_Sql Server_Performance_Linq To Sql - Fatal编程技术网

C# 如何使包含多个谓词条件的Linq到SQL查询更快?

C# 如何使包含多个谓词条件的Linq到SQL查询更快?,c#,sql-server,performance,linq-to-sql,C#,Sql Server,Performance,Linq To Sql,当我从代码执行此查询时,其执行速度比从SQLServerManagementStudio执行等效SQL时慢3倍 代码 var myDataContext=new AccessMyDatabaseDataContext(); myDataContext.ObjectTrackinEnabled=false; var schedule=(从myDataContext.MyTable中的s) 其中s.日期>=起始日期 &&s.Date始终通过注销SQL或启动SQL profiler来检查生成的SQL查

当我从代码执行此查询时,其执行速度比从SQLServerManagementStudio执行等效SQL时慢3倍

代码
var myDataContext=new AccessMyDatabaseDataContext();
myDataContext.ObjectTrackinEnabled=false;
var schedule=(从myDataContext.MyTable中的s)
其中s.日期>=起始日期

&&s.Date始终通过注销SQL或启动SQL profiler来检查生成的SQL查询。我猜生成的SQL不会太差。您可能会浪费时间的原因如下:

  • 由于对象物化,ERM框架总是有点慢。如果不需要所有字段,请引入.Select()子句以仅选择实际需要的部分。通常,序列化到非实体类型(例如,到匿名类型)会更快

  • 解析表达式树可能会花费相当多的时间。Linq2Sql中有一个编译查询的概念,它只会第一次解析表达式树。您启用了此功能吗?有许多教程介绍如何执行此操作

  • 这样说,对于ERM框架来说,3的因素不是非典型的。根据您所需要的,您可以考虑EntityFrmaework是否更快。可选地,有一些超轻的ERM框架被优化用于查询性能,但是对于管理对象来说不是很好。


    作为最后一种选择,EntityFramework(可能还有Linq2Sql)允许您获取直接SQL字符串。您可以使用此字符串加载数据表。

    始终通过注销SQL或启动SQL探查器来检查生成的SQL查询。我猜生成的SQL不会太差。您可能会浪费时间的原因如下:

  • 由于对象物化,ERM框架总是有点慢。如果不需要所有字段,请引入.Select()子句以仅选择实际需要的部分。通常,序列化到非实体类型(例如,到匿名类型)会更快

  • 解析表达式树可能会花费相当多的时间。Linq2Sql中有一个编译查询的概念,它只会第一次解析表达式树。您启用了此功能吗?有许多教程介绍如何执行此操作

  • 这样说,对于ERM框架来说,3的因素不是非典型的。根据您所需要的,您可以考虑EntityFrmaework是否更快。可选地,有一些超轻的ERM框架被优化用于查询性能,但是对于管理对象来说不是很好。


    作为最后一种选择,EntityFramework(可能还有Linq2Sql)允许您获取直接SQL字符串。您可以使用此字符串加载DataTable。

    DbContext的生存期是不断描述的。当我替换类变量DbContext时,我注意到了一个很大的改进(重复获取2个连接表中所有数据的测试循环从7分钟减少到4.3秒)

    我相信任何复杂的SQL在存储过程中都会更好。RDBMS只需对其进行一次优化。您只需返回所需的行。SQL Server中有许多资源可以帮助优化查询,例如


    经常被忽略的是SQLServerManagementStudio(于2005年推出)的数据库报告功能。右键单击对象资源管理器中的数据库名称,然后选择Reports->Standard Reports->any report。对这些报告进行实验。我找到了这个网站。

    对DbContext的生存期进行了详细描述。当我替换类变量DbContext时,我注意到了一个很大的改进(重复获取2个连接表中所有数据的测试循环从7分钟减少到4.3秒)

    我相信任何复杂的SQL在存储过程中都会更好。RDBMS只需对其进行一次优化。您只需返回所需的行。SQL Server中有许多资源可以帮助优化查询,例如


    经常被忽略的是SQLServerManagementStudio(于2005年推出)的数据库报告功能。右键单击对象资源管理器中的数据库名称,然后选择“报表->标准报表->任意报表”。对报表进行实验。我找到了此网站。

    我经常使用存储过程来处理复杂的SQL。性能提升是值得的。问题是
    myDataContext
    已过时。请使用var myD将代码包装到
    ataContext=new AccessMyDatabaseDataContext(){}
    向我们显示您在SQL Server Management Studio中运行的等效SQL,以及您在该表上的索引和该表的结构。您确定Select top1来自此查询而非foreach()吗在列表的内容上,您正在引用一些相关的实体信息。从这个查询的内容中,我会非常惊讶地看到N个select top 1语句。@PeterBill:我想我也必须这样做。我用“使用包装”尝试了它但执行时间几乎是一样的…@Pleun:在阅读了你的评论后,我再次校对了一遍,发现我用另一种方法访问的方式不同。事实上,我忘记了“ToList”-方法,事实上它与语句一起运行到foreach.Weekend模式-真丢脸-我现在让它更具可重用性了。我经常对复杂的SQL使用存储过程。性能提升是值得的。问题是
    myDataContext
    过时了。使用var myDataContext=new Acces将代码包装到
    中sMyDatabaseDataContext(){}
    向我们显示您在SQL Server Management Studio中运行的等效SQL,以及您在该表上的索引和该表的结构。您确定Select top1来自此查询,而不是来自您所访问的列表内容的foreach()
    var myDataContext = new AccessMyDatabaseDataContext();
                myDataContext.ObjectTrackingEnabled = false;
    var schedule = (from s in myDataContext.MyTable
                                where s.Date >= StartDate
                                && s.Date <= EndDate
                                && s.Name == "MySchedule"
                                && (s.Status.Equals("LIVE") || s.SomeOtherField.Equals("MyString"))
                                select s)
                                .ToList();