2011-03-22 87 views
0

我正在努力使處理PHP中消息樹的代碼更加高效。數據存儲在SQL數據庫中,目前必須爲每條消息執行2個SQL查詢,一個用於查找數據,另一個用於更新數據。我想我有辦法用單個查詢來完成這個任務,但是它使用了我聽說的遊標比其他SQL方法慢得多的遊標。SQL遊標查詢或兩個單獨的查詢:哪個更有效?

有誰知道是否使用遊標執行一個SQL查詢仍然更有效率,還是堅持使用每條消息的選擇和更新查詢以及PHP綁定查詢的當前方法會更好一些一起?

+1

沒有看到任何代碼,這只是猜測。通常情況下,數據庫管理員將使用帶有WHERE子句的UPDATE語句 - WHERE子句執行查找需要更新的數據的工作。您的情況可能會有所不同,但請考慮編輯您的問題幷包括SELECT和UPDATE語句。 – 2011-03-22 09:58:19

回答

3

同意@Catcall - 沒有看到代碼,很難有意義地回答這個問題。

但是,從廣義上講,人們經常說遊標比其他SQL方法慢的原因是因爲一些開發人員在基於集合的操作可以使用的地方使用遊標。

舉例來說,如果你的計劃是(以僞代碼,在沒有實際的數據庫引擎或模式)

create cursor RecordsToUpdate 
as 
select * 
from UserTable 
where name like 'Codd%' 

foreachRecord in RecordsToUpdate 
    set record.lastUpdatedDate = today 
next 

這是(希望)顯而易見的是,你可以通過執行

update UserTable 
set lastUpdatedDate = today 
where name like 'Codd%' 
達到同樣的

但是,有些情況下基於集合的操作是不可能的,然後 - 從廣義上講 - 創建遊標,執行邏輯並關閉遊標會更有效率 - 理想情況下是存儲程序什麼的。這種方法限制了將數據發送回PHP服務器的網絡開銷。

說了這麼多 - 在大多數情況下,您將不會注意到真實世界情景中的差異。另外值得指出的是,如果您的數據庫負載過重,或者查詢執行速度較慢(例如,通過遍歷包含數百萬條記錄的遊標),則此方法可能會造成數據庫服務器瓶頸。一般來說,如果可能的話,您希望避免在數據庫上執行長時間運行的作業 - 最好將它們分成許多小型作業。

+0

感謝您的幫助。實際上,結果是使用代碼的功能已經被淘汰,所以代碼不需要更新,但爲了將來的工作,請牢記這一點。不幸的是,這是其中一種情況,我認爲它必須是一個遊標(它必須獲取父記錄的列表,然後按順序更新每個孩子,並將它們分配給同一父母),但是這可能會導致瓶頸。 – SolidSquid 2011-04-18 16:05:11