Получить дату создания индекса с 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'
Спасибо!
Ответы
Ответ 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
Но главная проблема с индексами заключается в том, что когда мы перестраиваем или реорганизуем индексы, дата создания индекса меняется на дату, когда индекс был в последний раз перестроен или реорганизован.