2011-08-20 128 views
2

我有一些密碼循環插入數千條記錄,最近當我引入<cfqueryparam>時,CF崩潰。cfqueryparam可以獲得多長時間的cfquery限制?

喜歡的東西...

<cfquery> 
    <cfloop query="qBars"> 
    INSERT INTO Foo 
    SET 
     xx = <cfqueryparam value="#qBars.aa#" sqltype="CF_SQL_VARCHAR">, 
     yy = <cfqueryparam value="#qBars.bb#" sqltype="CF_SQL_INTEGER"> 
    </cfloop> 
</cfquery> 

過去,這不<cfqueryparam>做工精美。但是,如果使用cfqueryparam,則當qBars的記錄數很大(10,000+)時,可能會出現問題。

現在...我該怎麼辦?重構整個事情在數據庫級別處理?

感謝

+1

您是否嘗試過將'cfquery'放入您的'cfloop'中,以便在一個查詢中運行一個以000s爲單位的查詢語句而不是幾千個語句? – Antony

回答

7

說實話,如果我需要將10k +記錄加載到數據庫中,我不會使用CFQUERY。你的數據庫幾乎可以肯定有批量加載數據的能力,所以我建議你調查一下。

我認爲允許的綁定參數的最大數量是由數據庫引擎設置的限制,而不是由CF或底層JDBC設置。但是你沒有提及你正在使用哪個數據庫,所以很難在那裏爲你研究一個答案。

我做了一些窺探,發現這個表爲SQL Server:http://msdn.microsoft.com/en-us/library/ms143432.aspx。它沒有具體提及內聯查詢可以具有多少個綁定參數,但是他們提到的用於參數或函數的參數的數字2100與我之前能夠在列表中傳遞的最大參數數量相同(像一個WHERE IN子句)。我一直認爲這是列表的最大尺寸,但也許實際上是多少個參數的切斷。這對你來說很容易測試......用1005次迭代試試你的循環,看看它是否有效。然後嘗試1006次迭代,我可能會期望它失敗。

也就是說,當然,如果你恰巧是在SQL Server上...

另外,你說的東西崩潰了,但你不說是什麼錯誤......它總是有幫助的當你問這樣的問題時,包括這種信息。

+0

謝謝,是的,我正在使用SQL Server,不,它不會產生任何崩潰/異常信息,但服務器不會再有任何反應。 – Henry

+1

+1。絕對調查'BULK插入' – Leigh

2

安東尼有一個很好的建議。我會檢查,看看這對你的問題有什麼影響。就我個人而言,我傾向於重構。我在將數據密集型操作轉移到數據庫級方面取得了巨大的成功。

我目前負責解析和分析關鍵字的應用程序。解析器最初是用coldfusion編寫的,效果很好。隨着處理條目數量的增長(幾乎呈指數級增長),流程本身變得非常緩慢。我重寫了t-SQL中的代碼(我正在運行SS2K8),響應時間大大增加。 imho,重構是值得的,特別是在數據密集型操作上。

2

我想更改代碼以

<cfloop query="qBars"> 
    <cfquery> 
    INSERT INTO Foo 
    SET 
     xx = <cfqueryparam value="#qBars.aa#" sqltype="CF_SQL_VARCHAR">, 
     yy = <cfqueryparam value="#qBars.bb#" sqltype="CF_SQL_INTEGER"> 
    </cfquery> 
</cfloop> 

看看會發生什麼。如果這樣,你可以在整個事件中包裝一個< cftransaction,它將發送一個事務中的所有插入而不是數千個插入。

+0

好主意,我會試試這個。但是,表演會受到很大的影響,不是嗎? – Henry

+0

如果它有效,那麼與服務器停止響應相比,性能要好得多。如果您將它們作爲一個事務發送,那麼只會有一個COMMIT,並且只有一個重新索引。所以我不認爲性能會受到影響。我可能是錯的,我不是DBA。 –

2

您也可以嘗試:

INSERT INTO ''foo'' (''xx'',''yy'') 
VALUES  
    <cfloop query="qBars"> 
    (<cfqueryparam value="#qBars.aa#" sqltype="CF_SQL_VARCHAR">, <cfqueryparam value="#qBars.bb#" sqltype="CF_SQL_VARCHAR">) 
    <cfif NOT qBars.currentRecordcount eq qBars.recordcount>,</cfif> 
    </cfloop> 

我認爲這會工作。我最近沒有嘗試過,但我很確定我過去使用過它。我修改了這個例子的另一個SO答案。

+0

只是一個說明,我相信語法要求ms sql 2008+ – Leigh

+0

這種語法在其他方面更好,其他更清潔? – Henry

+0

@Leigh,是的,我認爲這是正確的。 –

相關問題