我们在代码中使用带有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进行排序而不是在内存中。
答案 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条记录不到一秒钟。