5

大量のデータを取得するクエリがあります。

<cfsetting requesttimeout="9999999" >

<cfquery name="randomething" datasource="ds" timeout="9999999" >
    SELECT
        col1,
        col2
    FROM
        table
</cfquery>

<cfdump var="#randomething.recordCount#" /> <!---should be about 5 million rows --->

Pythonのcx_Oracleでデータを正常に取得できsys.getsizeof、Pythonリストで使用すると22621060が返されるため、約21メガバイトになります。

ColdFusion はページにエラーを返さず、どのログにも何も見つかりません。cfdump行数が表示されないのはなぜですか?

追加情報

このようにする理由は、クエリに対して実行する約 8000 の小さなクエリがあるためですrandomthing。つまり、データベースに対して 8000 件のクエリを実行すると、そのプロセスが完了するまでに数時間かかります。これは、私が他の複数のデータベース ユーザーと競合しており、データベースが動かなくなっているためだと思われます。

8000 個の小さなクエリは、col2 の期間にわたって col1 のカウントを取得しています。

SELECT 
    count(col1) as count
WHERE 
    col2 < 20121109 
AND 
    col2 > 20121108

アダム・キャメロンの 提案によると.

  • cflog は、クエリが終了していないことを示しています。

  • コードとCFIDE /管理者の両方でクエリのタイムアウトを変更しようとしましたが、どうやらCF9はタイムアウト属性を尊重しなくなったようです。何を試しても、クエリをタイムアウトさせることができませんでした。

また、属性をいじって、maxrowsその方法で情報を識別できるかどうかを確認しました。

  • maxrows が 1300000 に設定されている場合、すべて正常に動作します
  • maxrows が 1400000 以上の場合、このエラーが発生します ここに画像の説明を入力
  • maxrows が 2000000 の場合、元の問題を観察します

アップデート

したがって、これは cfquery の制限ではありません。それをQueryNewループしてデータを追加すると、問題なく 200 万を超えることができます。

この質問の情報を使用して ThinClient データソースも作成しましたが、動作に変化は見られませんでした。

データベース側のメッセージは次のとおりです。

クライアントからの SQL*Net メッセージ

クライアントへの SQL*Net 追加データ

シンクライアントと一緒に使用することで、blockfactor1="100"より多くの行を取得できることを発見しました (約 3000000)。

4

6 に答える 6

2

DB側に何かがログオンしていますか?

timeoutが尊重されておらず、JDBCが動作中にDBで「ハングアップ」しているのではないかと思います。それは大げさな推測です。非常に低いタイムアウト(例:5秒)を設定した場合、5秒後にエラーが発生しますか?

ブラウザもタイムアウトしている可能性があります。<cfquery>ブロックの前後に、を使用してログに何かを書き込むとはどういうことですか<cflog>。クエリが最終的に終了するかどうかを確認します。

CFに戻したら、これらの22Mレコードをどうするつもりなのか疑問に思います。それが何であれ、CFはそれが何であれそれを行うのに間違った場所であるように私には聞こえます:CFは重いデータ処理のためではなく、ウェブページを作るためのものです。22Mレコードを処理する必要がある場合、データベースで処理する必要があると思います。とは言うものの、私はあなたが何をしているのかを推測しているので、情報がないので、おそらくそれを行うのには十分な理由があると思います。

于 2012-11-09T13:10:24.603 に答える
1

cfqueryタグ内をラップして、cftry何かが報告されるかどうかを確認しましたか?

<cfsetting requesttimeout="600" >

<cftry>
    <cfquery name="randomething" datasource="ds" timeout="590" >
        SELECT
            col1,
            col2
        FROM
            table
    </cfquery>

    <cfdump var="#randomething.recordCount#" /> <!--- should be about 5 million rows --->

    <cfcatch type="any">
        <cfdump var="#cfcatch#">
    </cfcatch>
</cftry>
于 2012-11-27T17:15:32.023 に答える
1

これは単なるアイデアですが、試してみることができます。

QueryNewあなたは、あなたを使用することで、必要な200万を超えるレコードを正常に追加できると述べています。

また、あなたmaxRowsが130万人未満の場合、期待どおりに機能します。

したがって、最初count(*)にテーブル内のレコードの総数に対してクエリを実行し、100万で割って切り上げてから、cfloopその数を超えて、各反復でクエリを実行してmaxRows=1000000startRow=((i - 1 * 1000000) + 1)ませんか...

ArrayAppendループ内から配列への各クエリ。すべて完了したら、配列をループして、レコードを新しいQueryオブジェクトにプッシュします。そうすれば、取得しようとしたすべてのレコードを含むクエリが最後に表示されます。

あなたはメモリの問題にぶつかるかもしれません、そしてそれそれほどうまく機能しません、しかしねえ-これはColdfusionです、それらは当然のことです、そして時々クレイジーなことが起こります/動作します。

QueryNew(各クエリの結果は、各クエリを配列にプッシュするのではなく、構築しているものにいつでも追加できますが、そうでない場合は、デバッグしてどこまで到達できるかを確認する方が簡単です。アレイを構築しながら機能します。)

(また、CFが処理できるサイズ内の複数のクエリを使用すると、1つの大規模なクエリを構築するのではなく、配列をループしてから各クエリをループすることで、必要なプロセスを実行できる場合があります-処理時間を節約し、メモリですが、単一のQueryオブジェクトに完全な結果セットが必要かどうかによって異なります)

于 2012-11-29T14:03:43.763 に答える
1

日付範囲が一貫している場合は、cf で処理する代わりに、SQL でいくつかの集計関数をお勧めします。何かのようなもの:

select col1, count(col1), year(col2), month(col2)
from table
group by year(col2), month(col2)
order by year(col2), month(col2)

その詳細レベルも必要な場合は day() を追加してください。日付の部分で本当にクリエイティブになれます。

これにより、実行時間全体が大幅に高速化され、メインクエリのサイズが縮小されます。

于 2012-11-30T00:20:26.310 に答える
0

ここでの問題は、ColdFusion が SQL をタイムアウトできないことです。これは、CF6 以降、常に問題になっていると思います。したがって、基本的に何が起こっているかというと、cfquery は 9999999 秒よりも長くかかっていますが、CF は JDBC をタイムアウトできないため、後で cfdump (内部的に cfoutput を使用します) を実行しようとするまで待機します。走りすぎ。

Adam が指摘したように、何をしようとしても、CF が現実的に処理するには大きすぎるため、より小さなジョブに分割するか、DB で完全に処理する必要があります。

于 2012-11-10T06:10:00.430 に答える
0

サーバーのメモリが不足していることが判明したためcfquery、 python よりもかなり多くのメモリを消費しているようlistです。

CFMonitor チャート

私が正しい方向に進むようになったのはBarry のコメントでした。サーバー モニターについて、それが存在するという事実以外は、この時点まであまり知りませんでした。

私も読むのが苦手なので、application.log ファイルに記録されていたエラーは次のとおりです。

GC オーバーヘッド制限を超えました含まれている、または処理されたファイルの特定のシーケンスは次のとおりです: \path\to\index.cfm、行: 10 "

Java ヒープ スペース 含まれる、または処理されるファイルの具体的な順序は次のとおりです: \path\to\index.cfm

最終的には Adamsの提案に従い、データベースに処理を任せます。少なくとも今は、単に「わからない」と言う代わりに、物事が遅い理由を説明できるようになります。

于 2012-12-01T22:08:40.953 に答える