--------------------------------------------------------
-- table creation:
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[IndexFrag]') AND type in (N'U'))
BEGIN
DROP TABLE [dbo].[IndexFrag]
END
GO
CREATE TABLE [dbo].[IndexFrag]
(
[IndexFragId] [int] NOT NULL identity(1,1),
[IndexFragInt] [int] NOT NULL,
[IndexFragText] [nvarchar](256) NULL,
) ON [PRIMARY]
GO
--------------------------------------------------------
-- data insertion:
INSERT INTO [dbo].[IndexFrag] (IndexFragInt, IndexFragText)
SELECT column_id, [name] from sys.columns;
GO
CREATE NONCLUSTERED INDEX IX_IndexFrag_IndexFragInt ON [dbo].[IndexFrag] ([IndexFragInt]);
GO
--------------------------------------------------------
-- make an operation on the index that will "add" it to sys.dm_db_index_usage_stats
select * from [dbo].[IndexFrag] where IndexFragInt > 5;
DELETE IndexFrag WHERE IndexFragId % 2= 0;
GO
--------------------------------------------------------
-- select:
select iu.database_id,
iu.object_id, OBJECT_NAME(iu.object_id) as TableName,
iu.index_id, x.name as IndexName, x.type_desc,
ips.avg_fragmentation_in_percent,
iu.user_scans, iu.system_scans, iu.user_updates
from sys.dm_db_index_usage_stats iu
INNER JOIN sys.partitions p ON iu.object_id = p.object_id and iu.index_id = p.index_id
INNER JOIN sys.objects o (nolock) ON iu.object_id = o.object_id and o.type='U'
INNER JOIN sys.indexes x (nolock) ON x.object_id = iu.object_id AND x.index_id = iu.index_id
and x.type_desc in ('CLUSTERED','NONCLUSTERED')
cross apply sys.dm_db_index_physical_stats (iu.database_id,iu.object_id,iu.index_id,p.partition_number,null) ips
WHERE iu.database_id = db_id('sales')
GO
--------------------------------------------------------
-- increase operations number
declare @MinutesFromSqlStart int, @i int = 0, @Operations int;
SELECT @MinutesFromSqlStart = DATEDIFF(minute, sqlserver_start_time, GETDATE()) FROM sys.dm_os_sys_info;
-- for MSSQL 2005 use this query to get @MinutesFromSqlStart (sys.dm_os_sys_info.sqlserver_start_time doesn't exists before SQL Server 2008)
--SELECT @MinutesFromSqlStart = DATEDIFF(minute, login_time, GETDATE()) --get the sqlserver start time
--FROM sys.dm_exec_sessions WHERE session_id = 1
-- get to operations number Per Day (since instance last restart) bigger than 1:
select @Operations = (cast( cast(1 as decimal(20, 2)) / cast(60 as decimal(20, 2)) * cast(@MinutesFromSqlStart as decimal(20, 2)) as int) + 1) * 2
-- for other operations number:
-- select @Operations = ?
WHILE @i < @Operations
BEGIN
INSERT INTO [dbo].[IndexFrag] (IndexFragInt, IndexFragText)
SELECT TOP 10 column_id, [name] from sys.columns;
SET @i = @i + 1;
END
GO
--------------------------------------------------------
-- select:
select iu.database_id,
iu.object_id, OBJECT_NAME(iu.object_id) as TableName,
iu.index_id, x.name as IndexName, x.type_desc,
ips.avg_fragmentation_in_percent,
iu.user_scans, iu.system_scans, iu.user_updates
from sys.dm_db_index_usage_stats iu
INNER JOIN sys.partitions p ON iu.object_id = p.object_id and iu.index_id = p.index_id
INNER JOIN sys.objects o (nolock) ON iu.object_id = o.object_id and o.type='U'
INNER JOIN sys.indexes x (nolock) ON x.object_id = iu.object_id AND x.index_id = iu.index_id
and x.type_desc in ('CLUSTERED','NONCLUSTERED')
cross apply sys.dm_db_index_physical_stats (iu.database_id,iu.object_id,iu.index_id,p.partition_number,null) ips
WHERE iu.database_id = db_id('sales')
GO