-1

我正在研究一个数据库,其中行数高于 1,000,000。我有我的选择语句,但如果我开始使用 fetchall,我很快就会耗尽内存。这是我的2个问题:

  1. 由于我不知道要启动的数据库的确切大小,有没有办法在不执行 fetchall 的情况下找出数据库的大小?计算机实际上无法支持它。

  2. 有没有什么办法可以提取数据库的某个块,可能一次处理 5,000 个,而不是为每一行做一个单独的 fetchrow?我刚刚完成了一个测试,并且逐行进行,它看起来每 1000 行工作将近 4 分钟,而老板对一个需要将近 3 天才能完成的程序并不看好。

这是我的代码:

while ($i < $rows)
{
    if ($i + $chunkRows < $rows)
    {
        for ($j = 0; $j < $chunkRows; $j++)
        {
            @array = $sth->fetchrow();
            ($nameOne, $numberOne, $numberTwo) = someFunction($lineCount,@array,$nameOne,$numberOne, $numberTwo);
        }
    }
    else #run for loop for j < rows % chunkrows
    $i = $i + $j
}
4

2 回答 2

1

显示您的 fetchrow 循环代码;可能有一些方法可以改进它,具体取决于您如何调用它以及您对数据的处理方式。

我相信大多数数据库的数据库驱动程序会一次从服务器获取多行;您将不得不说出您使用哪种基础类型的数据库来获得好的建议。如果它确实为每一行与服务器通信,您将不得不修改 SQL 以一次获取多组行,但如何做到这一点取决于您使用的数据库。

啊,DB2。我不确定,但我认为你必须这样做:

SELECT *
FROM (SELECT col1, col2, col3, ROW_NUMBER() OVER () AS RN FROM table) AS cols
WHERE RN BETWEEN 1 AND 10000;

并调整每个查询的数字,直到得到空结果。显然,这是在数据库方面的更多工作,以使其重复查询多次;我不知道是否有 DB2 方法来优化它(即临时表)。

于 2010-08-05T19:39:59.287 回答
0

To get the number of rows in a table, you can use

Select count(*) from Table

To limit the number of rows returned, this may be specific to your database. MySQL, for example, has a Limit keyword which will let you pull back only a certain number of rows.

That being said, if you are pulling back all rows, you may want to add some other questions here describing specifically what you are doing, because thats not a common thing in most applications.

If you dont have a limit available in your database, you can do things like flag a column with a boolean to indicate that a row was processed, and then re-run your query for a limited number of rows, skipping those that have been completed. Or record the last row id processed, and then limit your next query to rows with a greater id. There's a lot of ways around that.

于 2010-08-05T18:37:33.030 回答