如何在SQL 2008数据库中列出没有索引的表?
修改
我想要Schema名称和表名。
答案 0 :(得分:9)
这应该涵盖您所寻找的内容。即堆是堆(没有聚簇索引)并且没有任何非聚簇索引。它使用新的sys。 2005/2008年使用的表格对象。
此外,您可能希望查找具有聚簇索引但没有非聚簇索引的表(这是我已经注释掉的语句的第二部分。
SELECT
schemaname = OBJECT_SCHEMA_NAME(o.object_id)
,tablename = o.NAME
FROM sys.objects o
INNER JOIN sys.indexes i ON i.OBJECT_ID = o.OBJECT_ID
-- tables that are heaps without any nonclustered indexes
WHERE (
o.type = 'U'
AND o.OBJECT_ID NOT IN (
SELECT OBJECT_ID
FROM sys.indexes
WHERE index_id > 0
)
)
-- OR
-- table that have a clustered index without any nonclustered indexes
--(o.type='U'
-- AND o.OBJECT_ID NOT IN (
-- SELECT OBJECT_ID
-- FROM sys.indexes
-- WHERE index_id>1))
答案 1 :(得分:6)
以下是一个例子:
select SCHEMA_NAME(schema_id), name from sys.tables
where OBJECTPROPERTY(object_id, 'IsIndexed')= 0
答案 2 :(得分:4)
select shema = s.name, table_name = o.name
from sys.objects o
join sys.schemas s on o.schema_id = s.schema_id
where type = 'U'
and not exists (select i.index_id
from sys.indexes i
where i.type <> 0 --ignore default heap index row
and o.object_id = i.object_id )
编辑:
我已更新SQL以包含所请求的Schema名称。 (注意我必须 sys.objects 而不是 sysobjects 来满足SQL 2005中引入的模式)
目录表记录在SQL Server文档中,请参阅this link.
This FAQ包含更多样本,也可能有用。
请注意,这些是系统表,可以在SQL Server版本之间进行更改,在可能的情况下使用名为Information Schema Views的系统表独立视图。
答案 3 :(得分:4)
除了@Philip Fourie的建议,您可能还想考虑要创建哪些索引。
一旦访问了数据,SQL Server 2008就会跟踪它认为索引有用的地方(它将这些地方称为“缺失的索引”。有一堆新的动态管理视图可以显示这些缺少索引和一些关于它们的信息。
来自MSSQlTips:
- sys.dm_db_missing_index_details - 返回有关缺失索引的详细信息
- sys.dm_db_missing_index_group_stats - 返回有关缺失索引组的摘要信息
- sys.dm_db_missing_index_groups - 返回有关特定缺失索引组的信息
- sys.dm_db_missing_index_columns(index_handle) - 返回有关索引缺少的数据库表列的信息。这是一个函数,需要传递index_handle。
答案 4 :(得分:0)
此代码提供了所有表的索引的所有详细信息:
SELECT
sch.name AS [Schema],
obj.name AS TableName,
indx.name AS IndexName,
CASE
WHEN indx.type_desc = 'HEAP' THEN 'N/A'
ELSE indx.type_desc
END AS IndexType
FROM sys.objects obj
JOIN sys.indexes indx ON indx.object_id = obj.object_id
JOIN sys.schemas AS sch ON sch.schema_id = obj.schema_id
WHERE
obj.type = 'U'
ORDER BY
obj.name