2011-02-25 92 views
0

我有一個緩慢的SQL Server 2005中的查詢。它有3個內部聯接(在有幾萬行到一百萬行的表上),以及一個由條款。SQL Server 2005與聯接和訂單緩慢查詢通過

所有的連接鍵都是uuid列,但其中一個表只有一個索引(每個表的主鍵都是uniqueidentifier類型,而另一個表的列有一個作爲外鍵的列)相同的值加入,但它沒有索引)。

我假設在作爲外鍵的列上添加一個索引將對此有極大的幫助。

我的其他選擇是如何最大限度地優化此查詢?

注意:我的分貝似乎有一個CPU瓶頸,認爲這個查詢(這是經常運行)可能會導致它?數據庫只有大約2GB,我有4GB RAM,所以我懷疑有很多I/O問題。訂單是否會吃掉CPU?

+2

我建議你發佈確切的表定義和所有索引,而不是結構的描述。 – 2011-02-25 20:23:46

回答

2

你需要索引你的連接密鑰!如果您加入多個字段,請添加涵蓋所有這些字段的覆蓋索引(與它們在查詢中的順序相同)。這可能會處理90%的性能問題。

這樣的查詢可能會遇到CPU瓶頸,因爲服務器必須對所有連接執行表掃描。

+0

但奇怪的是,即使我缺少索引,檢查查詢計劃顯示它只做集羣或非集羣索引查找。這怎麼可能? – 2011-02-25 21:38:11

+0

您正在查看實際的還是預計的執行計劃?你能給我們Remus要求的信息,表格結構和索引嗎?基於不完整的信息很難診斷。 – JNK 2011-02-25 21:42:25

+0

我無法發佈實際的表數據,但我所描述的基本上是完整的(除了按順序使用的表上的某些列的例外)。除了每個表中的uuid pk以外,不存在其他鍵(不存在外鍵)。但要回答你的問題,這是一個估計的執行計劃。 – 2011-02-25 21:59:08

0

如果您的連接是內連接,您可以創建索引視圖。這會爲您提供運行時性能,就好像沒有連接並且根本沒有排序。它不會比這更快(以磁盤空間爲代價)。如果您的連接是外連接,則有一種解決方法:插入一個充當「空」類值的虛擬行並切換到內連接。

正如JNK指出的那樣,索引外鍵列仍然很重要。儘管可能,但不太可能,你可以逃避不索引它們。

+0

有人可以解釋爲什麼這是downvoted? – 2011-02-25 20:50:50

+0

@Joda - 我猜是因爲這是不正確的。 – JNK 2011-02-25 21:26:02

+0

那麼請告訴我爲什麼! – usr 2011-02-25 21:29:03