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!
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.
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
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éé ....
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.
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'
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
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.