2010-04-15 3 views
6

J'ai une procédure stockée dans laquelle je crée une table temporaire qui contient généralement entre 1 et 10 lignes. Cette table est tronquée et remplie plusieurs fois au cours de la procédure stockée. Il est tronqué car il est plus rapide que la suppression. Est-ce que j'obtiens une augmentation de performance en remplaçant cette table temporaire par une variable de table quand je subis une pénalité pour utiliser delete (truncate ne fonctionne pas sur les variables de table)SQL Server, tables temporaires avec truncate ou variable de table avec suppression

Alors que les variables de table sont principalement en mémoire et sont généralement plus rapides que la température Est-ce que je perds tout avantage en supprimant plutôt que en tronquant les tableaux?

+5

Pourquoi ne pas le tester? – spender

Répondre

11

Exécution de l'followign aux scripts, il semblerait que la Table variable est la meilleure option

CREATE TABLE #Temp(
     ID INT 
) 

DECLARE @Int INT, 
     @InnerInt INT 
SELECT @Int = 1, 
     @InnerInt = 1 

WHILE @Int < 50000 
BEGIN 
    WHILE @InnerInt < 10 
    BEGIN 
     INSERT INTO #Temp SELECT @InnerInt 
     SET @InnerInt = @InnerInt + 1 
    END 
    SELECT @Int = @Int + 1, 
      @InnerInt = 1 
    TRUNCATE TABLE #Temp 
END 

DROP TABLE #TEMP 

GO 

DECLARE @Temp TABLE(
     ID INT 
) 

DECLARE @Int INT, 
     @InnerInt INT 
SELECT @Int = 1, 
     @InnerInt = 1 

WHILE @Int < 50000 
BEGIN 
    WHILE @InnerInt < 10 
    BEGIN 
     INSERT INTO @Temp SELECT @InnerInt 
     SET @InnerInt = @InnerInt + 1 
    END 
    SELECT @Int = @Int + 1, 
      @InnerInt = 1 
    DELETE FROM @Temp 
END 

De Sql Profiler

CPU  Reads Writes Duration 
36375  2799937 0  39319 

vs 

CPU  Reads Writes Duration 
14750 1700031 2  17376 
+8

Il serait plus juste de dire que la suppression est la meilleure option. Rien à voir avec les variables de table, vous obtenez la même chose avec une table '# temp' et DELETE. Ceci est un cas de bord en ce sens que les 10 lignes tiennent toutes sur une page. 'TRUNCATE' libère la dernière page de la table et' DELETE' ne le fait pas. Les tables sont si minuscules que le surcoût lié à la consignation des lignes supprimées est moindre que le surcoût dû à la désallocation et à la réaffectation constantes de la seule page de la table. [Pour les plus grandes tables, l'histoire est différente] (http://dba.stackexchange.com/q/27309) –

+0

Alors .... tronqué serait mieux pour une table plus grande avec dis, 1000 lignes? Truncate est généralement plus rapide pour effacer des données qu'une suppression, car il supprime tout de manière indiscriminée et n'écrit pas autant dans le journal que la suppression de lignes individuelles. – Triynko

7

En toute franchise, avec seulement 10 ou 20 (ou même 100), toute différence de vitesse serait dans un domaine sub-nanoseconde. Oubliez ça - ne perdez même pas une seconde de votre temps à ce sujet - c'est un non-problème!

En général

  • variables de table seront conservés en mémoire une certaine taille - si elles vont au-delà, ils sont permutées sur le disque dans la base de données tempdb aussi - comme des tables temporaires. Plus: si une table temporaire n'a qu'une poignée d'entrées, elles seront généralement stockées sur une seule page 8k, et dès que vous accéderez à l'une des entrées, toute la page (et donc toute la table temporaire) sera être dans la mémoire SQL Server - même ici, il n'y a vraiment pas beaucoup d'avantages pour les variables de table ...

  • Les variables de tableau ne supportent pas les indices ni les statistiques, ce qui signifie que si vous avez plus d'une poignée d'entrées et surtout si vous avez besoin de rechercher et d'interroger cette « entité », vous êtes mieux avec une table temporaire

donc, dans l'ensemble: j'utilise des tables temporaires plus souvent que les variables de table, surtout si je avoir plus de 1 0 entrées ou quelque chose comme ça. Etre capable d'indexer la table temporaire, et d'avoir des statistiques dessus, rapporte habituellement beaucoup de temps par rapport à tout gain potentiel qu'une variable de table pourrait avoir, en termes de performances.

+2

Merci, je suis d'accord la différence entre supprimer et tronquer est probablement négligeable. C'était vraiment une question académique, car l'échange des tables temporaires pour les variables de table dans ma procédure faisait environ 10% de différence. Comme "Spender" a dit que je viens de le tester. – Richard

+0

Je me demandais w/ma situation similaire à OP. La table temporaire peut contenir 10, 25, 250 lignes en fonction de la configuration des données.Dans mon scénario de test 15 lignes, je comparais les plans d'exécution réels dans un proc qui a une table temporaire qui est répétée, puis réutilisée dans la boucle externe. Nous ne voulons pas avoir de données périmées et nous effaçons la table temporaire avec DELETE. Cela apparaît dans les plans d'exécution à 4% du lot (ses lots complexes sont en cours). Si je remplace par TRUNCATE son pas dans le plan du tout! Est-ce que le comportement normal de truncate (n'apparaît pas dans les plans exec) ou est-il si trivial qu'il ne soit pas pertinent pour les plans? –

Questions connexes