2015-05-21 31 views
2

我有4列一個表,我對這個表3項指標:指數表現,而這樣做插入

CREATE TABLE [dbo].CustomerInfo(
     ID [int] IDENTITY(1,1) NOT NULL, 
     UserHashID [varchar](20) NOT NULL, 
     ShippingID [int] NOT NULL, 
     Received [bit] NOT NULL, 
    CONSTRAINT [PK_ID] PRIMARY KEY CLUSTERED 
    (
     [ID] ASC 
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
    ) ON [PRIMARY] 

CREATE NONCLUSTERED INDEX [IDX_CustomerInfo_ShippingID] ON [dbo].[CustomerInfo] ( [ShippingID] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 

CREATE NONCLUSTERED INDEX [IDX_CustomerInfo_UserHashID] ON [dbo].[CustomerInfo] ( [UserHashID] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 

CREATE NONCLUSTERED INDEX [IDX_CustomerInfo_UserHashIDShippingID] ON [dbo].[CustomerInfo] ( [UserHashID] ASC, [ShippingID] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 

我插入約4-5萬條記錄,這個過程大約需要45分鐘。我意識到,如果我放棄索引,插入方式會更快(2-3分鐘)。

想知道是否有任何副作用,通過刪除索引,插入完成後插入和重建索引。如果啓用索引,整個過程需要5分鐘,而45分鐘。

+0

與論壇網站不同,我們不使用「謝謝」或「任何幫助表示讚賞」,或在[so]上簽名。請參閱「[應該'嗨','謝謝',標語和致敬從帖子中刪除?](http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be - 刪除 - 從帖子)。順便說一句,它是「預先感謝」,而不是「感謝先進」。 –

回答

3

不,沒有任何副作用,即刪除索引,在插入完成後執行插入操作並重新構建索引(假設在執行插入時沒有其他任何操作需要訪問表)。

這是一個相當普遍的模式。

[這一切都說,我驚訝於4列3索引表的時差。你可以發佈你的架構和索引定義嗎?

正如@ PJ8912所指出的,事務日誌日誌記錄可能有一些差異,具體取決於備份事務日誌的頻率。

更新:因爲它是由該指數涵蓋無關,但該指數

CREATE NONCLUSTERED INDEX [IDX_CustomerInfo_UserHashID] 
    ON [dbo].[CustomerInfo] ([UserHashID] ASC) 

是多餘的:

CREATE NONCLUSTERED INDEX [IDX_CustomerInfo_UserHashIDShippingID] 
    ON [dbo].[CustomerInfo] ([UserHashID] ASC, [ShippingID] ASC) 
+0

米奇,我已經添加了表和索引架構。此外,大多數時間沒有其他應用程序訪問此表正如你所提到的那樣,刪除索引,在插入完成後執行插入操作並重新創建索引應該是最佳選擇。但是,有時我有兩個應用程序訪問此表。刪除索引,做插入和重新創建索引?任何方式我可以鎖定這張表,而我插入?謝謝 – user3566591

0

根據交易記錄的水平,TLogs可以填補定期重新創建索引。如果您截斷索引以消除它們,那麼該操作將不會被記錄。

創建新索引後,執行計劃的統計信息可能不是最新的。您可能需要使用FULL SCAN模式更新統計數據。

+0

「執行計劃的統計數據可能不是最新的後,新的索引是創造「 - 我不知道這是正確的。 –

+0

也許我太抽籤(但可以有di不同的統計設置)。我的建議是看性能是否是一個問題,並看看TLogs是否會迅速變大。我認爲,刪除和創建索引是一種很好的做法。 – PJ8912

+0

統計信息在大量低於統計更新閾值的插入之後可能不是最新的。 –

相關問題