查询检查表上的索引

时间:2009-11-25 23:37:47

标签: sql sql-server-2008 indexing

我需要一个查询来查看表中是否已有任何索引。

10 个答案:

答案 0 :(得分:69)

在SQL Server上,这将列出指定表的所有索引:

select * from sys.indexes
where object_id = (select object_id from sys.objects where name = 'MYTABLE')

此查询将列出所有没有索引的表:

SELECT name
FROM sys.tables 
WHERE OBJECTPROPERTY(object_id,'IsIndexed') = 0

这是一个有趣的MSDN常见问题解答,涉及相关主题:
Querying the SQL Server System Catalog FAQ

答案 1 :(得分:16)

如果您使用的是MySQL,则可以运行SHOW KEYS FROM tableSHOW INDEXES FROM table

答案 2 :(得分:9)

如果您只需要索引列 EXEC sp_helpindex“TABLE_NAME”

答案 3 :(得分:7)

大多数现代RDBMS都支持INFORMATION_SCHEMA架构。如果您支持,那么您需要INFORMATION_SCHEMA.TABLE_CONSTRAINTSINFORMATION_SCHEMA.KEY_COLUMN_USAGE,或者两者都支持。

看看你的支持是否就像运行

一样简单

select count(*) from INFORMATION_SCHEMA.TABLE_CONSTRAINTS

编辑:SQL Server确实有INFORMATION_SCHEMA,它比特定于供应商的表更容易使用,所以请继续使用它。

答案 4 :(得分:3)

在Oracle上:

  • 确定表格中的所有索引:

    SELECT index_name 
     FROM user_indexes
     WHERE table_name = :table
    
  • 确定索引上的列索引和列:

    SELECT index_name
         , column_position
         , column_name
      FROM user_ind_columns
     WHERE table_name = :table
     ORDER BY index_name, column_order
    

参考文献:

答案 5 :(得分:3)

只需使用以下命令即可找到特定表的索引名和列名

SP_HELPINDEX 'tablename'

这对我有用

答案 6 :(得分:2)

以下是我用于TSQL的问题,它解决了我的表名可能包含模式名称以及可能包含数据库名称的问题:

DECLARE @THETABLE varchar(100);
SET @THETABLE = 'theschema.thetable';
select i.*
  from sys.indexes i
 where i.object_id = OBJECT_ID(@THETABLE)
   and i.name is not NULL;

这个用例就是我想要一个命名表的索引列表,这样我就可以编写一个程序来动态压缩表上的所有索引。

答案 7 :(得分:1)

首先检查你的表id(又名object_id)

SELECT * FROM sys.objects WHERE type = 'U' ORDER BY name

然后你就可以得到专栏的名字了。例如,假设您从先前的查询获得了数字4作为object_id

SELECT c.name
FROM sys.index_columns ic
INNER JOIN sys.columns c ON  c.column_id = ic.column_id
WHERE ic.object_id = 4 
AND c.object_id = 4

答案 8 :(得分:1)

创建一个存储过程来列出SQL Server中数据库中表的索引

create procedure _ListIndexes(@tableName nvarchar(200))
as
begin
/*
exec _ListIndexes '<YOUR TABLE NAME>'
*/
SELECT DB_NAME(DB_ID()) as DBName,SCH.name + '.' + TBL.name AS TableName,IDX.name as IndexName, IDX.type_desc AS IndexType,COL.Name as ColumnName,IC.*
    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 
         INNER JOIN sys.index_columns IC ON  IDX.object_id = IC.object_id and IDX.index_id = IC.index_id 
         INNER JOIN sys.columns COL ON ic.object_id = COL.object_id and IC.column_id = COL.column_id 
        where TBL.name = @tableName
    ORDER BY TableName,IDX.name

end

答案 9 :(得分:-1)

检查一下 这概述了数据库中的相关约束。 还请包括促进具有感兴趣的表名称的条件,以便更快地提供信息。

select a.TABLE_CATALOG as DB_name,a.TABLE_SCHEMA as tbl_schema, a.TABLE_NAME as tbl_name,a. CONSTRAINT_NAME as constraint_name,b.CONSTRAINT_TYPE from INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE a join INFORMATION_SCHEMA.TABLE_CONSTRAINTS b on a.CONSTRAINT_NAME=b.CONSTRAINT_NAME