【广告贴】【SQL 效率】选出10000000-10000010行的结果,怎么写?Oracle(Sql Server / Access 如能做到高效也有分)

easyweb 2006-09-07 11:24:30
借人气发个广告贴,见:
http://community.csdn.net/Expert/topic/5005/5005002.xml?temp=.4698908

===========================================================

老话重提了,原帖分析语法,见:
http://community.csdn.net/Expert/topic/4788/4788401.xml?temp=.3034632

问题概要:现在分析效率,要选出海量记录中的一段,以下方案中居然只有MySQL能做到高效执行,望达人指教。

【方案1】Oracle by 楼主
select (
select (
select * from xxx
) where rowid < 10000010
) where rowid > 10000000;

问题:如果选择的是100到110行,很快,但如果是10000000到10000010行,暴慢无比。复杂度是前者的100000倍。我认为应该有复杂度相等的方法才对。

【方案2】MSSQL/Access(1) by liuxiaoyi666(MSMVP小猪妹马甲之八卦兔子) 信誉:126
select top 110 * from tab where id not in(select top 100 id from tab order by id) order by id

问题:where id not in(...)语句效率是集合操作,效率比Oracle的挨个数值比较还要低。

【方案3】MSSQL/Access(2) by 123xie(xie)
str="select top 110 * from tab order by id desc"
rs.open str
rs.move(100)

问题:数据库需要把1000010行数据全部返回给应用服务器(如iis),效率极低。

【方案4】MySQL by 楼主
select * from xxxx limit x1, x2

目前最佳方案,MySQL内置支持,效率好像还比较高,没有拿海量数据测试过。
...全文
159 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
dashi 2006-09-14
  • 打赏
  • 举报
回复
Oracle 我一共16777216(2^N,不停地insert select from得到)条数据 SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT A, B, C FROM TBL_TEST) A WHERE ROWNUM <= 16777216) WHERE RN >= 16777210 SELECT * FROM (SELECT ROWNUM PGRN, A, B, C FROM TBL_TEST) WHERE PGRN BETWEEN 16777210 AND 16777216 这两个都是9秒左右,后者并没有因为少一次select而变得更快 SELECT * FROM (SELECT ROWNUM PGRN, A, B, C FROM TBL_TEST) WHERE PGRN >= 16777210 AND PGRN <= 16777216 这个10秒左右。 当然,上面的海量数据量显然一般应用是不会出现的。在10w数量级的条件下,速度还是很快的。
easyweb 2006-09-14
  • 打赏
  • 举报
回复
re
easyweb 2006-09-11
  • 打赏
  • 举报
回复
re
shine333 2006-09-08
  • 打赏
  • 举报
回复
Oracle
我一共16777216(2^N,不停地insert select from得到)条数据

SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT A, B, C FROM TBL_TEST) A WHERE ROWNUM <= 16777216) WHERE RN >= 16777210

SELECT * FROM (SELECT ROWNUM PGRN, A, B, C FROM TBL_TEST) WHERE PGRN BETWEEN 16777210 AND 16777216

这两个都是9秒左右,后者并没有因为少一次select而变得更快

SELECT * FROM (SELECT ROWNUM PGRN, A, B, C FROM TBL_TEST) WHERE PGRN >= 16777210 AND PGRN <= 16777216

这个10秒左右。

当然,上面的海量数据量显然一般应用是不会出现的。在10w数量级的条件下,速度还是很快的。
easyweb 2006-09-08
  • 打赏
  • 举报
回复
re

23,407

社区成员

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

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