web-dev-qa-db-fra.com

Obtenir la date de création de l'index à partir du serveur SQL

Comment puis-je trouver la date de création d'un index. J'utilise SQL2008 R2. J'ai vérifié sys.indexes, mais comme il n'a pas de date de création, j'ai joint la requête avec sys.objects. Le problème est que l'identifiant d'objet pour un index et la table contenant cet index est identique.

J'utilise cette requête ...

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'

Merci!

26
vinay

Pour les index qui sont des contraintes, voir la réponse de marc_s

Pour les autres index, vous devez utiliser STATS_DATE pour obtenir l'heure de création de l'index associé (chaque index contient des statistiques).

Quelque chose comme (non testé)

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

Cela repose sur les fichiers sys.indexes vers sys.stats links

Edit: il n'y a aucun moyen de savoir aussi loin que tout le monde peut le savoir. Pardon.

14
gbn

Requête simple pour répertorier les index par ordre décroissant de date (de statistiques) . Cette date correspond à l'état de la dernière mise à jour des statistiques et n'est donc fiable que pour les index récemment créés.

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
9
WaitForPete

Essaye ça:

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

Le object_id fait référence à la table sur laquelle l'index est créé ....

6
marc_s

Le fil mort est maintenant assez long, mais la requête ci-dessous de SQLPanda m'a fourni les informations dont j'avais besoin sur Azure SQL pour un index non mis en cluster:

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

Crédit à http://www.sqlpanda.com/2013/10/how-to-check-index-creation-date.html

Je viens d’ajouter la date de modification car c’était l’information qui m’intéressait.

5
Dave Hodgson
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'
3
ÄRÜÑ NATH

Lorsque PK ou UK est créé, SQL Server crée automatiquement un index unique pour ces contraintes. La date de création de ces contraintes sera la même que la date de création des index correspondants.

Puisque la vue sys.indexes n'a pas de colonne create_date, il est absolument inutile de rechercher ce type d'informations. De plus, la colonne object_id de cette vue ne fera jamais référence à la contrainte correspondante. Il indiquera la table à laquelle appartient l'index . Le test suivant démontrera le point:

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

Le résultat est:

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

Donc, si vous voulez voir create_date pour les index PK ou UK, vous n'avez pas besoin de rejoindre sys.indexes. Vous devriez choisir parmi 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')

Le résultat est:

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
1
Alex
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

Mais le principal problème des index est que, lorsque nous reconstruisons ou réorganisons des index, la date de création de l'index est remplacée par celle de la dernière reconstruction ou réorganisation de l'index.

0
Parassharma1990