从一张大桌子上读书

时间:2014-10-10 16:23:29

标签: php sql-server freetds

我想使用PHP 5.4.24和freetds 0.91从SQL Server 2008R2上的表(或视图)中读取数据。 在PHP中,我写道:

$ret = mssql_query( 'SELECT * FROM mytable', $Conn ) ;

然后我一次读取一行,处理它们,一切都好。除非,当表格真的很大时,我得到一个错误:

Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 4625408 bytes)
in /home/prove/test.php on line 43

错误发生在mssql_query()中,所以我查询的方式无关紧要。

更改查询以返回更少的行或更少的列是不可行的,因为我必须在有限的时间内从许多表中读取大量数据。

我该怎么做才能说服PHP一次一行地读取内存,或者一次读取一个合理的数字?

1 个答案:

答案 0 :(得分:0)

我在问题评论中同意@James,如果你需要阅读一个如此大的表,它会耗尽你的记忆以便在回复PHP之前存储结果,这可能只是意味着你需要找到一个更好的方法。但是,这是一个可能的解决方案(未经测试,我只使用过几次MSSQL;但如果不完美,我会尽我所能):

$ret = mssql_query( 'SELECT COUNT(*) as TotalRows FROM mytable', $Conn);
$row = mssql_fetch_row($ret);

$offset    = 0;
$increment = 50;
while ($offset < $row['TotalRows'])
{
    $ret_2 = mssql_query("SELECT * FROM mytable ORDER BY Id ASC OFFSET {$offset} ROWS FETCH NEXT {$increment} ROWS ONLY", $Conn);

    //
    // loop over those 50 rows, do your thing...
    //

    $offset += $increment;
}

//
// there will probably be a remainder, so you'll have to account for that in the post-iteration; probably making the interior loop a function or method would be wise.
//