2011-09-28 49 views
19

如何查找索引的創建日期。我正在使用SQL2008 R2。 我檢查了sys.indexes,但它沒有創建日期,所以我加入了查詢sys.objects。問題是索引的對象ID和包含該索引的表是相同的。從SQL服務器獲取索引創建日期

我使用此查詢...

select i.name, i.object_id, o.create_date, o.object_id, o.name 
from sys.indexes i 
join sys.objects o on i.object_id=o.object_id 
where i.name = 'Index_Name' 

謝謝!

+0

爲什麼你想創建一個索引的日期? – Ariel

+0

dba.stackexchange.com –

+0

我必須找出在特定表格上創建的最新索引 – vinay

回答

5

試試這個:

SELECT 
    i.name 'Index Name', 
    o.create_date 
FROM 
    sys.indexes i 
INNER JOIN 
    sys.objects o ON i.name = o.name 
WHERE 
    o.is_ms_shipped = 0 
    AND o.type IN ('PK', 'FK', 'UQ') 

object_id指的是指數上....

+4

索引除Pks和UQs(約束)沒有sys.objects中的行... – gbn

+1

這是真的,但它只會給Create_Date表沒有索引 – vinay

+2

FKs不是索引,是嗎? –

11

創建對於那些約束的索引表,然後看看marc_s的回答

對於其他索引,你必須使用STATS_DATE來獲取關聯索引的創建時間(每個索引都有統計數據)

類似於(不是測試)

SELECT STATS_DATE(OBJECT_ID('MyTable'), 
(SELECT index_id FROM sys.indexes WHERE name = 'Index_Name')) 

這依賴於SYS.INDEXES到sys.stats鏈接

編輯:有沒有辦法找出儘可能任何人都可以找到答案。抱歉。

+0

'STATS_DATE'給出統計信息未更新的時間AFAIK –

+0

@Martin Smith:你是對的。我以爲它給了兩個:沒有SQL Server安裝在這裏*和*沒有讀取MSDN ... – gbn

+1

「有沒有辦法」是可悲的唯一正確的答案。 –

2
select 
    crdate, i.name, object_name(o.id) 
from 
    sysindexes i 
join 
    sysobjects o ON o.id = i.id 
where 
    i.name = 'My_Index_Name' 
+4

這會給你表的創建日期,而不是索引。 –

+1

從SQL Server ** 2005 **或更新的版本開始,您應該在'sys'模式中使用目錄視圖 - 使用'sys.indexes'(而不是'sysindexes')和'sys.objects'或更好:'' sys.tables'(而不是'sysobjects') –

1

當創建PK或UK時,SQL Server會自動爲該約束創建唯一索引。這些約束的create_date將與相應索引的創建日期相同。

由於sys.indexes視圖沒有create_date列,因此搜索這類信息絕對沒有用處。而且,這個視圖中的object_id列永遠不會引用相應的約束。它會指向索引所屬的表格。 以下測試將證明這一點:

CREATE TABLE dbo.TEST_T1 
(
    COLUMN_1 INT NOT NULL, 
    COLUMN_2 INT NOT NULL, 
    CONSTRAINT PK_TEST_T1 PRIMARY KEY (COLUMN_1) 
) 
GO 
WAITFOR DELAY '00:00:01'; 

ALTER TABLE dbo.TEST_T1 
    ADD CONSTRAINT UK_TEST_T1 UNIQUE (COLUMN_2) 
GO 

SELECT O.name, O.object_id, O.create_date, I.object_id, I.name AS index_name 
FROM sys.objects AS O 
    LEFT OUTER JOIN sys.indexes AS I ON O.object_id = i.object_id 
WHERE O.name IN ('TEST_T1', 'PK_TEST_T1', 'UK_TEST_T1') 

結果是:

name  object_id create_date    object_id index_name 
PK_TEST_T1 272720024 2015-03-17 11:02:47.197 NULL  NULL 
TEST_T1  256719967 2015-03-17 11:02:47.190 256719967 PK_TEST_T1 
TEST_T1  256719967 2015-03-17 11:02:47.190 256719967 UK_TEST_T1 
UK_TEST_T1 288720081 2015-03-17 11:02:48.207 NULL  NULL 

所以,如果你想看到的PK或UK指標CREATE_DATE有沒有必要加入與SYS.INDEXES 。你應該從sys.objects中選擇:

SELECT name, object_id, create_date 
FROM sys.objects 
WHERE name IN ('PK_TEST_T1', 'UK_TEST_T1') 
AND type IN ('PK', 'UQ') 

結果是:

name  object_id create_date 
PK_TEST_T1 272720024 2015-03-17 11:02:47.197 
UK_TEST_T1 288720081 2015-03-17 11:02:48.207 
6

簡單的查詢,列出指標降序日期(統計)順序。 此日期是上次統計信息更新的狀態,因此只適用於最近創建的索引。

select STATS_DATE(so.object_id, index_id) StatsDate 
, si.name IndexName 
, schema_name(so.schema_id) + N'.' + so.Name TableName 
, so.object_id, si.index_id 
from sys.indexes si 
inner join sys.tables so on so.object_id = si.object_id 
order by 1 desc 
0
USE [YourDB Name] 
SET NOCOUNT ON 

DECLARE @Table_Name varchar(200) 
DECLARE @Index_Name varchar(200) 
DECLARE @Index_Type varchar(50) 

DECLARE Indx_Cursor CURSOR 
STATIC FOR 
      select s_tab.name as Table_Name,s_indx.name as Index_Name,s_indx.type_desc as Index_Type 
      from sys.indexes s_indx 
      inner join sys.tables s_tab on s_tab.object_id=s_indx.object_id 
      where s_indx.name is not null; 

OPEN Indx_Cursor 
    IF @@CURSOR_ROWS > 0 
     BEGIN 
      FETCH NEXT FROM Indx_Cursor INTO @Table_Name,@Index_Name,@Index_Type 

      WHILE @@Fetch_status = 0 
       BEGIN 
        INSERT INTO INDEX_HISTORY(table_name,index_name,Index_Type,Created_date) 
        SELECT @Table_Name,@Index_Name,@Index_Type,STATS_DATE(OBJECT_ID(@Table_Name), 
        (SELECT index_id FROM sys.indexes WHERE name = @Index_Name))as Index_create_Date 

        FETCH NEXT FROM Indx_Cursor INTO @Table_Name,@Index_Name,@Index_Type 
       END 
     END 

CLOSE Indx_Cursor 
DEALLOCATE Indx_Cursor 

select distinct * from index_history 

但隨着指數的主要問題是,當我們重建或重新組織索引,則索引創建日期被更改爲年月日時該指數上次重建或重組。

3

現在,這是一個相當長的死線,但是從SQLPanda下面的查詢得到了我,我需要在Azure上的SQL對於非聚集索引的信息:

SELECT OBJECT_NAME(i.object_id) AS TableName, i.object_id, i.name, i.type_desc,o.create_date, o.modify_date,o.type,i.is_disabled 
FROM sys.indexes i 
     INNER JOIN sys.objects o ON i.object_id = o.object_id 
WHERE o.type NOT IN ('S', 'IT') 
    AND o.is_ms_shipped = 0 
    AND i.name IS NOT NULL 
ORDER BY modify_date DESC 

感謝http://www.sqlpanda.com/2013/10/how-to-check-index-creation-date.html

我只是說修改日期,因爲這是我感興趣的信息。