2009-09-11 43 views
0

如果sql查詢包含很多連接,是否有任何性能問題?如果sql查詢包含很多連接,是否有任何性能問題?

+3

如果程序包含很多行,是否存在任何性能問題? ...你的問題非常廣泛,同樣模糊。請澄清。像任何其他處理一樣,聯合會需要時間;但它幾乎總是一個折衷的問題。 – derobert 2009-09-11 05:10:05

+0

請記住,連接對性能和其他任何事情的影響最小。 – 2009-09-11 05:28:11

回答

4

可以有 - 但查詢性能是受很多因素敏感的事情:

  • 數的加入
  • 表格的結構
  • 數據庫大小
  • 存在。如果和索引的數據類型
  • 值的數據類型被加入
  • 等等等等

您可以進入各種細節。但通常最好的方法是編寫一個可以工作的查詢,然後對您的應用進行配置以查看您是否確實存在問題。 然後,開始尋找優化您的查詢。

0

是的,如果你在SQL中使用大量連接會影響你的性能。

2

是的。

但最大的問題是:如何加入表格。假設你有一個像查詢:

select book.title, chapter.page_count 
from chapter 
join book on book.bookid=chapter.bookid 
where chapter.subject='penguins' 

查詢可能會讀取章節表第一尋找匹配的「企鵝」,然後再加入到圖書。如果Bookid是書的主鍵,或者至少被索引,這將是非常快的。但是,如果沒有,那麼我們將不得不對全書進行全文順序閱讀。根據引擎和其他因素,我們可能不得不重新閱讀整個Book表,每個找到章節記錄。這可能需要很長時間。

如果你加入三張表並且兩個連接都需要完整的文件讀取,那麼你可能處於一個受到傷害的世界。

加盟總是花費你東西。但是需要全文件讀取的連接,特別是多個全文件讀取,花費了很多。一些數據庫引擎通過識別它發生的情況來緩解這種代價,並且可以將表加載到內存中並重新使用它,通常會對它進行某種類型的散列搜索。這仍然很昂貴,但不是很糟糕。

學習閱讀解釋計劃。這些可以幫助你分析你的查詢,弄清楚它們的不好之處並清理它們。就個人而言,除非一個查詢顯然是簡單的,比如「從primary_key = whatever中選擇任何表」,我只需確認解釋計劃即可。

+0

感謝您的解釋 – StarDotStar 2009-09-11 09:01:51

1

使用大量連接會降低檢索性能(儘管使用適當的索引,懲罰通常比人們想象的要小得多 - 首先進行測量)。

但是,人們往往會忘記,刪除聯接通常意味着數據「非規範化」,這在數據必須修改時會產生成本。特別是,強制完全標準化模式在非規範化模式中自動執行的約束可能很難。因爲這很難,所以經常沒有完成。但是,當約束不被執行時,數據變得不可靠,並且有一件事情比(輕微)慢選擇操作返回正確答案更糟糕,而且這是快速選擇操作,返回錯誤或令人困惑的答案。

如果數據庫管理系統是主要讀取的 - 也就是說,數據只寫一次,並且很少修改,那麼您可以考慮非規範化的性能是否會受益於不準確數據蔓延到數據庫中的風險。如果數據是關鍵任務並且經常更新,那麼數據不準確的風險通常太嚴重而無法接受。

但是,正如他們所說,YMMV。

+0

絕對是真實的,以及我在寫答案時沒有考慮的一個角度。如果問題是「我應否規範化表格以避免連接」,答案是「僅在極端情況下」。非規範化通常意味着您有冗餘數據,並且冗餘數據非常糟糕,因爲確保一致性非常困難。 – Jay 2009-09-11 14:37:02

+0

喬納森說,一個緩慢的正確答案比一個錯誤的答案要好,我同意。我會補充說一個答案是錯誤的,但總是相同的比回答有時是正確的,有時是錯誤的更好。至少如果它一直是錯誤的,你可以確定它是錯誤的,並去一個地方修復它。如果你看屏幕A是正確的,但當你看屏幕B時是錯誤的,看屏幕A的人可能甚至不知道有問題,並且它永遠不會被修復。即使你發現問題並修復它,你也不相信你已經將它修復了。 – Jay 2009-09-11 14:38:41