2013-05-01 23 views
-2

我有一張表,其所有列存儲其他表(大表)的ID。具有ID列的表的索引建議

CREATE TABLE #mytable (
Table1Id int, 
Table2Id int, 
Table3Id int, 
Table4Id int, 
Table5Id int, 
) 

現在我的select已經加入了所有的表,這些表的ID存儲在我的表的列中。

select T1.col1, t2.Col1, T3.col1... from 
#mytable MyTable inner join table1 T1 on MyTable.Table1Id = T1.Id 
inner join table2 T2 on MyTable.Table2Id = T2.Id 
inner join table3 T3 on MyTable.Table3Id = T3.Id 
inner join table4 T4 on MyTable.Table4Id = T4.Id 
inner join table5 T5 on MyTable.Table5Id = T5.Id 
order by T1.Col1, T2.col1 

此刻,我只有一個索引Table1Id和所有其他表的ID列。任何改善性能的建議。

+0

。 。你能舉一個你試圖優化的查詢類型的例子嗎? – 2013-05-01 13:55:42

+0

編輯該問題以添加樣本選擇語句 – 2013-05-01 13:58:42

+0

。 。你的桌子有多大?我很難相信你正在使用'select *'從「巨大的表格」中取回結果。 – 2013-05-01 13:59:42

回答

1

您不會說您的索引目前定義在哪一列,而是基於您的示例查詢,您應該爲所有五列創建一個索引;

Table1Id, Table2Id, Table3Id, Table4Id, Table5Id 

這使得SQL引擎只是通過讀取索引,這應該是比讀取索引,然後讀取表更快地解決該查詢。

如果您在訪問某些列的位置運行查詢,那麼還需要這些列的索引。假設您在Table3Id和Table4Id上運行查詢。然後你需要創建一個索引;

Table3Id, Table4Id 

我無法從您提供的信息中判斷這些索引是唯一的還是非唯一的。你必須做出這樣的決定。

+1

我不同意。該查詢中沒有任何內容需要解決。示例查詢中的任何這些列上都沒有where子句或order by子句。 SQL不使用索引來讀取行中的值。 – Paparazzi 2013-05-01 15:06:15

0

對於你在你的問題中提出的陳述,你可能做的很少。事實上,如果您處於內存有限的環境中,索引在某些情況下甚至會受到傷害。

但是,作爲第一步,您應該在id列的編號表中使用索引。也就是說,您應該存儲並加入這些表的主鍵(索引在主鍵上是自動的)。

通常,索引的目的是防止掃描整個表以找到一組特定的記錄。在這種情況下,它看起來就像你想要的所有記錄一樣,所以全表掃描是必要的。這限制了指數的適用性。 SQL Server很可能會將這些連接轉換爲散列連接,這是在需要讀取所有行時加入表的有效方式。

根據wheregroup by條款,可能需要額外的索引。

1

檢查#mytable
你在哪裏
沒有秩序的
沒有GROUP BY

你只是要得到無特定順序的行該表上具有
沒有任何搜索條件。
有對#mytable
任何指標不使用索引Table1Id不使用該查詢,並會減慢插入

我懷疑#mytable只是一個輸出表和其中所用條件來填充表。

連接將使用要連接的表上的ID。
因此,索引ID在table1-x上,並將其索引爲PK(聚簇)(如果可以)。
如果該索引是碎片,然後碎片整理。
該加入應該是索引查找,你不能做得更好。
驗證查詢計劃是否有索引在連接上尋找。
如果您沒有索引搜索這些連接,請發佈查詢計劃。
你可以在連接上試驗一下提示,但我懷疑查詢優化器會把它做對 - 這可能是一個很大的查詢,但它不是一個複雜的查詢。

由於SQL將抓取頁面,如果您通過單個列命令#mytable,您有更好的機會在頁面內存中。
如果您可以按照PK的順序插入,PK是免費的。
在這種情況下,您會將最大值的列放在最後一個位置。
實際上會在最後一個位置放置最緊密的PK組。
然後按PK排序。

+0

或最好 - 在沒有索引的情況下爲查詢運行PLAN,然後添加它並再次運行PLAN以查看差異。 – Randy 2013-05-01 15:34:57

+0

那麼有從其他表中選擇的某些列的訂單 – 2013-05-02 05:22:29

+0

確定填充的選擇語句有一個訂單。你讀過我的回答了嗎? 「你只要按照特定順序得到這些行。」如果你想從#temp1中選擇保證的訂單,那麼你需要一個訂單欄。您作爲支票提供的答案是否可以提高查詢的速度? – Paparazzi 2013-05-02 13:27:08