Rac*_*SQL 6 index sql-server sql-server-2008-r2
使用sp_helpindex My_table
我有这个列表:
但我的表只有这些索引:
为什么会这样?我正在使用查询在特定表中搜索“相等索引”。这个查询返回了很多我什至没有在表中的索引。
WITH IndexColumns AS (
SELECT '[' + s.Name + '].[' + T.Name + ']' AS TableName,
i.name AS IndexName, C.name AS ColumnName, i.index_id,ic.index_column_id,
COUNT(*) OVER(PARTITION BY t.OBJECT_ID, i.index_id) AS ColCount
FROM sys.schemas AS s
JOIN sys.tables AS t ON t.schema_id = s.schema_id
JOIN sys.indexes AS i ON I.OBJECT_ID = T.OBJECT_ID
JOIN sys.index_columns AS IC ON IC.OBJECT_ID = I.OBJECT_ID
AND IC.index_id = I.index_id
JOIN sys.columns AS C ON C.OBJECT_ID = IC.OBJECT_ID
AND C.column_id = IC.column_id
WHERE IC.is_included_column = 0
)
SELECT DISTINCT a.TableName, a.IndexName AS Index1, b.IndexName AS Index2
FROM IndexColumns AS a
JOIN IndexColumns AS b ON b.TableName = a.TableName
AND b.IndexName <> a.IndexName
AND b.index_column_id = a.index_column_id
AND b.ColumnName = a.ColumnName
AND a.index_column_id < 3
AND a.index_id < b.index_id
AND a.ColCount <= B.ColCount
ORDER BY a.TableName, a.IndexName;
Run Code Online (Sandbox Code Playgroud)
这些索引从何而来?
Tom*_*m V 13
您看到的索引是hypothetical indexes
由数据库引擎优化顾问创建的。
DTA
如果它崩溃或者你因为它运行时间太长而杀死它,则会留下一些混乱。
它们都包含_dta_
在名称中,您可以hypothetical
在描述中看到。
试试Brent的查询,因为您很可能在其他表上也有一些这样的查询。
WITH hi AS (
SELECT QUOTENAME(SCHEMA_NAME(o.[schema_id])) +'.'+ QUOTENAME(OBJECT_NAME(i.[object_id])) AS [Table] , QUOTENAME([i].[name]) AS [Index_or_Statistics], 1 AS [Type]
FROM sys.[indexes] AS [i]
JOIN sys.[objects] AS [o]
ON i.[object_id] = o.[object_id]
WHERE 1=1
AND INDEXPROPERTY(i.[object_id], i.[index_id], 'IsHypothetical') = 1
AND OBJECTPROPERTY([o].[object_id], 'IsUserTable') = 1
UNION ALL
SELECT QUOTENAME(SCHEMA_NAME(o.[schema_id])) +'.'+ QUOTENAME(OBJECT_NAME(o.[object_id])) AS [Table], QUOTENAME([s].[name]) AS [Index_or_Statistics], 2 AS [Type]
FROM sys.[stats] AS [s]
JOIN sys.[objects] AS [o]
ON [o].[object_id] = [s].[object_id]
WHERE [s].[user_created] = 0
AND [o].[name] LIKE '[_]dta[_]%'
AND OBJECTPROPERTY([o].[object_id], 'IsUserTable') = 1
)
SELECT [hi].[Table] ,
[hi].[Index_or_Statistics] ,
CASE [hi].[Type]
WHEN 1 THEN 'DROP INDEX ' + [hi].[Index_or_Statistics] + ' ON ' + [hi].[Table] + ';'
WHEN 2 THEN 'DROP STATISTICS ' + hi.[Table] + '.' + hi.[Index_or_Statistics] + ';'
ELSE 'DEAR GOD WHAT HAVE YOU DONE?'
END AS [T-SQL Drop Command]
FROM [hi]
Run Code Online (Sandbox Code Playgroud)
你应该删除它们,它们无论如何都不会被使用
编辑: 不知道为什么,但 OP 对布伦特的查询有问题,这个选择适用于他的环境
SELECT t2.NAME AS table_name
,t1.NAME AS index_name
FROM sys.indexes t1
INNER JOIN sys.tables t2 ON t2.object_id = t1.object_id
WHERE t2.NAME = 'MyTable'
AND t1.NAME LIKE '%_dta_%'
AND t1.is_hypothetical = 1
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
892 次 |
最近记录: |