Подтвердить что ты не робот

Получить дату создания индекса с SQL-сервера

Как я могу найти дату создания индекса. Я использую 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'

Спасибо!

4b9b3361

Ответ 1

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

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

Что-то вроде (не проверено)

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

Это зависит от sys.indexes от sys.stats ссылок

Изменить: нет способа узнать, насколько это возможно. К сожалению.

Ответ 2

Попробуйте следующее:

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

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

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

Ответ 4

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

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

Ответ 5

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'

Ответ 6

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

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

Ответ 7

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

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