2009-09-02 10 views

Répondre

7

Cela devrait couvrir ce que vous cherchez. c'est-à-dire des tables qui sont des tas (pas d'index clusterisé) et qui n'ont pas d'index non groupés. Il utilise le nouveau système. objets de table utilisés en 2005/2008.

en plus, vous voulez probablement rechercher des tables qui ont un index ordonné en clusters, mais ont aucun index non cluster (ce qui est la 2ème partie de la déclaration que j'ai laissé en commentaire.

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:
Je l'ai mis à jour le SQL pour inclure le nom de schéma tel que demandé. (Note que je devais sys.objects au lieu de sysobjects pour répondre à des schémas qui ont été introduits dans SQL 2005)

Les tableaux catalogue sont documentés dans la documentation SQL Server, consultez this link.
This FAQ contient plus d'échantillons et pourrait aussi être utile.

Notez qu'il s'agit de tables système et que vous pouvez passer d'une version de serveur SQL à une autre, si possible, utilisez les vues indépendantes de la table système appelées Information Schema Views.

+0

comment puis-je obtenir le schéma de ces objets –

+0

ils sont toujours valables dans 2005/2008 en vue de « compatibilité ».J'ai posté ma propre version qui utilise les objets système 2005/2008 –

+0

@Raj Plus, j'ai mis à jour ma réponse avec le nom du schéma comme demandé –

4

En plus de la suggestion de @Philip Fourie, vous pouvez penser aux index à créer. Une fois que vous avez accédé à vos données, SQL Server 2008 conserve une trace des endroits où il pense que les index seront utiles (il les appelle des "index manquants". Il y a une main pleine de nouvelles vues gérées dynamiques qui peuvent montrer ces index manquants et quelques informations sur les

de MSSQlTips.

  • sys.dm_db_missing_index_details - Retourne des informations détaillées sur un index manquant
  • sys.dm_db_missing_index_group_s Tats - Retourne des informations sommaires sur l'absence de groupes d'index
  • sys.dm_db_missing_index_groups - Retourne des informations sur un groupe spécifique d'index manquants
  • sys.dm_db_missing_index_columns (index_handle) - Retourne des informations sur les colonnes de la table de base de données qui manquent pour un index. C'est une fonction qui nécessite que l'index_handle soit passé.
5

Voici un exemple:

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