2011-09-28 33 views
19

¿Cómo puedo encontrar la fecha de creación de un índice? Estoy usando SQL2008 R2. Marqué sys.indexes pero no tiene una fecha de creación, así que me uní a la consulta con sys.objects. Lo que ocurre es que la identificación de objeto para un índice y la tabla que contiene ese índice es la misma.Obtener fecha de creación de índice del servidor SQL

estoy usando esta consulta ...

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' 

Gracias!

+0

¿Por qué quieres crear la fecha para un índice? – Ariel

+0

dba.stackexchange.com –

+0

Tengo que encontrar el último índice que se crea en una tabla particular – vinay

Respuesta

5

Prueba esto:

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

El object_id se refiere a la tabla se crea el índice en ....

+4

Los índices distintos de Pks y UQ (restricciones) no tienen filas en sys.objects ... – gbn

+1

que es cierto pero solo dará Create_Date para la tabla sin índice – vinay

+2

FKs no son índices, ¿o sí? –

11

Para los índices que son limitaciones, a continuación, véase la respuesta marc_s'

Por otra índices, debe usar STATS_DATE para obtener la hora de creación del índice asociado (cada índice tiene estadísticas)

Algo así como (no probado)

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

Esto se basa en los sys.indexes a sys.stats enlaces

Editar: no hay manera de saber por lo que cualquiera puede averiguar. Lo siento.

+0

'STATS_DATE' da la hora en que se actualizaron las estadísticas no creadas AFAIK –

+0

@Martin Smith: Tiene razón. Pensé que daba los dos: no tengo SQL Server instalado aquí * y * no he leído MSDN ... – gbn

+1

"No hay forma" es tristemente la única respuesta correcta. –

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

Eso le dará la fecha de creación de la tabla, no el índice. –

+1

A partir de SQL Server ** 2005 ** o posterior, debe usar la vista de catálogo en el esquema 'sys' - use' sys.indexes' (en lugar de 'sysindexes') y' sys.objects' o mejor aún: ' sys.tables' (en lugar de 'sysobjects') –

1

Cuando se crea PK o UK, SQL Server crea automáticamente un índice único para esas restricciones. La fecha de creación de esas restricciones será la misma que la fecha de creación para los índices correspondientes.

Dado que la vista sys.indexes no tiene la columna create_date, es absolutamente inútil buscar este tipo de información. Además, la columna object_id en esta vista nunca se referirá a la restricción correspondiente. Apuntará a la tabla a la que pertenece el índice. La siguiente prueba demostrará el punto:

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

El resultado es:

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 

lo tanto, si usted quiere ver create_date para PK o Reino Unido índices no hay necesidad de unirse con sys.indexes . Usted debe seleccionar de 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') 

El resultado es:

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

simple consulta a la lista de índices en la fecha (de estadísticas) orden descendente. Esta fecha es la última actualización de las estadísticas, por lo que solo es confiable para los índices creados recientemente.

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 

Sin embargo, el principal problema de los índices es que cuando reconstruir o reorganizar índices entonces la fecha de creación del índice se cambia a la fecha en que el índice era la última reconstruido o reorganizado.

3

Esto es ahora un hilo muerto bastante largo pero la consulta por debajo de SQLPanda me consiguió la información que necesitaba sobre el Azure SQL para un índice agrupado no:

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édito a http://www.sqlpanda.com/2013/10/how-to-check-index-creation-date.html

Acabo de añadir la fecha de modificación ya que esa era la información que me interesaba.

Cuestiones relacionadas