Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在大桌子上看书_Php_Sql Server_Freetds - Fatal编程技术网

Php 在大桌子上看书

Php 在大桌子上看书,php,sql-server,freetds,Php,Sql Server,Freetds,我想使用PHP5.4.24和freetds 0.91从SQLServer2008R2上的表(或视图)中读取数据。 我用PHP编写: $ret = mssql_query( 'SELECT * FROM mytable', $Conn ) ; 然后我一次读一行,处理它们,一切正常。但是,当表非常大时,我得到一个错误: Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 4625408

我想使用PHP5.4.24和freetds 0.91从SQLServer2008R2上的表(或视图)中读取数据。 我用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在内存中一次读取一行,或者一次读取一个合理的数字?

我同意@James在问题注释中的观点,如果你需要读取一个如此大的表,以至于在返回PHP之前耗尽你的内存来隐藏结果,这可能只是意味着你需要找到一个更好的方法。然而,这里有一个可能的解决方案(未经测试,我只使用过MSSQL几次;但如果不是完美的,我会尽力):

$ret=mssql\u查询('SELECT COUNT(*)as TotalRows FROM mytable',$Conn);
$row=mssql\U fetch\U row($ret);
$offset=0;
$increment=50;
而($offset<$row['TotalRows']))
{
$ret_2=mssql_查询(“按Id从mytable ORDER中选择*ASC OFFSET{$OFFSET}行仅获取下一个{$increment}行”,$Conn);
//
//绕过去50排,做你的事。。。
//
$offset+=$increment;
}
//
//可能会有一个余数,所以您必须在迭代后考虑这个余数;也许让内部循环成为一个函数或方法是明智的。
//

我们谈论的是多少行以及每行中有多少数据?如果您还没有使用索引,那么使用索引可能会有所帮助。您真的需要表中的所有内容吗?也许您可以考虑将它拆分为小表。我对数据库服务器没有控制权,而且我不能每次读取一些行/列,因为涉及的表很多,我想保持代码简单。也许无缓冲的查询将有助于:PDO:细节:。或者:PHP手册:仔细想想,如果结构一开始设计得很糟糕,那么如果还没有@Fred ii-Suggest-indexes,那么黑客(尽管也是一个非常好的修复程序)就会像@Fred ii-Suggest-indexes那样存在。在一个设计糟糕的表上,它可能会造成整个世界的不同,尽管需要修改查询以更有效地使用索引。
$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.
//