关于LinQ分页效率问题

gxingmin 2011-05-31 03:51:34
分页查第90-100条中的10条
Linq代码如下:
var movies = (from m in db.Movies
where m.ReleaseDate > new DateTime(1904, 6, 1)
orderby m.ID
select m).Skip(90).Take(10);
return View(movies.ToList());


我跟踪Linq的SQL语句是

--LinQ SQL
SELECT TOP 10 A.*
FROM ( SELECT
* ,
ROW_NUMBER() OVER ( ORDER BY sd_Key ASC ) ROWS
FROM dbo.sys_Dictionary
) A
WHERE A.ROWS > 90


而我们以前用ADO.Net调用SQL语句查询的SQL语句是

--ADO.Net手动传入的SQL
SELECT A.*
FROM ( SELECT TOP 100
* ,
ROW_NUMBER() OVER ( ORDER BY sd_Key ASC ) ROWS
FROM dbo.sys_Dictionary
) A
WHERE A.ROWS > 90


很明显当表中记录很大时,后面的sql语句比linq的sql语句效率高
刚用linq,不知道我理解的对不对,请指教。
...全文
526 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
gxingmin 2011-06-02
  • 打赏
  • 举报
回复
是啊,用变量
 public static DataTable GetTableByWhere(int PageSize, int PageIndex)
{
string strSQL = string.Format(@"SELECT TOP {1} *,
ROW_NUMBER() OVER ( ORDER BY sd_Key ASC ) ROWS
FROM dbo.sys_Dictionary
) A
WHERE A.ROWS > {1}", PageIndex * PageSize, (PageIndex-1) * PageSize);
....
}


不管跳过几页查询,用top总比不用top全部查出来效率高点吧
claymore1114 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 gxingmin 的回复:]
不管跳过几页查询,用top总比不用top全部查出来效率高点吧
[/Quote]
对数据库 不是 很了解,应该不是这样的吧,这个 还跟 cpu 内存 都有关系。
还有 那个子集全部查出 ,应该 跟外面不是分开的吧,要不然 光你那个 全部查出 也不只10m吧。
你的第二种写法 还是比较少的 坐等 高手来 讲解。
gxingmin 2011-06-01
  • 打赏
  • 举报
回复
写错了不是毫秒(ms)
是一个10秒左右,一个4秒左右
namhyuk 2011-06-01
  • 打赏
  • 举报
回复
--ADO.Net手动传入的SQL
SELECT A.*
FROM ( SELECT TOP 100
* ,
ROW_NUMBER() OVER ( ORDER BY sd_Key ASC ) ROWS
FROM dbo.sys_Dictionary
) A
WHERE A.ROWS > 90


从来没用SQL语句分页过。等于我问楼主问题了:-)

如果要跳过180个记录,再取10个, 那SELECT TOP 100改成SELECT TOP 190 *, ... WHERE A.ROWS>180?
那要跳过3600时,再SELECT TOP 3700 *,... where a.rows>3600?

SELECT A.*
FROM ( SELECT TOP 100 * ,
ROW_NUMBER() OVER ( ORDER BY sd_Key ASC ) ROWS
FROM dbo.sys_Dictionary
) A
WHERE A.ROWS > 90

也就是说这个红色部分在实际应用中全是变量?
gxingmin 2011-05-31
  • 打赏
  • 举报
回复
怎么叫武断呢,是用数据说话的,一个用10ms,一个用4ms
kingdom_0 2011-05-31
  • 打赏
  • 举报
回复
[Quote=引用楼主 gxingmin 的回复:]
分页查第90-100条中的10条
Linq代码如下:
C# code
var movies = (from m in db.Movies
where m.ReleaseDate > new DateTime(1904, 6, 1)
orderby m.ID
……
[/Quote]
虽然LINQ分页的底层也是用SQL语句来实现分页,但是从这两个SQL语句上就判断是否有点儿武断啊。
claymore1114 2011-05-31
  • 打赏
  • 举报
回复
linq 生成的效率高点吧。 没测试过
HDNGO 2011-05-31
  • 打赏
  • 举报
回复
基本上不用linq直接去数据库取数据。。。。
公司的策略不允许。。。
gxingmin 2011-05-31
  • 打赏
  • 举报
回复
不是linq比sql慢的问题,我是说linq内部用到sql语句(应该也是拼的吧)和咱们手写的sql语句的效率问题,我想是不是因为我写的linq分页代码不对才导致它拼的sql语句效率低?
porschev 2011-05-31
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 gxingmin 的回复:]

引用 1 楼 hdngo 的回复:
你的表能有多大?

目前有几十万条吧,我比较了一下,差了一倍多的时间
[/Quote]

那是慢了太多了。。。
porschev 2011-05-31
  • 打赏
  • 举报
回复

写个循环插个百万条测式数据。。

把两个sql语句放进去。。

看看到底哪个快些。。。

linq比sql慢点其实可以理解。。。

gxingmin 2011-05-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hdngo 的回复:]
你的表能有多大?
[/Quote]
目前有几十万条吧,我比较了一下,差了一倍多的时间
gxingmin 2011-05-31
  • 打赏
  • 举报
回复
[Quote=引用楼主 gxingmin 的回复:]
分页查第90-100条中的10条
Linq代码如下:

C# code
var movies = (from m in db.Movies
where m.ReleaseDate > new DateTime(1904, 6, 1)
orderby m.ID
……
[/Quote]

目前有几十万条吧,我比较了一下,差了一倍多的时间
xpcxpy 2011-05-31
  • 打赏
  • 举报
回复
Linq的方式是否可理解为 数据先取出来,缓存?
gxingmin 2011-05-31
  • 打赏
  • 举报
回复
呵呵,我上面列的linq实体和下面sql语句表不对应,应该是
var dicts = (from m in db.sys_Dictionary
orderby m.sd_Key
select m).Skip(90).Take(10);



HDNGO 2011-05-31
  • 打赏
  • 举报
回复
你的表能有多大?

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧