【发布时间】:2017-09-29 08:11:27
【问题描述】:
我正在使用 Oracle 11.2 并尝试在包含数百万行的表上编写分页查询。阅读其他文章,我认为我找到了最好的方法,但页码越高,它的速度就越慢。
这是我的解决方案。首先,我得到该数据页的主键值 (ID) 列表。然后我得到与这些 id 匹配的所有其他表数据。但是,这仍然运行缓慢。
SELECT *
FROM mytable
WHERE ID IN (
SELECT ID
FROM (
SELECT ID, ROWNUM rnum
FROM (
SELECT ID
FROM mytable
ORDER BY ID
) results
WHERE ROWNUM <= 1000010
)
WHERE rnum >= 1000001
)
执行时间:30+ 秒。
如果我单独执行内部查询并手动将 ids 传递给外部查询,它会更快:
SELECT ID
FROM (
SELECT ID, ROWNUM rnum
FROM (
SELECT ID
FROM mytable
ORDER BY ID
) results
WHERE ROWNUM <= 1000010
)
WHERE rnum >= 1000001
Execution Time: 0.2 seconds.
Results:
2134696,
2134697,
2134692,
2134693,
2134694,
2134695,
2134698,
2134699,
2134700,
2134701
SELECT *
FROM mytable
WHERE ID IN (
2134696,
2134697,
2134692,
2134693,
2134694,
2134695,
2134698,
2134699,
2134700,
2134701
)
Execution Time: 0.03 seconds.
第一个查询应该和其他两个查询一样快,但速度要慢得多。
谁能解释为什么会这样并提出更好的解决方案?
【问题讨论】: