2009-11-25 4 views
26

Ho bisogno di una query per vedere se una tabella ha già degli indici su di essa.Query per verificare l'indice su una tabella

+0

di PostgreSQL, è solo \ d + tavolo, in MySQL è disc

. Nel server SQL, è contorto come l'inferno perché Microsoft vuole rendere la vita difficile per tutti noi !! –

risposta

9

Se stai usando MySQL è possibile eseguire SHOW KEYS FROM table o SHOW INDEXES FROM table

+0

così dispiaciuto per non aver detto l'ambiente. SQL Server 2008 – sine

1

su Oracle:

  • Determinare tutti gli indici sulla tabella:

    SELECT index_name 
    FROM user_indexes 
    WHERE table_name = :table 
    
  • Determinare colonne indici e le colonne su indice:

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

Riferimenti:

6

maggior supporto RDBMS moderna la INFORMATION_SCHEMA schema. Se il tuo supporta questo, allora vuoi sia INFORMATION_SCHEMA.TABLE_CONSTRAINTS o INFORMATION_SCHEMA.KEY_COLUMN_USAGE, o forse entrambi.

Per vedere se il vostro supporti è facile come eseguire

select count(*) from INFORMATION_SCHEMA.TABLE_CONSTRAINTS

EDIT: SQL Server ha INFORMATION_SCHEMA, ed è più facile da usare rispetto ai loro tavoli specifici del produttore, quindi basta andare con esso.

+3

Come suggerisce il nome, la vista standard ANSI, 'INFORMATION_SCHEMA.TABLE_CONSTRAINTS' mostra solo i vincoli. Mentre alcuni vincoli sono indici, non tutti gli indici sono vincoli. Questa vista non mostra indici regolari: visualizza solo 'CONSTRAINT_TYPE' di' UNIQUE', 'PRIMARY KEY',' FOREIGN KEY' o 'CHECK'. Vedi [la relativa sezione da "SQL-99 Completa, Really"] (https://mariadb.com/kb/en/sql-99-complet-really/16-sql-catalogs/the-information-schema/ information_schema-views/information_schematable_constraints /) –

62

su SQL Server, questo elencherà tutti gli indici per una tabella specificata:

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

Questa query elencherà tutte le tabelle senza un indice:

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

E questo è un interessante MSDN FAQ su un argomento correlato:
Querying the SQL Server System Catalog FAQ

+1

Come faccio a vedere su quali colonne sono stati collocati questi indici? –

+0

Dovrebbe essere notato che la query superiore fallirà se la tabella ha più di un indice, Sostituisci 'object_id = (select' con' object_id IN (select' se hai bisogno di vedere le informazioni sugli indici, o vuoi solo completare la query senza errori. – Tor

3

Se sono necessarie solo le colonne indicizzate E XEC sp_helpindex 'TABLE_NAME'

2

Ecco quello che ho usato per il TSQL che ha curato il problema che il mio nome tabella potrebbe contenere il nome dello schema e, eventualmente, il nome del database:

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; 

Il caso d'uso per questo è che volevo l'elenco di indici per una tabella denominata in modo da poter scrivere una procedura che comprimesse in modo dinamico tutti gli indici su una tabella.

1

Prima di controllare il proprio ID tavolo (aka object_id)

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

quindi è possibile ottenere i nomi della colonna.Per esempio supponendo che si è ottenuto dalla query precedente il numero 4 come 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

controllo anche questo Questo dà una visione d'insieme di vincoli associati attraverso un database. Si prega di includere anche la facilitazione delle condizioni in cui il nome della tabella di interesse fornisce le informazioni più velocemente.

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

creato una stored procedure per elencare gli indici per una tabella nel database in 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