2009-09-02 3 views

risposta

7

Questo dovrebbe coprire ciò che stai cercando. Ad esempio tabelle che sono heap (nessun indice cluster) e non hanno indici non cluster. Usa il nuovo sys. oggetti da tavolo usati nel 2005/2008.

in aggiunta, probabilmente si consiglia di cercare le tabelle che hanno un indice cluster, ma non hanno gli indici non cluster (questa è la seconda parte della dichiarazione, che ho lasciato commentata.

SELECT 
    schemaname = OBJECT_SCHEMA_NAME(o.object_id) 
    ,tablename = o.NAME 
FROM sys.objects o 
INNER JOIN sys.indexes i ON i.OBJECT_ID = o.OBJECT_ID 
-- tables that are heaps without any nonclustered indexes 
WHERE (
     o.type = 'U' 
     AND o.OBJECT_ID NOT IN (
      SELECT OBJECT_ID 
      FROM sys.indexes 
      WHERE index_id > 0 
      ) 
     ) 
     -- OR 
     -- table that have a clustered index without any nonclustered indexes 
     --(o.type='U' 
     --  AND o.OBJECT_ID NOT IN (
     -- SELECT OBJECT_ID 
     --  FROM sys.indexes 
     --  WHERE index_id>1)) 
4
select shema = s.name, table_name = o.name 
from sys.objects o 
join sys.schemas s on o.schema_id = s.schema_id 
where type = 'U' 
and not exists (select i.index_id 
       from sys.indexes i 
       where i.type <> 0 --ignore default heap index row 
       and o.object_id = i.object_id) 

Edit:
Ho aggiornato il codice SQL per includere il nome dello schema come richiesto. (Nota ho dovuto sys.objects invece di sysobjects per soddisfare gli schemi che sono state introdotte in SQL 2005)

Il catalogo tavoli sono documentati nella documentazione di SQL Server, vedere this link.
This FAQ contiene più campioni e potrebbe anche essere utile.

Si noti che queste sono tabelle di sistema e possono cambiare tra le versioni del server SQL, laddove possibile utilizzare piuttosto le viste indipendenti dalla tabella di sistema denominate Information Schema Views.

+0

come ottengo lo schema per questi oggetti? –

+0

sono ancora validi nel 2005/2008 come viste di 'compatibilità'.Ho pubblicato la mia versione che utilizza gli oggetti di sistema 2005/2008 –

+0

@Raj Altro, ho aggiornato la mia risposta con il nome dello schema come richiesto –

4

Oltre al suggerimento di @Philip Fourie, è possibile pensare a quali indici creare.

Dopo aver eseguito l'accesso ai dati, SQL Server 2008 tiene traccia dei luoghi in cui ritiene che gli indici siano utili (si riferisce a questi come "indici mancanti". C'è una mano piena di nuove viste gestite dinamiche che possono mostrare questi indici mancanti e alcune informazioni su di loro

Da MSSQlTips:.

  • sys.dm_db_missing_index_details - Restituisce informazioni dettagliate su un indice mancante
  • sys.dm_db_missing_index_group_s tatuaggi - restituisce le informazioni di riepilogo di perdere gruppi di indice
  • sys.dm_db_missing_index_groups - Restituisce informazioni su uno specifico gruppo di indici mancanti
  • sys.dm_db_missing_index_columns (index_handle) - restituisce le informazioni sulle colonne della tabella del database che mancano per un indice. Questa è una funzione e richiede l'index_handle da passare.
5

Ecco un esempio:

select SCHEMA_NAME(schema_id), name from sys.tables 
where OBJECTPROPERTY(object_id, 'IsIndexed')= 0