sql – LINQ联接 – 性能
我很好奇LINQ(而不是LINQ to SQL)的表现是如何在Sql Server执行连接的情况下加入幕后的.
Sql Server在执行查询之前,生成执行计划.执行计划基本上是一个表达式树,它认为它是执行查询的最佳方式.每个节点都提供有关是否执行排序,扫描,选择,加入等信息. 在我们的执行计划中的“加入”节点上,我们可以看到三种可能的算法;散列连接,合并连接和嵌套循环连接. Sql Server将根据Inner表和外表中的预期行数,我们正在做什么类型的连接(某些算法不支持所有类型的连接),是否需要数据排序,以及可能是很多其他因素. 加入算法: 嵌套循环连接: 合并加入: 哈希加入: LINQ查询: DataTable firstTable,secondTable; ... var rows = from firstRow in firstTable.AsEnumerable () join secondRow in secondTable.AsEnumerable () on firstRow.Field<object> (randomObject.Property) equals secondRow.Field<object> (randomObject.Property) select new {firstRow,secondRow}; SQL查询: SELECT * FROM firstTable fT INNER JOIN secondTable sT ON fT.Property = sT.Property 如果Sql Server知道每个表中有少量行,则可以使用嵌套循环连接,如果知道其中一个表有索引,则使用合并连接,如果知道任何一个表上有很多行,则使用散列连接表,既没有索引. Linq是否选择其连接算法?还是总是使用一个? 解决方法Linq to SQL不会向服务器发送连接提示.因此,使用Linq to SQL的连接的性能将与“直接”发送到服务器(即使用纯ADO或SQL Server Management Studio)的相同连接的性能相同,而不指定任何提示.Linq to SQL也不允许你使用连接提示(据我所知).因此,如果要强制使用特定类型的连接,则必须使用存储过程或Execute [Command | Query]方法执行此操作.但是,除非您通过编写INNER [HASH | LOOP | MERGE] JOIN来指定连接类型,否则SQL Server总是选择它认为最有效的连接类型 – 查询的来源无关紧要. 其他Linq查询提供程序(如Entity Framework和NHibernate Linq)将完成与Linq to SQL完全相同的操作.这些都没有直接了解您如何索引数据库,因此他们都没有发送连接提示. Linq to Objects有点不同 – 它(几乎?)总是在SQL Server用语中执行“散列连接”.这是因为它缺少进行合并连接所需的索引,并且散列连接通常比嵌套循环更有效,除非元素的数量非常小.但是确定IEnumerable< T>中的元素数量.可能首先需要完整的迭代,因此在大多数情况下,假设最差并使用散列算法会更快. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- sqlserver中游标的使用
- sqlserver数据导入mysql一: 创建mysql数据库 perl脚本
- sql – 多个日期范围之间的分钟总和
- DBCC大全集之(适用版本MS SQLServer 2008 R2)----DBCC TR
- sql-server – 如何通过Internet向世界公开SQL 2008数据库?
- sqlserver,oracle,mysql分页查询通用sql
- 如何使用MS SQL Server Managment Studio删除SQL数据库表中
- SqlServer 查询指定时间是当前年哪个月当前月哪个周
- asp.net Excel转换为SQL Server的方法
- 在postgres中为数据库提供别名