1

cfspreadsheet.(約 600 行) を使用して読み込まれたデータからデータを参照するテーブル更新を行う次のクエリがあり、qry1 として参照されます。SQL が完了するまで約 2 分かかります。更新のタイミングを改善するために SQL を改善できますか? products テーブルには 1360000 行あります。この例では、これらの行のうち 600 行を更新しています。Oracle のバージョンは 11g です Coldfusion のバージョンは 9.1 です

<cfloop from="1" to="#qry1.recordcount#" index="i">
    <cfquery name="qry2" datasource="db1">
        UPDATE PRODUCTS P
        SET P.QTY = <cfqueryparam value="#qry1.ITEM_NEW_INCOMING_QUOTE_QTY#" cfsqltype="cf_sql_numeric" />
        WHERE P.PRODUCT= <cfqueryparam value="#qry1.PRODUCT#" cfsqltype="cf_sql_varchar"  />
        AND EXISTS(
            SELECT QUOTE_ID
            FROM QUOTE Q
            WHERE P.QUOTE_ID = Q.QUOTE_ID
                AND Q.QUOTE_NUMBER = <cfqueryparam value="#Val(qry1.QUOTE_NUMBER)#" cfsqltype="cf_sql_numeric" /> 
            )
    </cfquery>
</cfloop>
4

2 に答える 2

3

更新 残念ながら、OP によって以前に省略されたいくつかの新しい情報が原因で、この解決策は有効ではありません。


元の回答

これを行うためにColdFusionを使用する必要はないと思います。これは 600 回のデータベース呼び出しを行うことになり、おそらく多くの時間が費やされます。せいぜい、更新する必要がある 600 行をクエリに伝えるために、WHERE 句を送信する CF のみが必要です。

ストレート SQL を使用して、別のテーブルから oracle のテーブルを更新できます。この古い SO 投稿が役立つかどうかを確認してください。Oracle SQL: 別のテーブルのデータでテーブルを更新する

このリンクに何かが起こった場合、最高評価の回答の要点は次のとおりです。

UPDATE table1 t1
   SET (name, desc) = (SELECT t2.name, t2.desc
                         FROM table2 t2
                        WHERE t1.id = t2.id)
 WHERE EXISTS (
    SELECT 1
      FROM table2 t2
     WHERE t1.id = t2.id 
     AND  -- your where clause from your first cfquery here
 )
于 2013-02-07T15:18:34.713 に答える
0

600 の個別の更新には、何があってもかなりの時間がかかります。ユーザーが座って待つ必要がないようにするには、cfthread を使用して更新を行い、メイン スレッドでユーザーのファイルに感謝します。

または、ファイルをアップロードして、サーバーのどこかに保存することもできます。次に、これらのファイルを検索して処理するスケジュールされたジョブを設定します。

何をするにしても、速度のために優れたプラクティスを犠牲にしないでください。アップロードされたファイルはユーザー入力であるため、受け取ったデータを検証する必要があります。

于 2013-02-07T17:46:07.510 に答える