--DBCC TRACESTATUS(-1);
--GO
--DBCC TRACESTATUS (2528, 3205);
--GO
--DBCC TRACESTATUS (3205, -1);
--GO
--DBCC TRACESTATUS();
--GO
--DBCC TRACESTATUS(-1);
--DBCC TRACEOFF(8602, 8755, 8722)
--DBCC TRACEON(8602, 8755, 8722)
--DBCC TRACEON(8602)
--select * from Wiz_00004.dbo.LARData with (INDEX = 2)
USE [General]
GO
-- List all heap tables
SELECT SCH.name + '.' + TBL.name AS TableName
FROM sys.tables AS TBL
INNER JOIN sys.schemas AS SCH
ON TBL.schema_id = SCH.schema_id
INNER JOIN sys.indexes AS IDX
ON TBL.object_id = IDX.object_id
AND IDX.type = 0 -- = Heap
ORDER BY TableName
--drop table GenderNG
--1 - Table with no indexes
if OBJECT_ID('GenderNG') is NOT null drop table GenderNG
select IDENTITY(int,1,1) as RowNumb,* INTO GenderNG from
General.dbo.Gender
print 'Getting heap table scan'
select * from GenderNG where gendername='YOSHIE'
GO
--2- Table with non-clustered index on gendername column
IF EXISTS (SELECT * FROM sys.indexes WHERE object_id =
OBJECT_ID(N'[dbo].[GenderNG]') AND name = N'nc_gendername')
DROP INDEX [nc_gendername] ON [dbo].[GenderNG] WITH ( ONLINE = OFF )
GO
CREATE NONCLUSTERED INDEX [nc_gendername] ON [dbo].[GenderNG]
(
[gendername] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB
= OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
print 'Getting index seek & heap table lookup'
select * from GenderNG where gendername='YOSHIE'
--3- Table with clustered index on gendername column
IF EXISTS (SELECT * FROM sys.indexes WHERE object_id =
OBJECT_ID(N'[dbo].[GenderNG]') AND name = N'cl_gendername')
DROP INDEX [cl_gendername] ON [dbo].[GenderNG] WITH ( ONLINE = OFF )
GO
CREATE CLUSTERED INDEX [cl_gendername] ON [dbo].[GenderNG]
(
[gendername] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB
= OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
select * from GenderNG where gendername='YOSHIE'
GO
GO
--4- Table with clustered index on rownumb and non-clustered on
gendername column
--dropping previous CL IDX
IF EXISTS (SELECT * FROM sys.indexes WHERE object_id =
OBJECT_ID(N'[dbo].[GenderNG]') AND name = N'cl_gendername')
DROP INDEX [cl_gendername] ON [dbo].[GenderNG] WITH ( ONLINE = OFF )
GO
IF EXISTS (SELECT * FROM sys.indexes WHERE object_id =
OBJECT_ID(N'[dbo].[GenderNG]') AND name = N'cl_rownumb')
DROP INDEX [cl_rownumb] ON [dbo].[GenderNG] WITH ( ONLINE = OFF )
GO
CREATE CLUSTERED INDEX [cl_rownumb] ON [dbo].[GenderNG]
(
[rownumb] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB
= OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON ) ON [PRIMARY]
GO
select * from GenderNG where gendername='YOSHIE'
--Fill Factor
exec sp_spaceused 'dbo.GenderNG'
IF EXISTS (SELECT * FROM sys.indexes WHERE object_id =
OBJECT_ID(N'[dbo].[GenderNG]') AND name = N'nc_gendername')
DROP INDEX [nc_gendername] ON [dbo].[GenderNG] WITH ( ONLINE = OFF )
GO
CREATE NONCLUSTERED INDEX [nc_gendername] ON [dbo].[GenderNG]
(
[gendername] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB
= OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 50) ON
[PRIMARY]
GO
print 'Approximatly twice the size of the index created earlier'
exec sp_spaceused 'dbo.GenderNG'
GO
--This function gives you information about insert, update and delete
operations that occur on a particular index
SELECT OBJECT_NAME(A.[OBJECT_ID]) AS [OBJECT NAME],
I.[NAME] AS [INDEX NAME],
A.LEAF_INSERT_COUNT,
A.LEAF_UPDATE_COUNT,
A.LEAF_DELETE_COUNT
FROM SYS.DM_DB_INDEX_OPERATIONAL_STATS (NULL,NULL,NULL,NULL ) A
INNER JOIN SYS.INDEXES AS I
ON I.[OBJECT_ID] = A.[OBJECT_ID]
AND I.INDEX_ID = A.INDEX_ID
WHERE OBJECTPROPERTY(A.[OBJECT_ID],'IsUserTable') = 1
GO
--This view gives you information about overall access methods to your
indexes.
SELECT OBJECT_NAME(S.[OBJECT_ID]) AS [OBJECT NAME],
I.[NAME] AS [INDEX NAME],
USER_SEEKS,
USER_SCANS,
USER_LOOKUPS,
USER_UPDATES
FROM SYS.DM_DB_INDEX_USAGE_STATS AS S
INNER JOIN SYS.INDEXES AS I
ON I.[OBJECT_ID] = S.[OBJECT_ID]
AND I.INDEX_ID = S.INDEX_ID
WHERE OBJECTPROPERTY(S.[OBJECT_ID],'IsUserTable') = 1
--we are just using sys.dm_db_index_usage_stats and sys.objects to get
a list of the indexes that have been used and how they are being used.
SELECT DB_NAME(DATABASE_ID) AS DATABASENAME,
OBJECT_NAME(B.OBJECT_ID) AS TABLENAME,
INDEX_NAME = (SELECT NAME
FROM SYS.INDEXES A
WHERE A.OBJECT_ID = B.OBJECT_ID
AND A.INDEX_ID = B.INDEX_ID),
USER_SEEKS,
USER_SCANS,
USER_LOOKUPS,
USER_UPDATES
FROM SYS.DM_DB_INDEX_USAGE_STATS B
INNER JOIN SYS.OBJECTS C
ON B.OBJECT_ID = C.OBJECT_ID
WHERE DATABASE_ID = DB_ID(DB_NAME())
AND C.TYPE <> 'S'
--we are listing each user table and all of the tables indexes that
have not been used by using a NOT EXISTS against
sys.dm_db_index_usage_stats.
SELECT DB_NAME() AS DATABASENAME,
OBJECT_NAME(B.OBJECT_ID) AS TABLENAME,
B.NAME AS INDEXNAME,
B.INDEX_ID
FROM SYS.OBJECTS A
INNER JOIN SYS.INDEXES B
ON A.OBJECT_ID = B.OBJECT_ID
WHERE NOT EXISTS (SELECT *
FROM SYS.DM_DB_INDEX_USAGE_STATS C
WHERE B.OBJECT_ID = C.OBJECT_ID
AND B.INDEX_ID = C.INDEX_ID)
AND A.TYPE <> 'S'
ORDER BY 1, 2, 3
--In this query we are listing each user table, all of its indexes and
the columns that make up the index.
SELECT A.NAME,
B.NAME,
C.KEY_ORDINAL,
D.NAME
FROM SYS.OBJECTS A
INNER JOIN SYS.INDEXES B
ON A.OBJECT_ID = B.OBJECT_ID
INNER JOIN SYS.INDEX_COLUMNS C
ON B.OBJECT_ID = C.OBJECT_ID
AND B.INDEX_ID = C.INDEX_ID
INNER JOIN SYS.COLUMNS D
ON C.OBJECT_ID = D.OBJECT_ID
AND C.COLUMN_ID = D.COLUMN_ID
WHERE A.TYPE <> 'S'
ORDER BY 1, 2, 3
--Covering Index Information
SELECT
SCHEMA_NAME([sObj].[schema_id]) AS [SchemaName]
, [sObj].[name] AS [ObjectName]
, CASE
WHEN [sObj].[type] = 'U' THEN 'Table'
WHEN [sObj].[type] = 'V' THEN 'View'
END AS [ObjectType]
, [sIdx].[index_id] AS [IndexID] -- 0: Heap; 1: Clustered Idx; >
1: Nonclustered Idx;
, ISNULL([sIdx].[name], 'N/A') AS [IndexName]
, CASE
WHEN [sIdx].[type] = 0 THEN 'Heap'
WHEN [sIdx].[type] = 1 THEN 'Clustered'
WHEN [sIdx].[type] = 2 THEN 'Nonclustered'
WHEN [sIdx].[type] = 3 THEN 'XML'
WHEN [sIdx].[type] = 4 THEN 'Spatial'
WHEN [sIdx].[type] = 5 THEN 'Reserved for future use'
WHEN [sIdx].[type] = 6 THEN 'Nonclustered columnstore index'
END AS [IndexType]
, [sCol].[name] AS [ColumnName]
, CASE
WHEN [sIdxCol].[is_included_column] = 0x1 THEN 'Yes'
WHEN [sIdxCol].[is_included_column] = 0x0 THEN 'No'
WHEN [sIdxCol].[is_included_column] IS NULL THEN 'N/A'
END AS [IsIncludedColumn]
, [sIdxCol].[key_ordinal] AS [KeyOrdinal]
FROM
[sys].[indexes] AS [sIdx]
INNER JOIN [sys].[objects] AS [sObj]
ON [sIdx].[object_id] = [sObj].[object_id]
LEFT JOIN [sys].[index_columns] AS [sIdxCol]
ON [sIdx].[object_id] = [sIdxCol].[object_id]
AND [sIdx].[index_id] = [sIdxCol].[index_id]
LEFT JOIN [sys].[columns] AS [sCol]
ON [sIdxCol].[object_id] = [sCol].[object_id]
AND [sIdxCol].[column_id] = [sCol].[column_id]
WHERE
SCHEMA_NAME([sObj].[schema_id]) = 'Production'
AND [sObj].[name] = 'ProductReview'
AND [sIdx].[name] = 'IX_ProductReview_ProductID_Name'
--query the physical statistics of an index like Size, Percentage
Fragmentation etc
SELECT
@@SERVERNAME AS [ServerName]
, DB_NAME() AS [DatabaseName]
, SCHEMA_NAME([sObj].[schema_id]) AS [SchemaName]
, [sObj].[name] AS [ObjectName]
, CASE
WHEN [sObj].[type] = 'U' THEN 'Table'
WHEN [sObj].[type] = 'V' THEN 'View'
END AS [ObjectType]
, [sIdx].[index_id] AS [IndexID]
, ISNULL([sIdx].[name], 'N/A') AS [IndexName]
, CASE
WHEN [sIdx].[type] = 0 THEN 'Heap'
WHEN [sIdx].[type] = 1 THEN 'Clustered'
WHEN [sIdx].[type] = 2 THEN 'Nonclustered'
WHEN [sIdx].[type] = 3 THEN 'XML'
WHEN [sIdx].[type] = 4 THEN 'Spatial'
WHEN [sIdx].[type] = 5 THEN 'Reserved for future use'
WHEN [sIdx].[type] = 6 THEN 'Nonclustered columnstore index'
END AS [IndexType]
, ISNULL([sPtn].[partition_number], 1) AS [PartitionNumber]
, [sdmfIPS].[alloc_unit_type_desc] AS [IndexAllocationUnitType]
, [IdxSizeDetails].[IndexSizeInKB]
, [sIdx].[fill_factor] AS [FillFactor]
, CAST([sdmfIPS].[avg_fragmentation_in_percent] AS NUMERIC(5,2)) AS
[AvgPctFrag]
FROM
[sys].[indexes] AS [sIdx]
INNER JOIN [sys].[objects] AS [sObj]
ON [sIdx].[object_id] = [sObj].[object_id]
LEFT JOIN [sys].[partitions] AS [sPtn]
ON [sIdx].[object_id] = [sPtn].[object_id]
AND [sIdx].[index_id] = [sPtn].[index_id]
LEFT JOIN (
SELECT
[sIdx].[object_id]
, [sIdx].[index_id]
, SUM([sAU].[used_pages]) * 8 AS [IndexSizeInKB]
FROM
[sys].[indexes] AS [sIdx]
INNER JOIN [sys].[partitions] AS [sPtn]
ON [sIdx].[object_id] = [sPtn].[object_id]
AND [sIdx].[index_id] = [sPtn].[index_id]
INNER JOIN [sys].[allocation_units] AS [sAU]
ON [sPtn].[partition_id] = [sAU].[container_id]
GROUP BY [sIdx].[object_id], [sIdx].[index_id]
) [IdxSizeDetails]
ON [sIdx].[object_id] = [IdxSizeDetails].[object_id]
AND [sIdx].[index_id] = [IdxSizeDetails].[index_id]
LEFT JOIN [sys].[dm_db_index_physical_stats]
(DB_ID(),NULL,NULL,NULL,'LIMITED') [sdmfIPS]
ON [sIdx].[object_id] = [sdmfIPS].[object_id]
AND [sIdx].[index_id] = [sdmfIPS].[index_id]
AND [sdmfIPS].[database_id] = DB_ID()
WHERE
[sObj].[type] IN ('U','V') -- Look in Tables & Views
AND [sObj].[is_ms_shipped] = 0x0 -- Exclude System Generated
Objects
AND [sIdx].[is_disabled] = 0x0 -- Exclude Disabled Indexes
-- understanding how effectively the existing indexes are being used.
SELECT
@@SERVERNAME AS [ServerName]
, DB_NAME() AS [DatabaseName]
, SCHEMA_NAME([sObj].[schema_id]) AS [SchemaName]
, [sObj].[name] AS [ObjectName]
, CASE
WHEN [sObj].[type] = 'U' THEN 'Table'
WHEN [sObj].[type] = 'V' THEN 'View'
END AS [ObjectType]
, [sIdx].[index_id] AS [IndexID]
, ISNULL([sIdx].[name], 'N/A') AS [IndexName]
, CASE
WHEN [sIdx].[type] = 0 THEN 'Heap'
WHEN [sIdx].[type] = 1 THEN 'Clustered'
WHEN [sIdx].[type] = 2 THEN 'Nonclustered'
WHEN [sIdx].[type] = 3 THEN 'XML'
WHEN [sIdx].[type] = 4 THEN 'Spatial'
WHEN [sIdx].[type] = 5 THEN 'Reserved for future use'
WHEN [sIdx].[type] = 6 THEN 'Nonclustered columnstore index'
END AS [IndexType]
, [sdmvIUS].[user_seeks] AS [TotalUserSeeks]
, [sdmvIUS].[user_scans] AS [TotalUserScans]
, [sdmvIUS].[user_lookups] AS [TotalUserLookups]
, [sdmvIUS].[user_updates] AS [TotalUserUpdates]
, [sdmvIUS].[last_user_seek] AS [LastUserSeek]
, [sdmvIUS].[last_user_scan] AS [LastUserScan]
, [sdmvIUS].[last_user_lookup] AS [LastUserLookup]
, [sdmvIUS].[last_user_update] AS [LastUserUpdate]
, [sdmfIOPS].[leaf_insert_count] AS [LeafLevelInsertCount]
, [sdmfIOPS].[leaf_update_count] AS [LeafLevelUpdateCount]
, [sdmfIOPS].[leaf_delete_count] AS [LeafLevelDeleteCount]
FROM
[sys].[indexes] AS [sIdx]
INNER JOIN [sys].[objects] AS [sObj]
ON [sIdx].[object_id] = [sObj].[object_id]
LEFT JOIN [sys].[dm_db_index_usage_stats] AS [sdmvIUS]
ON [sIdx].[object_id] = [sdmvIUS].[object_id]
AND [sIdx].[index_id] = [sdmvIUS].[index_id]
AND [sdmvIUS].[database_id] = DB_ID()
LEFT JOIN [sys].[dm_db_index_operational_stats]
(DB_ID(),NULL,NULL,NULL) AS [sdmfIOPS]
ON [sIdx].[object_id] = [sdmfIOPS].[object_id]
AND [sIdx].[index_id] = [sdmfIOPS].[index_id]
WHERE
[sObj].[type] IN ('U','V') -- Look in Tables & Views
AND [sObj].[is_ms_shipped] = 0x0 -- Exclude System Generated
Objects
AND [sIdx].[is_disabled] = 0x0 -- Exclude Disabled Indexes
-- unused indexes.
SELECT
@@SERVERNAME AS [ServerName]
, DB_NAME() AS [DatabaseName]
, SCHEMA_NAME([sObj].[schema_id]) AS [SchemaName]
, [sObj].[name] AS [ObjectName]
, CASE
WHEN [sObj].[type] = 'U' THEN 'Table'
WHEN [sObj].[type] = 'V' THEN 'View'
END AS [ObjectType]
, [sIdx].[index_id] AS [IndexID]
, ISNULL([sIdx].[name], 'N/A') AS [IndexName]
, CASE
WHEN [sIdx].[type] = 0 THEN 'Heap'
WHEN [sIdx].[type] = 1 THEN 'Clustered'
WHEN [sIdx].[type] = 2 THEN 'Nonclustered'
WHEN [sIdx].[type] = 3 THEN 'XML'
WHEN [sIdx].[type] = 4 THEN 'Spatial'
WHEN [sIdx].[type] = 5 THEN 'Reserved for future use'
WHEN [sIdx].[type] = 6 THEN 'Nonclustered columnstore index'
END AS [IndexType]
FROM
[sys].[indexes] AS [sIdx]
INNER JOIN [sys].[objects] AS [sObj]
ON [sIdx].[object_id] = [sObj].[object_id]
WHERE
NOT EXISTS (
SELECT *
FROM [sys].[dm_db_index_usage_stats] AS [sdmfIUS]
WHERE
[sIdx].[object_id] = [sdmfIUS].[object_id]
AND [sIdx].[index_id] = [sdmfIUS].[index_id]
AND [sdmfIUS].[database_id] = DB_ID()
)
AND [sObj].[type] IN ('U','V') -- Look in Tables & Views
AND [sObj].[is_ms_shipped] = 0x0 -- Exclude System Generated
Objects
AND [sIdx].[is_disabled] = 0x0 -- Exclude Disabled Indexes
-- missing index
SELECT
@@SERVERNAME AS [ServerName]
, DB_NAME() AS [DatabaseName]
, SCHEMA_NAME([sObj].[schema_id]) AS [SchemaName]
, [sObj].[name] AS [ObjectName]
, CASE [sObj].[type]
WHEN 'U' THEN 'Table'
WHEN 'V' THEN 'View'
ELSE 'Unknown'
END AS [ObjectType]
, [sdmvMID].[equality_columns] AS [EqualityColumns]
, [sdmvMID].[inequality_columns] AS [InequalityColumns]
, [sdmvMID].[included_columns] AS [IncludedColumns]
, [sdmvMIGS].[user_seeks] AS [ExpectedIndexSeeksByUserQueries]
, [sdmvMIGS].[user_scans] AS [ExpectedIndexScansByUserQueries]
, [sdmvMIGS].[last_user_seek] AS
[ExpectedLastIndexSeekByUserQueries]
, [sdmvMIGS].[last_user_scan] AS
[ExpectedLastIndexScanByUserQueries]
, [sdmvMIGS].[avg_total_user_cost] AS
[ExpectedAvgUserQueriesCostReduction]
, [sdmvMIGS].[avg_user_impact] AS
[ExpectedAvgUserQueriesBenefitPct]
FROM
[sys].[dm_db_missing_index_details] AS [sdmvMID]
LEFT JOIN [sys].[dm_db_missing_index_groups] AS [sdmvMIG]
ON [sdmvMID].[index_handle] = [sdmvMIG].[index_handle]
LEFT JOIN [sys].[dm_db_missing_index_group_stats] AS [sdmvMIGS]
ON [sdmvMIG].[index_group_handle] = [sdmvMIGS].[group_handle]
INNER JOIN [sys].[objects] AS [sObj]
ON [sdmvMID].[object_id] = [sObj].[object_id]
WHERE
[sdmvMID].[database_id] = DB_ID() -- Look in the Current Database
AND [sObj].[type] IN ('U','V') -- Look in Tables & Views
AND [sObj].[is_ms_shipped] = 0x0 -- Exclude System Generated
Objects

supporting t-sql scripts for Heap vs clustered table

  • 1.
    --DBCC TRACESTATUS(-1); --GO --DBCC TRACESTATUS(2528, 3205); --GO --DBCC TRACESTATUS (3205, -1); --GO --DBCC TRACESTATUS(); --GO --DBCC TRACESTATUS(-1); --DBCC TRACEOFF(8602, 8755, 8722) --DBCC TRACEON(8602, 8755, 8722) --DBCC TRACEON(8602) --select * from Wiz_00004.dbo.LARData with (INDEX = 2) USE [General] GO -- List all heap tables SELECT SCH.name + '.' + TBL.name AS TableName FROM sys.tables AS TBL INNER JOIN sys.schemas AS SCH ON TBL.schema_id = SCH.schema_id INNER JOIN sys.indexes AS IDX ON TBL.object_id = IDX.object_id AND IDX.type = 0 -- = Heap ORDER BY TableName --drop table GenderNG --1 - Table with no indexes if OBJECT_ID('GenderNG') is NOT null drop table GenderNG select IDENTITY(int,1,1) as RowNumb,* INTO GenderNG from General.dbo.Gender print 'Getting heap table scan' select * from GenderNG where gendername='YOSHIE' GO --2- Table with non-clustered index on gendername column IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[GenderNG]') AND name = N'nc_gendername')
  • 2.
    DROP INDEX [nc_gendername]ON [dbo].[GenderNG] WITH ( ONLINE = OFF ) GO CREATE NONCLUSTERED INDEX [nc_gendername] ON [dbo].[GenderNG] ( [gendername] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO print 'Getting index seek & heap table lookup' select * from GenderNG where gendername='YOSHIE' --3- Table with clustered index on gendername column IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[GenderNG]') AND name = N'cl_gendername') DROP INDEX [cl_gendername] ON [dbo].[GenderNG] WITH ( ONLINE = OFF ) GO CREATE CLUSTERED INDEX [cl_gendername] ON [dbo].[GenderNG] ( [gendername] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO select * from GenderNG where gendername='YOSHIE' GO GO --4- Table with clustered index on rownumb and non-clustered on gendername column --dropping previous CL IDX IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[GenderNG]') AND name = N'cl_gendername') DROP INDEX [cl_gendername] ON [dbo].[GenderNG] WITH ( ONLINE = OFF ) GO IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[GenderNG]') AND name = N'cl_rownumb') DROP INDEX [cl_rownumb] ON [dbo].[GenderNG] WITH ( ONLINE = OFF ) GO CREATE CLUSTERED INDEX [cl_rownumb] ON [dbo].[GenderNG]
  • 3.
    ( [rownumb] ASC )WITH (PAD_INDEX= OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON ) ON [PRIMARY] GO select * from GenderNG where gendername='YOSHIE' --Fill Factor exec sp_spaceused 'dbo.GenderNG' IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[GenderNG]') AND name = N'nc_gendername') DROP INDEX [nc_gendername] ON [dbo].[GenderNG] WITH ( ONLINE = OFF ) GO CREATE NONCLUSTERED INDEX [nc_gendername] ON [dbo].[GenderNG] ( [gendername] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 50) ON [PRIMARY] GO print 'Approximatly twice the size of the index created earlier' exec sp_spaceused 'dbo.GenderNG' GO --This function gives you information about insert, update and delete operations that occur on a particular index SELECT OBJECT_NAME(A.[OBJECT_ID]) AS [OBJECT NAME], I.[NAME] AS [INDEX NAME], A.LEAF_INSERT_COUNT, A.LEAF_UPDATE_COUNT, A.LEAF_DELETE_COUNT FROM SYS.DM_DB_INDEX_OPERATIONAL_STATS (NULL,NULL,NULL,NULL ) A INNER JOIN SYS.INDEXES AS I ON I.[OBJECT_ID] = A.[OBJECT_ID] AND I.INDEX_ID = A.INDEX_ID WHERE OBJECTPROPERTY(A.[OBJECT_ID],'IsUserTable') = 1 GO --This view gives you information about overall access methods to your indexes. SELECT OBJECT_NAME(S.[OBJECT_ID]) AS [OBJECT NAME], I.[NAME] AS [INDEX NAME], USER_SEEKS, USER_SCANS,
  • 4.
    USER_LOOKUPS, USER_UPDATES FROM SYS.DM_DB_INDEX_USAGE_STATS ASS INNER JOIN SYS.INDEXES AS I ON I.[OBJECT_ID] = S.[OBJECT_ID] AND I.INDEX_ID = S.INDEX_ID WHERE OBJECTPROPERTY(S.[OBJECT_ID],'IsUserTable') = 1 --we are just using sys.dm_db_index_usage_stats and sys.objects to get a list of the indexes that have been used and how they are being used. SELECT DB_NAME(DATABASE_ID) AS DATABASENAME, OBJECT_NAME(B.OBJECT_ID) AS TABLENAME, INDEX_NAME = (SELECT NAME FROM SYS.INDEXES A WHERE A.OBJECT_ID = B.OBJECT_ID AND A.INDEX_ID = B.INDEX_ID), USER_SEEKS, USER_SCANS, USER_LOOKUPS, USER_UPDATES FROM SYS.DM_DB_INDEX_USAGE_STATS B INNER JOIN SYS.OBJECTS C ON B.OBJECT_ID = C.OBJECT_ID WHERE DATABASE_ID = DB_ID(DB_NAME()) AND C.TYPE <> 'S' --we are listing each user table and all of the tables indexes that have not been used by using a NOT EXISTS against sys.dm_db_index_usage_stats. SELECT DB_NAME() AS DATABASENAME, OBJECT_NAME(B.OBJECT_ID) AS TABLENAME, B.NAME AS INDEXNAME, B.INDEX_ID FROM SYS.OBJECTS A INNER JOIN SYS.INDEXES B ON A.OBJECT_ID = B.OBJECT_ID WHERE NOT EXISTS (SELECT * FROM SYS.DM_DB_INDEX_USAGE_STATS C WHERE B.OBJECT_ID = C.OBJECT_ID AND B.INDEX_ID = C.INDEX_ID) AND A.TYPE <> 'S' ORDER BY 1, 2, 3 --In this query we are listing each user table, all of its indexes and the columns that make up the index. SELECT A.NAME, B.NAME, C.KEY_ORDINAL, D.NAME
  • 5.
    FROM SYS.OBJECTS A INNERJOIN SYS.INDEXES B ON A.OBJECT_ID = B.OBJECT_ID INNER JOIN SYS.INDEX_COLUMNS C ON B.OBJECT_ID = C.OBJECT_ID AND B.INDEX_ID = C.INDEX_ID INNER JOIN SYS.COLUMNS D ON C.OBJECT_ID = D.OBJECT_ID AND C.COLUMN_ID = D.COLUMN_ID WHERE A.TYPE <> 'S' ORDER BY 1, 2, 3 --Covering Index Information SELECT SCHEMA_NAME([sObj].[schema_id]) AS [SchemaName] , [sObj].[name] AS [ObjectName] , CASE WHEN [sObj].[type] = 'U' THEN 'Table' WHEN [sObj].[type] = 'V' THEN 'View' END AS [ObjectType] , [sIdx].[index_id] AS [IndexID] -- 0: Heap; 1: Clustered Idx; > 1: Nonclustered Idx; , ISNULL([sIdx].[name], 'N/A') AS [IndexName] , CASE WHEN [sIdx].[type] = 0 THEN 'Heap' WHEN [sIdx].[type] = 1 THEN 'Clustered' WHEN [sIdx].[type] = 2 THEN 'Nonclustered' WHEN [sIdx].[type] = 3 THEN 'XML' WHEN [sIdx].[type] = 4 THEN 'Spatial' WHEN [sIdx].[type] = 5 THEN 'Reserved for future use' WHEN [sIdx].[type] = 6 THEN 'Nonclustered columnstore index' END AS [IndexType] , [sCol].[name] AS [ColumnName] , CASE WHEN [sIdxCol].[is_included_column] = 0x1 THEN 'Yes' WHEN [sIdxCol].[is_included_column] = 0x0 THEN 'No' WHEN [sIdxCol].[is_included_column] IS NULL THEN 'N/A' END AS [IsIncludedColumn] , [sIdxCol].[key_ordinal] AS [KeyOrdinal] FROM [sys].[indexes] AS [sIdx] INNER JOIN [sys].[objects] AS [sObj] ON [sIdx].[object_id] = [sObj].[object_id] LEFT JOIN [sys].[index_columns] AS [sIdxCol] ON [sIdx].[object_id] = [sIdxCol].[object_id] AND [sIdx].[index_id] = [sIdxCol].[index_id] LEFT JOIN [sys].[columns] AS [sCol] ON [sIdxCol].[object_id] = [sCol].[object_id] AND [sIdxCol].[column_id] = [sCol].[column_id] WHERE SCHEMA_NAME([sObj].[schema_id]) = 'Production'
  • 6.
    AND [sObj].[name] ='ProductReview' AND [sIdx].[name] = 'IX_ProductReview_ProductID_Name' --query the physical statistics of an index like Size, Percentage Fragmentation etc SELECT @@SERVERNAME AS [ServerName] , DB_NAME() AS [DatabaseName] , SCHEMA_NAME([sObj].[schema_id]) AS [SchemaName] , [sObj].[name] AS [ObjectName] , CASE WHEN [sObj].[type] = 'U' THEN 'Table' WHEN [sObj].[type] = 'V' THEN 'View' END AS [ObjectType] , [sIdx].[index_id] AS [IndexID] , ISNULL([sIdx].[name], 'N/A') AS [IndexName] , CASE WHEN [sIdx].[type] = 0 THEN 'Heap' WHEN [sIdx].[type] = 1 THEN 'Clustered' WHEN [sIdx].[type] = 2 THEN 'Nonclustered' WHEN [sIdx].[type] = 3 THEN 'XML' WHEN [sIdx].[type] = 4 THEN 'Spatial' WHEN [sIdx].[type] = 5 THEN 'Reserved for future use' WHEN [sIdx].[type] = 6 THEN 'Nonclustered columnstore index' END AS [IndexType] , ISNULL([sPtn].[partition_number], 1) AS [PartitionNumber] , [sdmfIPS].[alloc_unit_type_desc] AS [IndexAllocationUnitType] , [IdxSizeDetails].[IndexSizeInKB] , [sIdx].[fill_factor] AS [FillFactor] , CAST([sdmfIPS].[avg_fragmentation_in_percent] AS NUMERIC(5,2)) AS [AvgPctFrag] FROM [sys].[indexes] AS [sIdx] INNER JOIN [sys].[objects] AS [sObj] ON [sIdx].[object_id] = [sObj].[object_id] LEFT JOIN [sys].[partitions] AS [sPtn] ON [sIdx].[object_id] = [sPtn].[object_id] AND [sIdx].[index_id] = [sPtn].[index_id] LEFT JOIN ( SELECT [sIdx].[object_id] , [sIdx].[index_id] , SUM([sAU].[used_pages]) * 8 AS [IndexSizeInKB] FROM [sys].[indexes] AS [sIdx] INNER JOIN [sys].[partitions] AS [sPtn] ON [sIdx].[object_id] = [sPtn].[object_id] AND [sIdx].[index_id] = [sPtn].[index_id] INNER JOIN [sys].[allocation_units] AS [sAU] ON [sPtn].[partition_id] = [sAU].[container_id] GROUP BY [sIdx].[object_id], [sIdx].[index_id]
  • 7.
    ) [IdxSizeDetails] ON [sIdx].[object_id]= [IdxSizeDetails].[object_id] AND [sIdx].[index_id] = [IdxSizeDetails].[index_id] LEFT JOIN [sys].[dm_db_index_physical_stats] (DB_ID(),NULL,NULL,NULL,'LIMITED') [sdmfIPS] ON [sIdx].[object_id] = [sdmfIPS].[object_id] AND [sIdx].[index_id] = [sdmfIPS].[index_id] AND [sdmfIPS].[database_id] = DB_ID() WHERE [sObj].[type] IN ('U','V') -- Look in Tables & Views AND [sObj].[is_ms_shipped] = 0x0 -- Exclude System Generated Objects AND [sIdx].[is_disabled] = 0x0 -- Exclude Disabled Indexes -- understanding how effectively the existing indexes are being used. SELECT @@SERVERNAME AS [ServerName] , DB_NAME() AS [DatabaseName] , SCHEMA_NAME([sObj].[schema_id]) AS [SchemaName] , [sObj].[name] AS [ObjectName] , CASE WHEN [sObj].[type] = 'U' THEN 'Table' WHEN [sObj].[type] = 'V' THEN 'View' END AS [ObjectType] , [sIdx].[index_id] AS [IndexID] , ISNULL([sIdx].[name], 'N/A') AS [IndexName] , CASE WHEN [sIdx].[type] = 0 THEN 'Heap' WHEN [sIdx].[type] = 1 THEN 'Clustered' WHEN [sIdx].[type] = 2 THEN 'Nonclustered' WHEN [sIdx].[type] = 3 THEN 'XML' WHEN [sIdx].[type] = 4 THEN 'Spatial' WHEN [sIdx].[type] = 5 THEN 'Reserved for future use' WHEN [sIdx].[type] = 6 THEN 'Nonclustered columnstore index' END AS [IndexType] , [sdmvIUS].[user_seeks] AS [TotalUserSeeks] , [sdmvIUS].[user_scans] AS [TotalUserScans] , [sdmvIUS].[user_lookups] AS [TotalUserLookups] , [sdmvIUS].[user_updates] AS [TotalUserUpdates] , [sdmvIUS].[last_user_seek] AS [LastUserSeek] , [sdmvIUS].[last_user_scan] AS [LastUserScan] , [sdmvIUS].[last_user_lookup] AS [LastUserLookup] , [sdmvIUS].[last_user_update] AS [LastUserUpdate] , [sdmfIOPS].[leaf_insert_count] AS [LeafLevelInsertCount] , [sdmfIOPS].[leaf_update_count] AS [LeafLevelUpdateCount] , [sdmfIOPS].[leaf_delete_count] AS [LeafLevelDeleteCount] FROM [sys].[indexes] AS [sIdx] INNER JOIN [sys].[objects] AS [sObj] ON [sIdx].[object_id] = [sObj].[object_id] LEFT JOIN [sys].[dm_db_index_usage_stats] AS [sdmvIUS]
  • 8.
    ON [sIdx].[object_id] =[sdmvIUS].[object_id] AND [sIdx].[index_id] = [sdmvIUS].[index_id] AND [sdmvIUS].[database_id] = DB_ID() LEFT JOIN [sys].[dm_db_index_operational_stats] (DB_ID(),NULL,NULL,NULL) AS [sdmfIOPS] ON [sIdx].[object_id] = [sdmfIOPS].[object_id] AND [sIdx].[index_id] = [sdmfIOPS].[index_id] WHERE [sObj].[type] IN ('U','V') -- Look in Tables & Views AND [sObj].[is_ms_shipped] = 0x0 -- Exclude System Generated Objects AND [sIdx].[is_disabled] = 0x0 -- Exclude Disabled Indexes -- unused indexes. SELECT @@SERVERNAME AS [ServerName] , DB_NAME() AS [DatabaseName] , SCHEMA_NAME([sObj].[schema_id]) AS [SchemaName] , [sObj].[name] AS [ObjectName] , CASE WHEN [sObj].[type] = 'U' THEN 'Table' WHEN [sObj].[type] = 'V' THEN 'View' END AS [ObjectType] , [sIdx].[index_id] AS [IndexID] , ISNULL([sIdx].[name], 'N/A') AS [IndexName] , CASE WHEN [sIdx].[type] = 0 THEN 'Heap' WHEN [sIdx].[type] = 1 THEN 'Clustered' WHEN [sIdx].[type] = 2 THEN 'Nonclustered' WHEN [sIdx].[type] = 3 THEN 'XML' WHEN [sIdx].[type] = 4 THEN 'Spatial' WHEN [sIdx].[type] = 5 THEN 'Reserved for future use' WHEN [sIdx].[type] = 6 THEN 'Nonclustered columnstore index' END AS [IndexType] FROM [sys].[indexes] AS [sIdx] INNER JOIN [sys].[objects] AS [sObj] ON [sIdx].[object_id] = [sObj].[object_id] WHERE NOT EXISTS ( SELECT * FROM [sys].[dm_db_index_usage_stats] AS [sdmfIUS] WHERE [sIdx].[object_id] = [sdmfIUS].[object_id] AND [sIdx].[index_id] = [sdmfIUS].[index_id] AND [sdmfIUS].[database_id] = DB_ID() ) AND [sObj].[type] IN ('U','V') -- Look in Tables & Views AND [sObj].[is_ms_shipped] = 0x0 -- Exclude System Generated Objects AND [sIdx].[is_disabled] = 0x0 -- Exclude Disabled Indexes
  • 9.
    -- missing index SELECT @@SERVERNAMEAS [ServerName] , DB_NAME() AS [DatabaseName] , SCHEMA_NAME([sObj].[schema_id]) AS [SchemaName] , [sObj].[name] AS [ObjectName] , CASE [sObj].[type] WHEN 'U' THEN 'Table' WHEN 'V' THEN 'View' ELSE 'Unknown' END AS [ObjectType] , [sdmvMID].[equality_columns] AS [EqualityColumns] , [sdmvMID].[inequality_columns] AS [InequalityColumns] , [sdmvMID].[included_columns] AS [IncludedColumns] , [sdmvMIGS].[user_seeks] AS [ExpectedIndexSeeksByUserQueries] , [sdmvMIGS].[user_scans] AS [ExpectedIndexScansByUserQueries] , [sdmvMIGS].[last_user_seek] AS [ExpectedLastIndexSeekByUserQueries] , [sdmvMIGS].[last_user_scan] AS [ExpectedLastIndexScanByUserQueries] , [sdmvMIGS].[avg_total_user_cost] AS [ExpectedAvgUserQueriesCostReduction] , [sdmvMIGS].[avg_user_impact] AS [ExpectedAvgUserQueriesBenefitPct] FROM [sys].[dm_db_missing_index_details] AS [sdmvMID] LEFT JOIN [sys].[dm_db_missing_index_groups] AS [sdmvMIG] ON [sdmvMID].[index_handle] = [sdmvMIG].[index_handle] LEFT JOIN [sys].[dm_db_missing_index_group_stats] AS [sdmvMIGS] ON [sdmvMIG].[index_group_handle] = [sdmvMIGS].[group_handle] INNER JOIN [sys].[objects] AS [sObj] ON [sdmvMID].[object_id] = [sObj].[object_id] WHERE [sdmvMID].[database_id] = DB_ID() -- Look in the Current Database AND [sObj].[type] IN ('U','V') -- Look in Tables & Views AND [sObj].[is_ms_shipped] = 0x0 -- Exclude System Generated Objects