高效查询数据库以获取大量数据

Kra*_*ken 2 performance oracle query

这是我的查询

SELECT *
FROM
    (
        SELECT a.*, rownum rnum
        FROM
            (
                SELECT id, data
                FROM t
                ORDER BY id
            ) a
       WHERE rownum <= HIGHER
    )
WHERE rnum >= LOWER;
Run Code Online (Sandbox Code Playgroud)

我有大量数据,因此我一次获取其中的一部分,比如第一次尝试从 1 到 100,第二次尝试从 101 到 200,依此类推。

如果我执行上面的查询,它将对每个数据部分执行以下操作:

SELECT id, data
FROM t
ORDER BY id
Run Code Online (Sandbox Code Playgroud)

我认为对每个部分都这样做效率很低。我不能做一些像订购我的数据集并应用 rownum 之类的事情吗?它会有任何用处吗?

Jus*_*ave 5

您是否打算最终获得每一行?例如,您是否获取所有行并将它们传递给某种需要处理每一行的进程?或者您打算将结果页面呈现给可能只查看第一页或第二页结果的人。

假设您将结果呈现给只会查看前几页数据的人员,那么您的查询可能相当有效。假设id列上有一个索引,为了获取第 101-200 行,Oracle 只需id从索引中读取前 200 个值,然后过滤掉第 1-100 行。这不如获得第一页结果那么有效,但它仍然非常有效。

当然,随着您越来越深入地了解数据,分页查询的效率会越来越低。如果您的意图是最终获取每一行,那将是一个问题。但是,如果您将结果呈现给人类,这通常不是问题。人类并不真正关心获取结果集的第 50 页需要多长时间——他们会在此之前很久就放弃。

如果您打算将数据发送到 Java 进程来处理数据(这将比处理数据库中的数据效率低得多——Oracle 和 PL/SQL 是专门为处理大量数据而设计的),它会通常情况下,发出一个没有ORDER BY.