coldfusion
  • null
  • oracle11g
  • coldfusion-9
  • cfqueryparam
  • 2013-07-10 56 views 4 likes 
    4

    考慮以下幾點:<cfqueryparam>如何影響常量和空值的性能?

    <cfquery name="aQuery" datasource="#aSource#"> 
        SELECT aColumn 
         FROM aTable 
        WHERE bColumn = <cfqueryparam value="#aVariable#" cfsqltype="#aSqlType#" /> 
         AND cColumn = 'someConstant' 
         AND dColumn is null 
    </cfquery> 
    

    如果我改變

    AND cColumn = 'someConstant' 
    

    AND cColumn = <cfqueryparam value="someConstant" cfsqltype="#aSqlType#" /> 
    

    是否有潛在的性能提升?是否有可能傷害業績?

    如果我用AND dColumn is null做同樣的事情(使用cfqueryparam)怎麼辦?

    我的發現並沒有定論。

    如果它很重要,則假定ColdFusion9和Oracle db 11g。

    編輯:

    我只是想重申,我想諮詢一下cfqueryparam標籤是與常數和/或空值和性能remifications專門用,如果有的話。

    +1

    使用帶有cfsqltype一個cfqueryparam可以幫助優化數據庫本身,因此它知道要期待一個int或VARCHAR等,可以加快數據庫查詢 –

    +0

    我不認爲它沒有什麼區別,但找到它來測試它是最好的方法。 cfquery的結果屬性爲您提供執行時間。在循環內運行兩次查詢1000次左右。將執行時間放入數組中,然後比較平均值。 –

    回答

    6

    是否有潛在的性能改進?

    編號當變化涉及參數時,綁定變量最有用。沒有它們,數據庫每次查詢參數發生變化時都會生成一個新的執行計劃(這很昂貴)。即使參數改變,綁定變量也會鼓勵數據庫緩存和重用執行計劃。這節省了編譯的成本,提高了性能。 常數確實沒有好處。由於該值永遠不會改變,因此數據庫將始終重用執行計劃。所以在常量上使用它沒有多少理由。

    是否有可能損害性能?

    我看到了一些特殊情況下的提及,其中在常量上使用綁定變量可能實際上會降低性能。但是,這確實是在逐案的基礎上。

    +2

    最糟糕的情況是將混合的cfqueryparam與使用SQL中的非參數化變量的查詢結合使用 - 尤其是當非參數化變量中存在大量變體時。請在SQL cfqueryparams(首選)中創建所有變量,或者在不使用cfqueryparam的情況下創建所有變量。 Leigh回答時常數/空值不重要。使用混合會傷害大容量網站的性能。低音量的應用程序不會注意到它。 –

    0

    我不這麼認爲,因爲你已經有一個<cfqueryparam>,這將把它變成一個準備好的聲明,但我不確定。

    -2

    使用查詢參數將有2種方式。

    首先,它會保護你免受SQLI攻擊。它會添加一個保護級別,以確保參數中的數據是預期的。

    其次,你會看到性能增加。但是,增加取決於數據模式和索引。參數將允許數據庫緩存查詢計劃。這加快了查詢執行的初始開銷。查詢越複雜,越重要的是緩存查詢計劃。

    此外,請確保您有where子句中所有列的覆蓋索引,並且它們的順序是正確的。如果不是,查詢優化器可能會選擇忽略索引並直接進行表掃描。

    相關問題