Oracle SQL:选择从某一行到另一行之间的数据

Oracle SQL:选择从某一行到另一行之间的数据,oracle,plsql,range,Oracle,Plsql,Range,我想在表中选择从第n行到第m行的行。我不想使用任何orderby,因为表数据非常庞大,有3800万。我找到了一个解决方案,使用下面的查询 SELECT * FROM (select suppliers2.*, rownum rnum from (select * from suppliers ORDER BY supplier_name) suppliers2 where rownum <= 5 ) WHERE rnum >

我想在表中选择从第n行到第m行的行。我不想使用任何orderby,因为表数据非常庞大,有3800万。我找到了一个解决方案,使用下面的查询

SELECT *
FROM (select suppliers2.*, rownum rnum from
               (select * from suppliers ORDER BY supplier_name) suppliers2
                where rownum <= 5 )
WHERE rnum >= 3;

但由于它有两个select语句,而且我的表非常大,有3800万行,我想知道是否还有其他方法不会对DB造成负担。我也可以看到我可以使用负号,但我再次看到性能的问题。我基本上想选择前一百万行并将其放入文件,然后选择第二个百万行并将其放入文件,依此类推。请帮忙。

我不清楚为什么你首先需要翻阅结果。显然,您希望获取任意100万行,将该数据放在一个文件中,再获取任意100万行,确保不会两次获取同一行,将其放在第二个文件中,然后重复此过程,直到生成38个单独的文件。发出38条单独的SELECT语句,而不是发出一条SELECT语句,让调用者简单地将它获取的第一个百万行写入一个文件,然后将它获取的第二个百万行写入第二个文件,这有什么好处

您是否正在尝试从38个独立的工作进程并行生成文件?如果是这样的话,您似乎不太可能从并行化写操作中获得太多好处,而代价是大大增加数据库必须完成的工作量。我想我可以设想这样一个系统:客户端的写入速度很慢,但很容易并行化,而服务器上的读取速度非常快,数据库服务器上有大量内存可用于排序,因此并行写入文件可能会更快。但具备这些特征的系统并不多。如果您确实想使用并行性,通常最好让客户机向数据库发出单个SELECT,并允许数据库并行运行SELECT语句


如果您决定在页面中选择结果,那么您发布的查询应该是最有效的。存在嵌套的select语句这一事实与性能分析并不特别相关。查询只会命中表一次。如果它需要获取和排序所有3800万行,以确定哪一行是第3行,哪一行是第5行,那么它可能仍然非常昂贵。而且,当您查找后续数据页时,它可能会逐渐变慢。获取行37000001-38000000至少需要读取整个表。这就是并行写入文件不太可能有帮助的一个原因——提取前几页数据可能比提取最后一页数据效率高得多,因此您将受到该查询以及通过网络提取3800万行所需时间的限制。

我不打算并行运行,但我需要一种方式,使我可以卸载100万行每38个文件,在一种方式,不征税的系统。你能不能建议一些方法,我可以做到这一点,因为这只是一次的工作,我不想投资于工具。如果不是select语句,还有其他方法吗?我们可以使用一些命令来帮助我吗?@AmitRaya-从应用程序的_表中运行一个SELECT*。打开文件1。获取一百万行,将它们写入文件1。关闭文件1。打开文件2。从同一游标中获取一百万行,将它们写入文件2。重复38次。我不想给出一个select语句,因为我觉得这对系统来说太费劲了,我知道我在翻页表格时遇到了同样的问题,我没有想到:。。唯一的想法是,我正在寻找一种方法,在不增加系统负担的情况下,将表卸载到分隔文件中。这就是我的目的,请帮助。@AmitRaya-一个SELECT语句比38个单独的SELECT语句要轻松得多,特别是因为单个语句不需要ORDER BY。如果要将3800万行数据写入文件,则无法从数据库中读取3800万行。读取3800万行并不是一件小事,但在现代硬件上也不是很多。如果我使用下面给出的Spool,作为select语句,它对系统来说仍然是同样繁重的。我很抱歉我的无知,但我对PLSQL非常陌生。spool c:\myfile.txt从my|U表中选择field1 | |'、'| | field2 | |'、'| | field3;线轴关闭-打开线轴关闭设置磁头-重新打开磁头参数