2016-04-21 76 views
0

我有幾個表(基表),每週插入和更新兩次。我早就在這些表上創建了索引。重新創建索引會提高性能

我在存儲過程(不帶任何參數)在這些表的頂部應用邏輯並創建最終輸出表。

我使用SQL Server代理作業每週安排兩次這個存儲過程。

它現在(50分鐘)運行緩慢,而如果我手動運行該存儲過程,其運行速度更快(15 - 18分鐘)

我必須刪除索引,每當插入或更新是發生在基表,並在插入或更新後重新創建它?

如果是這樣,我必須每週都這樣做嗎?

它對SQL Server代理作業的性能有什麼影響?

+0

您應該不必在每次數據更改後手動維護索引。實際上你只應該這樣做,如果索引非常分散,並且經常使用。很難給出確切的答案,因爲它很大程度上取決於你的確切情況,但我建議你閱讀這個主題,進行一些測量和測試 - 然後形成一個可以使用的策略。 –

回答

0

索引確實需要維護,但它們的執行速度完全取決於有多少數據發生更改,以及如何對這些更改進行排序。您可以搜索任意數量的腳本來檢查您的索引碎片,以及如何對它們進行碎片整理。通常即使對於較大的數據庫,每週或每晚的維護也綽綽有餘。

反正就是執行時間的不同取決於你如何運行的事實,指出了兩個可能的原因:

參數化,或者通過連接所使用的設置屬性。

如果您的過程使用參數,但是您手動運行腳本給出參數值,那麼SQL Server會準確知道您正在使用哪些值,並且可以優化查詢執行以在現場正確使用索引等。如果您的代理使用相同的參數調用過程,那麼過程是不同的。 SQL Server可能不知道正在使用哪些值,所以它必須使用覆蓋索引或者更糟的是,甚至在表掃描上完全掃描(讀取整個表中的所有數據,渲染索引無用),以確保它能夠找到所有查詢的相關數據。 Google SQL Server參數化,您可以瞭解更多信息。

另一方面,set屬性控制在通過Management Studio直接連接到數據庫時自動應用的特定會話屬性。但是,當您使用代理作業時,情況可能並非如此。這也可能導致一個不同的計劃,這將花費更多的時間。

這兩種情況都取決於您的數據庫設置和程序的工作方式。所以我們必須在這裏猜測。

但通常情況下,你需要設置一個腳本開頭以下性質的代理工作,以配合您的常規管理Studio會話中使用的會話屬性:

SET ANSI_NULLS ON; 
GO 
SET QUOTED_IDENTIFIER ON; 
GO 

所有條款這裏可以被Google搜索。我建議你這樣做。這些文章可以解釋這些事情比我花費的時間要好得多,特別是考慮到這一點 - 沒有打算不尊重 - 你對SQL Server相對來說比較陌生。因此,在這裏用適當的術語解釋這些事情是很困難的。 :)