用許多值重建表中的索引
我是初級 DBA,有 1100 萬個值的表,其中一個索引如下:
CREATE NONCLUSTERED INDEX [ix_mytbl_mycolumn] ON [dbo].[myTbl] ( [my_id] DESC )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, FILLFACTOR = 80) ON [PRIMARY] GO
重建這個索引只需要
ALTER INDEX [ix_mytbl_mycolumn] ON [dbo].[myTbl] REBUILD;
或者有大表需要準備一些東西。還有一個問題在這個表中我有一些列有
asc
索引,一些列有desc
,重建這個表中的所有索引後會不會有什麼問題?(例如:慢速選擇/插入)。重建這個索引是個好主意嗎?SQL 伺服器版本:
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) Apr 2 2010 15:48:46 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.1 <X64>
您應該做的第一件事是盡快應用SQL Server 2008 R2 SP3。這是因為 SQL Server 2008 R2 RTM 版本是
not supported at all
由 Microsoft 提供的。此 Service Pack 版本中包含許多修復程序,這肯定會有益於 SQL Server 查詢性能。你問,所以重建所有索引是個好主意?
不它不是。應該只重建碎片高於某個值的索引。可能廣泛使用的值是,如果索引碎片>30,則應該進行重建,而它在 10 到 30 之間,則應該進行重組。請注意,您有標準版,因此索引重建不會線上。如果你盲目地重建索引,它會導致更多的停機時間並產生更多的日誌,從而增加系統的成本。如果您有狹窄的維護視窗,您需要對索引重建具有高度選擇性,如果您選擇 Ola Hallengren 索引重建解決方案,所有這些都可以得到照顧
另外需要注意的是,如果 index 的 page_count,可以從sys.dm_db_index_physical_stats中看到 page_count小於 1000,則不需要重建此類索引。原因是由於分配給索引的頁數較少,因此來自混合範圍的頁數較少,並且這些混合頁可能位於任何地方,因此即使在重建後也會產生邏輯碎片。但請放心,如此小的頁數索引根本不會影響查詢性能。您可以在此處閱讀更多關於為什麼這些索引即使在重新建構後仍然保持碎片化的資訊
您可以在索引重建中選擇多種選項,您可以在此處查看更多詳細資訊。很多取決於您的環境和配置
您可以從這篇文章中閱讀更多關於查詢計劃的資訊。您應該更多地關注實際的查詢計劃而不是估計的查詢計劃。Actual 會告訴您 SQL Server 到底在做什麼以及它正在使用什麼資源。
您還可以嘗試使用SQL Sentry Plan explorer 工具來更好地了解 SQL Server 執行計劃