Получить дату создания индекса с сервера SQL - PullRequest
28 голосов
/ 28 сентября 2011

Как найти дату создания индекса.Я использую SQL2008 R2.Я проверил sys.indexes, но у него нет даты создания, поэтому я присоединился к запросу с sys.objects.Дело в том, что идентификатор объекта для индекса и таблицы, содержащей этот индекс, одинаковы.

Я использую этот запрос ...

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'

Спасибо!

Ответы [ 7 ]

14 голосов
/ 28 сентября 2011

Для индексов, которые являются ограничениями, см. Ответ marc_s

Для других индексов вам придется использовать STATS_DATE, чтобы получить время создания ассоциированного индекса (каждый индекс имеет статистику)

Нечто подобное (не проверено)

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

Это зависит от sys.indexes для sys.stats links

Редактировать: нет способа узнать так далеко, как кто-либо может узнать. К сожалению.

9 голосов
/ 06 июля 2015

Простой запрос к списку индексов в порядке убывания даты (статистики).Эта дата является датой последнего обновления статистики, поэтому она надежна только для недавно созданных индексов.

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
8 голосов
/ 13 мая 2017

Теперь это довольно длинный мертвый поток, но приведенный ниже запрос от 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

Я только что добавил дату изменения, поскольку это была информация, которая меня интересовала.

6 голосов
/ 28 сентября 2011

Попробуйте:

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 относится к таблице, для которой создан индекс ....

3 голосов
/ 04 декабря 2014
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'
2 голосов
/ 17 марта 2015

Когда создается PK или UK, SQL Server автоматически создает уникальный индекс для этих ограничений. Дата создания этих ограничений будет такой же, как дата создания соответствующих индексов.

Поскольку представление 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

Итак, если вы хотите увидеть create_date для индексов PK или UK, нет необходимости присоединяться к 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
0 голосов
/ 29 ноября 2016
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

Но основная проблема с индексами заключается в том, что когда мы перестраиваем или реорганизуем индексы, тогда дата создания индекса изменяется на дату, когда индекс был последний раз перестроен или реорганизован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...