在SQL Server中,咱們可否找到索引的建立時間?最後一次索引重建(Index Rebuild)的時間? 最後一次索引重組(INDEX REORGANIZE)的時間呢? 答案是咱們沒法準確的找到索引的建立時間、最後一次索引重組時間,最後一次索引重建的時間。 其實就目前SQL Server的各個版本而言,尚未一個系統表或DMV視圖有保存索引建立的時間,索引重建的時間、索引重組的時間。可是有些方法能夠間接獲得最後一次索引重建的時間,可是這個值有時候每每不是準確的(有時候是準確的,有時候是不許確的)。sql
在sys.sysindexes 中沒有記錄索引的建立、修改時間。而在sys.objects中,有create_date和modify_date兩個字段,可是sys.objects不會記錄全部索引的相關信息。因此modify_date的值不能做爲用來判斷索引重建、索引重組的時間。這兩個字段的具體意義以下:app
create_date datetime 對象的建立日期。函數
modify_date datetime 上次使用 ALTER 語句修改對象的日期。 若是對象爲表或視圖,則建立或修改表或視圖的彙集索引時,modify_date 也會隨之更改。測試
其實,咱們每每能夠根據STATS_DATE函數來獲取索引的最後一次重建時間(不許確),STATS_DATE:返回表或索引視圖上統計信息的最新更新的日期。以下測試所示:ui
SELECT * INTO TEST FROM sys.objectsspa
CREATE INDEX PK_TEST ON TEST(object_id);code
CREATE INDEX IX_TEST_N1 ON TEST(name);orm
如上所示,STATS_DATE獲取索引的統計信息更新時間,彷佛能夠做爲索引建立的時間。可是我後面就有例子,反證這個是不許確(不靠譜)的。接下來,咱們看看,使用STATS_DATE來獲取索引重建的時間。以下所示:server
ALTER INDEX IX_TEST_N1 ON TEST REBUILD;
SELECT name AS Stats ,
STATS_DATE(object_id, stats_id) AS LastStatsUpdate
FROM sys.stats
WHERE object_id = OBJECT_ID('dbo.TEST')
AND LEFT(name, 4) != '_WA_';
GO
可是更新索引的統計信息也會引發對應的STATS_DATE的時間變化,此時這個時間就不是索引的最後一次重建時間(Index Rebuild)了。因此使用索引對應統計信息的最後一次更新時間做爲最後一次索引重建的時間,有時候每每不許確。這個只能做爲參考,而不能做爲依據。對象
UPDATE STATISTICS TEST PK_TEST WITH FULLSCAN ;
另外,索引重組(INDEX REORGANIZE)不會引發索引對應統計信息的更新,因此這個STATS_DATE系統函數不能做爲索引重組的時間依據。
ALTER INDEX IX_TEST_N1 ON TEST REORGANIZE;
最後,咱們來看一個例子。以下所示,建立一個空表,咱們能夠看到,沒有生成相關索引的統計信息。這種場景下,STATS_DATE函數返回的值爲NULL,此時能夠看到STATS_DATE 並不能做爲索引建立的時間。或者換個說法,這個案例就是一個活生生的反例。
DROP TABLE TEST;
CREATE TABLE TEST
(
ID INT ,
NAME VARCHAR(12) ,
SEX BIT DEFAULT 0 ,
CONSTRAINT PK_TEST PRIMARY KEY(ID)
);
SELECT GETDATE();
CREATE INDEX IX_TEST_N1 ON TEST(NAME, SEX);
參考資料:
https://dba.stackexchange.com/questions/82943/find-out-when-your-index-was-last-rebuilt-reorganized