2015-05-06 50 views
1

目前,我在循環內查詢如下。ColdFusion:查詢VS結構

<cfloop query="Superquery"> 
    <cfquery datasource="mysource" name="getData"> 
     SELECT col1, Col2 
     FROM myData 
     where col1 = #Superquery.IDCol# 
    </cfquery> 
    <!--- Some Processing ---> 
</cfloop> 

該查詢不會返回太多的數據。在某些情況下,它返回的行少於100行,其中一些行可返回大約5000行。但是由於它在一個循環內,所以迭代次數可以超過100次,這讓我想到了一個更好的優化方法。

方法1:查詢中使用查詢

<cfquery datasource="mysource" name="getAllData"> 
     SELECT col1, Col2 
     FROM myData 
</cfquery> 
<cfloop query="Superquery"> 
    <cfquery dbtype="query" name="getData"> 
     SELECT col1, Col2 
     FROM getAllData 
     where col1 = #Superquery.IDCol# 
    </cfquery> 
    <!--- Some Processing ---> 
</cfloop> 

方法2:使用Structues

循環外,我已經查詢getAllData按照方法1,創建一個鍵爲'col1'且值爲'col2'的結構。在循環內部,我使用在循環外創建的結構來完成必要的處理。

我不確定這兩種方法在性能上是否有所不同。方法1很容易實現。 :)只是想得到一些建議。歡迎任何其他有效的方法。

謝謝!

+2

方法3號很可能是最有效的。那就是你想出一種避免循環的方法。細節取決於許多事情,從superquery開始,getalldata使用相同的數據源。 –

+0

你是否建議我包含一個數據庫表,因爲它使用相同的數據源?對於循環部分,我實際上在循環中設置了一些數組變量,並將其用於稍後的進一步處理。在這種情況下,我無法想到可以避免循環的方法。它取決於什麼細節? –

+3

對於丹的觀點,你會想要一個'加入'或什麼的。方法1只是乞求性能和內存使用問題。 (另外,如果你堅持做一個使用'' –

回答

3

查詢的查詢其實是相當緩慢相比,SQL查詢,因爲它沒有索引或執行計劃的任何概念,所以你需要纔去這條路線小心,因爲你很可能有一個更慢結束密集的過程。數據庫引擎經過優化,可以快速完成這種事情。

你可能會發現,使用結構會表現得更好,但你必須創建結構的開銷。不幸的是,我不能給你一個適合所有人的答案,因爲這取決於你的數據和數量。

理想情況下,您希望能夠在myData和創建您的Superquery查詢的表之間進行連接。然後,您可以根據需要遍歷該查詢和進程,而無需再次訪問數據庫。

1

創建結構似乎使事情變得複雜。
查詢本身就是一個數組的結構。
所以無論你想通過創建另一個結構來完成,你也可以使用查詢來完成。
查詢的查詢結構似乎沒有任何額外的優勢。
如果你真的想優化的東西,最好嘗試修改你的查詢。
例如爲別人說,你可以嘗試使用在查詢某種JOIN擺脫循環。