大量のデータを取得するクエリがあります。
<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)。