Чтение с большого стола

Я хочу читать данные из таблицы (или представления) на SQL Server 2008R2, используя PHP 5.4.24 и freetds 0.91.
В 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 читать в памяти по одной строке за раз или за разумное число за раз?

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.
//
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]