41 Stimmen

Holen Sie sich das Indizierungserstellungsdatum vom SQL-Server

Wie kann ich das Erstellungsdatum eines Index finden? Ich benutze SQL2008 R2. Ich habe sys.indexes überprüft, aber es hat kein Erstellungsdatum, also habe ich die Abfrage mit sys.objects verbunden. Das Ding ist, dass die Objekt-ID für einen Index und die Tabelle, die diesen Index enthält, gleich sind.

Ich benutze diese Abfrage...

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'

Danke!

16voto

gbn Punkte 407102

Für Indizes, die Einschränkungen sind, siehe die Antwort von marc_s

Für andere Indizes müssten Sie STATS_DATE verwenden, um die Erstellungszeit des zugehörigen Index zu erhalten (jeder Index hat Statistiken darüber)

So etwas wie (nicht getestet)

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

Dies basiert auf den sys.indexes zu sys.stats links

Bearbeitung: Es gibt keinen bekannten Weg, um es herauszufinden. Entschuldigung.

14voto

WaitForPete Punkte 387

Einfache Abfrage zur Auflistung von Indizes in absteigender Datum (der Statistik) Reihenfolge. Dieses Datum ist das Datum des letzten Statistik-Updates, es ist also nur für kürzlich erstellte Indizes zuverlässig.

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

7voto

Dave Hodgson Punkte 103

Dies ist jetzt ein ziemlich langer Thread, aber die folgende Abfrage von SQLPanda hat mir die Informationen geliefert, die ich zu Azure SQL für einen nicht gruppierten Index benötigte:

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

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

Ich habe einfach das Änderungsdatum hinzugefügt, da das die Information war, an der ich interessiert war.

5voto

marc_s Punkte 701497

Versuchen Sie dies:

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')

Die object_id bezieht sich auf die Tabelle, auf der der Index erstellt wird....

3voto

Alex Punkte 413

Wenn PK oder UK erstellt wird, erstellt SQL Server automatisch einen eindeutigen Index für diese Einschränkungen. Das create_date dieser Einschränkungen wird das gleiche sein wie das Erstellungsdatum der entsprechenden Indizes.

Da die sys.indexes-Ansicht keine Spalte create_date hat, ist sie absolut nutzlos für die Suche nach dieser Art von Informationen. Darüber hinaus wird die object_id-Spalte in dieser Ansicht niemals auf die entsprechende Einschränkung verweisen. Es wird auf die Tabelle zeigen, zu der der Index gehört. Der folgende Test wird diesen Punkt verdeutlichen:

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')

Das Ergebnis ist:

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

Also, wenn Sie das Erstellungsdatum für PK oder UK-Indizes sehen möchten, ist es nicht notwendig, sich mit sys.indexes zu verbinden. Sie sollten von sys.objects auswählen:

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

Das Ergebnis ist:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X