2010-10-29 7 views
0

Sur mon MS SQL Server 2008, je l'ai créé une table temporaire comme ceci:demande très lent sur la table temporaire

create table #test 
(
A varchar(50), 
B int, 
) 

insert into #test select 'a',45 
insert into #test select 'b',587 
insert into #test select 'a',4 
insert into #test select 'b',58 

Maintenant, la requête suivante pour toujours prendre

select A,SUM(B) from #test group by A -- takes 4 seconds to execute 

alors que les demandes suivantes sont instantanés

select * from #test order by A 
select SUM(B) from #test 

Toutes les autres demandes (y compris les demandes énormes) qui n'utilisent pas les tables temporaires sont ru Bien que chaque demande utilisant une table temporaire semble rencontrer le même problème de performance. Ces demandes ont toutes couru habituellement vite hier, et je ne peux pas penser à quelque chose d'inhabituel qui aurait pu se produire depuis.

J'ai vérifié que mon tempdb n'a pas été complète à l'aide spaceused (70Mo libre de 85 MB)

J'ai aussi récupéré le plan d'exécution:

alt text

Quelle est la cause cette très mauvaise performance? Y a-t-il quelque chose que je devrais faire pour résoudre le problème?

Répondre

2

Le genre intermédiaire est cher +, vous pouvez voir un point d'exclamation dans le plan de requête, manquant probablement stats

Si vous ajoutez un index (ou clé primaire), il fonctionnera plus vite, car les données seront « pré-triés "et vous aurez des statistiques à ce sujet

4

Votre meilleur pari est probablement d'ajouter un index sur A ou de définir A comme la clé primaire de la table.

+2

Si vous définissez A comme clé primaire, il créera automatiquement un index cluster sur la table. C'est probablement votre meilleur pari. Il ne supprimera pas seulement le tri, mais il remplacera votre scan de table par un scan en cluster (et améliorera considérablement les performances). –