web-dev-qa-db-fra.com

Requête pour vérifier l'index sur une table

J'ai besoin d'une requête pour voir si une table contient déjà des index.

35
sine

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

73
gkrogers

Si vous utilisez MySQL, vous pouvez exécuter SHOW KEYS FROM table ou SHOW INDEXES FROM table

17
nickf

Si vous avez seulement besoin des colonnes indexées, EXEC sp_helpindex 'TABLE_NAME'

9
Salim

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.

7
Donnie

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:

3
FerranB

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.

2
Michael Potter

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

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