我正在使用coldfusion和SQL服務器來管理一些曲棍球統計信息。我有一個表現不佳的SQL查詢,因爲我在返回結果的實際循環內運行另一個查詢。我知道這是不好的,表現也是滯後的。所以我希望有人能幫助我做到這一點。選擇與另一個表格不同的記錄/計數
我的第一個SQL是這樣的:
SELECT
S.GameID,
S.LeagueID,
S.SeasonID,
S.DatePlayed,
S.TimePlayed,
S.HomeTeamID,
S.VisitorTeamID,
HomeTeam.TeamName AS HomeTeamName,
VisitorTeam.TeamName AS VisitorTeamName
FROM schedules S
JOIN teams AS HomeTeam ON S.HomeTeamID = HomeTeam.TeamID
JOIN teams AS VisitorTeam ON S.VisitorTeamID = VisitorTeam.TeamID
WHERE S.LeagueID = <cfqueryparam value="#application.leagueid#" cfsqltype="cf_sql_integer">
AND S.SeasonID = <cfqueryparam value="#application.seasonid#" cfsqltype="cf_sql_integer">
ORDER BY S.GameID DESC
這將運行非常快,我們都好這一點。但是,管理員想要顯示哪些預定的遊戲具有分配給他們的統計信息。所以我cfoutput查詢和循環內,我運行另一個查詢,使用gameid檢查gamestats表。
<cfoutput query="qListGames">
*** table stuff here...
<cfquery name="qCheckStats" datasource="#APPICATION.DSN#">
SELECT GameID
FROM dbo.GameStats
WHERE GameID = #qListGames.GameID#
</cfquery>
<cfif IsDefined("qAssigned.RecordCount") AND qAssigned.RecordCount GT "0">
True
<cfelse>
False
</cfif>
</cfoutput>
這當然會導致嚴重的滯後,因爲有100多條記錄,我一遍又一遍地敲擊數據庫。理想情況下,我希望運行一個可以收集所有需要顯示的記錄的SQL語句,但還要檢查gamestats表中的相關記錄。如果發現gamestats,我需要顯示true,否則顯示false。我無法圍繞實現這一目標所需的SQL進行打包。
任何人都可以告訴我嗎? 謝謝。
性能問題,是因爲你的循環。我們在這裏看不到足以理解爲什麼你需要首先循環。我會建議重新處理你的應用程序來處理集合,而不是一遍又一遍地循環查詢。 – 2015-03-31 18:35:11
最初,我們剛剛返回了預定的遊戲列表。因此,我們使用來顯示上面第一條SQL語句返回的記錄。現在,管理員想要查看哪些遊戲已分配了統計信息。我們有另一個名爲gamestats的表,我們使用schedule列表中的gameid存儲統計信息。所以,我希望有一種方法可以只修改第一個SQL語句,以便在gamestats表中檢查gameid。當你說'處理套件'時,我不確定你的意思。 –
TCJ
2015-03-31 18:45:45