2011-05-26 84 views
1


非分區表我有一個表,在我看來,將受益分區:分區在SQL Server 2008

CREATE TABLE [dbo].[my_table](
[id] [int] IDENTITY(1,1) NOT NULL, 
[external_id] [int] NOT NULL, 
[amount] [money] NOT NULL, 
    PRIMARY KEY CLUSTERED ([id] ASC)); 

只是有幾個不同的external_id和數以千計的爲他們每個人的記錄。
SSMS創建分區嚮導生成一個我不完全理解的腳本。創建分區函數和分區架構,
--IT下降主鍵,
--then上id再創主鍵,此時如非羣集,之後
--then上創建新創建的分區上external_id聚集索引模式,
- 最後它會刪除在上一步創建的聚集索引。

除了最後一步以外的所有東西看起來都很清晰,但我無法理解爲什麼它必須刪除聚簇索引。我應該從批處理中刪除最後一步嗎?

任何幫助將不勝感激。

+0

您正在尋找分區,是否有任何您需要的查詢性能? – Pankaj 2011-05-27 05:16:11

+0

@ SQL-我主要關心的不是執行'select',而是與新數據合併。我只爲給定的'external_id'選擇1(使用頂部)行,使用它並刪除它。當找不到記錄時,我爲這個'external_id'插入另外幾千條記錄。預先生成所需的數據並切換到新的分區似乎以比INSERT更快的數千次(幾百萬次)的速度運行。 – a1ex07 2011-05-27 14:17:25

回答

1

它是有道理的。

分區鍵將成爲外部標識,因此聚集索引必須包含該標識。

它保留在非聚集索引的主鍵 - 因爲它是在不ID EXTERNAL_ID

它創造上EXTERNAL_ID聚集索引以物理的移入數據的分區方案。

它刪除聚集索引,因爲它只用它來移動數據 - 它不是以前指定的索引。

假設您始終知道external_id,您可以選擇創建聚簇索引(id,external_id) - 用於表的分區模式/函數字段必須位於聚簇索引內在分區模式上。

性能方面,這不會是一個巨大的提升,它的使用更多地是可以簡單地刪除整個external_id,而不是大量的刪除事務。

+0

如果我在'external_id'上留下聚簇索引會不好?正如你所建議的,我也在考慮在('external_id,id')上創建聚簇索引,而不是像('id,external_id')上的索引。我不確定是否有意義,儘管... – a1ex07 2011-05-27 00:00:00

+0

本身並不壞,但由於索引與分區相同,因此不能提供任何實際的好處,因此索引不會提供額外的好處。如果你在ID和External_ID上搜索,那麼把它放在CL IX中,如果你保留它 – Andrew 2011-05-27 12:16:02

+0

(通常需要注意,理論是一回事,用真實結果進行性能測試是另一回事) – Andrew 2011-05-27 12:16:23