J'ai besoin d'une requête pour voir si une table contient déjà des index.
Sur SQL Server, cela listera tous les index pour une table spécifiée:
select * from sys.indexes
where object_id = (select object_id from sys.objects where name = 'MYTABLE')
Cette requête listera toutes les tables sans index:
SELECT name
FROM sys.tables
WHERE OBJECTPROPERTY(object_id,'IsIndexed') = 0
Et ceci est un MSDN intéressant FAQ sur un sujet connexe:
interrogation de la FAQ de SQL Server System Catalog
Si vous utilisez MySQL, vous pouvez exécuter SHOW KEYS FROM table
ou SHOW INDEXES FROM table
Si vous avez seulement besoin des colonnes indexées, EXEC sp_helpindex 'TABLE_NAME'
La plupart des SGBDR modernes prennent en charge le schéma INFORMATION_SCHEMA
. Si le vôtre supporte cela, alors vous voulez soit INFORMATION_SCHEMA.TABLE_CONSTRAINTS
Ou INFORMATION_SCHEMA.KEY_COLUMN_USAGE
, Ou peut-être les deux.
Pour voir si le vôtre prend en charge, c'est aussi simple que d'exécuter
select count(*) from INFORMATION_SCHEMA.TABLE_CONSTRAINTS
EDIT: SQL Server a INFORMATION_SCHEMA
, Et il est plus facile à utiliser que leurs tables spécifiques au fournisseur, alors allez-y.
Sur Oracle:
Déterminez tous les index de la table:
SELECT index_name
FROM user_indexes
WHERE table_name = :table
Déterminez les index des colonnes et les colonnes sur l'index:
SELECT index_name
, column_position
, column_name
FROM user_ind_columns
WHERE table_name = :table
ORDER BY index_name, column_order
Les références:
Voici ce que j'ai utilisé pour TSQL qui a résolu le problème selon lequel mon nom de table pourrait contenir le nom du schéma et éventuellement le nom de la base de données:
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;
Le cas d'utilisation de ceci est que je voulais la liste des index pour une table nommée afin de pouvoir écrire une procédure compressant dynamiquement tous les index d'une table.
D'abord, vous vérifiez votre identifiant de table (aka object_id)
SELECT * FROM sys.objects WHERE type = 'U' ORDER BY name
alors vous pouvez obtenir les noms de la colonne. Par exemple, en supposant que vous ayez obtenu à partir de la requête précédente le numéro 4 sous la forme 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
Création d'une procédure stockée pour répertorier les index d'une table dans une base de données dans 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