una - mantenimiento de tablas sql server
Consulta para verificar el índice en una tabla (9)
Necesito una consulta para ver si una tabla ya tiene índices.
Creó un procedimiento almacenado para mostrar los índices de una tabla en 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
En Oracle:
Determine todos los índices en la tabla:
SELECT index_name FROM user_indexes WHERE table_name = :table
Determine columnas, índices y columnas en el índice:
SELECT index_name , column_position , column_name FROM user_ind_columns WHERE table_name = :table ORDER BY index_name, column_order
Referencias
En SQL Server, esto mostrará una lista de todos los índices para una tabla especificada:
select * from sys.indexes
where object_id = (select object_id from sys.objects where name = ''MYTABLE'')
Esta consulta mostrará una lista de todas las tablas sin un índice:
SELECT name
FROM sys.tables
WHERE OBJECTPROPERTY(object_id,''IsIndexed'') = 0
Y esta es una pregunta frecuente de MSDN sobre un tema relacionado:
Consultar las preguntas frecuentes del catálogo del sistema de SQL Server
Esto es lo que utilicé para TSQL que se encargó del problema de que el nombre de mi tabla podría contener el nombre del esquema y posiblemente el nombre de la 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.
La mayoría de los RDBMS modernos son compatibles con el esquema INFORMATION_SCHEMA
. Si la tuya lo admite, entonces quieres INFORMATION_SCHEMA.TABLE_CONSTRAINTS
o INFORMATION_SCHEMA.KEY_COLUMN_USAGE
, o quizás ambas.
Para ver si los tuyos lo admiten es tan simple como correr
select count(*) from INFORMATION_SCHEMA.TABLE_CONSTRAINTS
EDITAR: SQL Server tiene INFORMATION_SCHEMA
, y es más fácil de usar que sus tablas específicas del proveedor, así que simplemente vaya con él.
Primero, verifica tu ID de tabla (también conocido como object_id)
SELECT * FROM sys.objects WHERE type = ''U'' ORDER BY name
entonces puedes obtener los nombres de la columna. Por ejemplo, suponiendo que haya obtenido de la consulta previa 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
Si está utilizando MySQL, puede ejecutar SHOW KEYS FROM table
o SHOW INDEXES FROM table
Si solo necesita las columnas indexadas EXEC sp_helpindex ''TABLE_NAME''
compruebe esto también. Ofrece una descripción general de las restricciones asociadas en una base de datos. Incluya también la facilitación donde la condición con el nombre de la tabla de interés brinda información más rápido.
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