弱弱问一个DQL优化问题

[复制链接]
查看11 | 回复3 | 2020-6-8 08:30:56 | 显示全部楼层 |阅读模式
应该不少人都遇到过这样的问题吧, 在数据库中选取 位于min行和max行 之间的所有数据,
通常DQL 书写如下.
SELECT * FROM (
SELECT a,b,c,...,rownum rowcount FROM
where ... and rownum:min;
当数据达到数百万或者上千万后, 这个嵌套查询 的内部select的速度明显会随着 max的增大而变慢,
从而导致 取10-30 行和 取1000000 - 1000020 行的速度有差异,
做软件客户端的时候,让 客户觉得分页查询越往后越慢,
请问 这个尴尬的问题, 大虾们 有什么好的解决方案.
谢咯


[ 本帖最后由 bradshen 于 2008-4-5 21:59 编辑 ]
回复

使用道具 举报

千问 | 2020-6-8 08:30:56 | 显示全部楼层
这个问题是必然的
回复

使用道具 举报

千问 | 2020-6-8 08:30:56 | 显示全部楼层
能否不使用嵌套查询呢?
回复

使用道具 举报

千问 | 2020-6-8 08:30:56 | 显示全部楼层
一般来说‘选取位于min行和max行之间的所有数据’都会是在某几个字段排序后再选取的,那样调起来有一定的难度。但从你的语句看来,并没有order by的要求,所以简单一些。
由于你使用rownum,而rownum的值是在查询时生成的,所以在取1000000 - 1000020 行时必然会造成从1 - 1000020的index scan或table scan,这是查询减慢的主因。
如果将该语句的核心大表加一unique字段,而该字段值用sequence(increase by 1)来生成,并在其上建索引。那么语句可以改为
SELECT a,b,c,...,rownum rowcount FROM
where ... and 新字段:min)

如此即使在查询1000000 - 1000020 行时,也不会full scan, 最好可以进行index unique scan,最差也只是index range scan. 结果会好很多.
[ 本帖最后由 weiran11 于 2008-4-6 04:57 编辑 ]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行