2

我们在代码中使用带有 linq to 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 进行排序而不是在内存中进行排序。

4

2 回答 2

0

我们经常使用 TOP,以前从未遇到过性能问题。

也许您只是遇到“ARITHABORT 默认关闭”的问题?

在您选择之前致电:

new SqlCommand("SET ARITHABORT ON", connection).ExecuteNonQuery();
于 2013-04-24T22:14:18.843 回答
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 条记录只需不到一秒钟的时间。

于 2013-04-25T12:24:03.613 回答