LINQ to SQL并配置它不使用TOP

时间:2013-04-24 21:03:04

标签: sql-server linq linq-to-sql

我们在代码中使用带有linq到sql的SQL Server 2005。

我们注意到在以下情况下使用TOP 300时,速度减慢(3分钟而不是4次返回100次记录)。

SELECT TOP (300) {fields HERE} FROM {database} WHERE {where clauses with a nested select} ORDER BY {order by values}

这是由linq创建的,因为.Skip(0).Take(300).ToList<>()被调用。

当.Skip(300).Take(300).ToList<>()被调用时,linq将其转换为ROW_NUMBER而不是TOP,并且问题被消除。

linq有没有使用TOP的解决方法?

我已经阅读了一些关于TOP问题的博客,当你在TOP或101以上的记录中使用tempdb进行排序而不是在内存中。

2 个答案:

答案 0 :(得分:0)

我们之前使用TOP很多,之前从未遇到过性能问题。

也许你刚刚遇到“ARITHABORT默认关闭”问题?

在选择之前致电:

new SqlCommand("SET ARITHABORT ON", connection).ExecuteNonQuery();

答案 1 :(得分:0)

我有一个电影数据库(注册了50,000部电影)。我将这个列表带到网页的方式是寻呼机。逻辑完全在SQL中生成

WITH ct1 as
(
    SELECT ROW_NUMBER() OVER(ORDER BY some condition) num,
    {my fields}
)
SELECT {my fields} FROM ct1 
WHERE num BETWEEN (@PageNum - 1) * @ItemsPerPage + 1 
AND @PageNum * @ItemsPerPage

超过50,000条记录不到一秒钟。