web-dev-qa-db-ja.com

テーブルのインデックスをチェックするクエリ

テーブルに既にインデックスがあるかどうかを確認するクエリが必要です。

35
sine

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 FAQ関連する主題について:
SQL ServerシステムカタログのFAQのクエリ

73
gkrogers

MySQLを使用している場合は、SHOW KEYS FROM tableまたはSHOW INDEXES FROM tableを実行できます

17
nickf

インデックス付きの列EXEC sp_helpindex 'TABLE_NAME'のみが必要な場合

9
Salim

最新のRDBMSは、_INFORMATION_SCHEMA_スキーマをサポートしています。あなたのものがそれをサポートしているなら、あなたは_INFORMATION_SCHEMA.TABLE_CONSTRAINTS_または_INFORMATION_SCHEMA.KEY_COLUMN_USAGE_のいずれか、あるいはその両方が必要です。

あなたのものがサポートしているかどうかを確認するには、実行するのと同じくらい簡単です

select count(*) from INFORMATION_SCHEMA.TABLE_CONSTRAINTS

編集:SQL Serverには_INFORMATION_SCHEMA_があり、ベンダー固有のテーブルよりも使いやすいので、そのまま使用します。

7
Donnie

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
    

参照:

3
FerranB

ここに、テーブル名にスキーマ名とデータベース名が含まれる可能性があるという問題を処理した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;

この使用例は、名前付きテーブルのインデックスのリストが必要だったため、テーブルのすべてのインデックスを動的に圧縮するプロシージャを作成できることです。

2
Michael Potter

まず、テーブルID(別名object_id)を確認します

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

その後、列の名前を取得できます。たとえば、前のクエリからobject_idとして番号4を取得したと仮定します

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
1
Weapon X

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
1
Tejasvi Hegde