2009-11-25 11 views
26

Necesito una consulta para ver si una tabla ya tiene índices.Consulta para verificar el índice en una tabla

+0

en Postgres, es sólo \ d + mesa, en MySQL es la descripción

. En el servidor SQL, es complicado porque ¡Microsoft quiere hacer la vida más difícil para todos nosotros! –

Respuesta

9

Si estás usando MySQL puede ejecutar SHOW KEYS FROM table o SHOW INDEXES FROM table

+0

lo siento por no contarle al medio ambiente. Su SQL Server 2008 – sine

1

En Oracle:

  • Determine todos los índices de la tabla:

    SELECT index_name 
    FROM user_indexes 
    WHERE table_name = :table 
    
  • determina las columnas y columnas de índices Indice:

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

Referencias:

6

La mayoría de apoyo RDBMS moderna del INFORMATION_SCHEMA esquema. Si el tuyo lo admite, entonces quieres INFORMATION_SCHEMA.TABLE_CONSTRAINTS o INFORMATION_SCHEMA.KEY_COLUMN_USAGE, o tal vez ambos.

Para ver si el suyo lo apoya es tan simple como ejecutar

select count(*) from INFORMATION_SCHEMA.TABLE_CONSTRAINTS

EDIT: SQL Server no tienen INFORMATION_SCHEMA, y es más fácil de usar que sus tablas específicas del proveedor, por lo que sólo tiene que ir con él.

+3

Como su nombre indica, la vista estándar de ANSI, 'INFORMATION_SCHEMA.TABLE_CONSTRAINTS' solo muestra restricciones. Mientras que algunas restricciones son índices, no todos los índices son restricciones. Esta vista no mostrará índices regulares: solo muestra 'CONSTRAINT_TYPE's' UNIQUE', 'PRIMARY KEY',' FOREIGN KEY' o 'CHECK'. Consulte [la sección correspondiente de "SQL-99 Complete, Really"] (https://mariadb.com/kb/en/sql-99-complete-really/16-sql-catalogs/the-information-schema/ information_schema-views/information_schematable_constraints /) –

62

En SQL Server, aparecerá una lista de todos los índices de una tabla especificada:

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

Esta consulta una lista de todas las tablas que tienen un índice:

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

Y esta es una interesante FAQ MSDN sobre un tema relacionado:
Querying the SQL Server System Catalog FAQ

+1

¿Cómo veo en qué columnas se han colocado estos índices? –

+0

Debe tenerse en cuenta que la consulta principal fallará si la tabla tiene más de un índice, Reemplace 'object_id = (select' con' object_id IN (seleccione' si necesita ver la información sobre los índices, o simplemente desea que la consulta se complete sin error. – Tor

3

Si sólo necesita las columnas indexadas E XEC sp_helpindex 'TABLE_NAME'

2

Esto es lo que he usado para TSQL, que se hizo cargo del problema de que mi nombre de la tabla podría contener el nombre de esquema y, posiblemente, el nombre de base de datos:

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; 

El caso de uso para esto es que quería la lista de índices para una tabla con nombre para poder escribir un procedimiento que comprimiera dinámicamente todos los índices en una tabla.

1

En primer lugar, comprobar su identificador de tabla (también conocido como object_id)

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

entonces se puede obtener los nombres de la columna.Por ejemplo suponiendo que obtuvo de consulta anterior el número 4 como 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

cheque esto también Esto da una visión general de las limitaciones asociadas a través de una base de datos. Incluya también la facilitación donde la condición con el nombre de la tabla de interés proporciona información más rápidamente.

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

1

crea un procedimiento almacenado para enumerar los índices de una tabla de la base de datos en 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 
Cuestiones relacionadas