-1

行数が1,000,000を超えるデータベースで作業しています。select ステートメントはありますが、最初から fetchall を実行すると、すぐにメモリが不足してしまいます。ここに私の2つの質問があります:

  1. 開始するデータベースの正確なサイズがわからないため、fetchall を実行せずにデータベースのサイズを確認する方法はありますか? コンピュータは文字通りそれをサポートできません。

  2. 各行ごとに個別の fetchrow を実行する代わりに、一度に 5,000 など、データベースの特定のチャンクをフェッチする方法はありますか? 私はテストの実行を終えたばかりで、行ごとに実行すると、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

テーブルの行数を取得するには、次を使用できます。

Select count(*) from Table

返される行数を制限するために、これはデータベースに固有の場合があります。たとえば、MySQLにはLimit、特定の数の行のみをプルバックできるキーワードがあります。

そうは言っても、すべての行をプルバックする場合は、ほとんどのアプリケーションでは一般的ではないため、ここで何をしているのかを具体的に説明する他の質問を追加することをお勧めします。

データベースに使用可能な行がない場合limitは、ブール値で列にフラグを立てて行が処理されたことを示し、完了した行をスキップして、限られた数の行に対してクエリを再実行するなどの方法を実行できます。または、最後に処理された行IDを記録してから、次のクエリをより大きなIDの行に制限します。それを回避する方法はたくさんあります。

于 2010-08-05T18:37:33.030 に答える