テーブルに既にインデックスがあるかどうかを確認するクエリが必要です。
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のクエリ
MySQLを使用している場合は、SHOW KEYS FROM table
またはSHOW INDEXES FROM table
を実行できます
インデックス付きの列EXEC sp_helpindex 'TABLE_NAME'のみが必要な場合
最新のRDBMSは、_INFORMATION_SCHEMA
_スキーマをサポートしています。あなたのものがそれをサポートしているなら、あなたは_INFORMATION_SCHEMA.TABLE_CONSTRAINTS
_または_INFORMATION_SCHEMA.KEY_COLUMN_USAGE
_のいずれか、あるいはその両方が必要です。
あなたのものがサポートしているかどうかを確認するには、実行するのと同じくらい簡単です
select count(*) from INFORMATION_SCHEMA.TABLE_CONSTRAINTS
編集:SQL Serverには_INFORMATION_SCHEMA
_があり、ベンダー固有のテーブルよりも使いやすいので、そのまま使用します。
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
参照:
ここに、テーブル名にスキーマ名とデータベース名が含まれる可能性があるという問題を処理した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;
この使用例は、名前付きテーブルのインデックスのリストが必要だったため、テーブルのすべてのインデックスを動的に圧縮するプロシージャを作成できることです。
まず、テーブル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
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