J'ai le problème suivant dans SQL Server 2005: essayer d'insérer des lignes dans une variable de table prend beaucoup de temps par rapport à la même insertion utilisant une table temporaire.
Ceci est le code à insérer dans la variable de table
DECLARE @Data TABLE(...)
INSERT INTO @DATA( ... )
SELECT ..
FROM ...
Ceci est le code à insérer dans la table temporaire
CREATE #Data TABLE(...)
INSERT INTO #DATA( ... )
SELECT ..
FROM ...
DROP TABLE #Data
La table temporaire n'a pas de clés ou d'index, la partie sélection est la même entre les 2 requêtes et le nombre de résultats renvoyés par la sélection est ~ 10000 lignes. Le temps nécessaire pour exécuter la sélection seule est d'environ 10 secondes.
La version de la table temporaire prend jusqu'à 10 secondes pour s'exécuter, j'ai dû arrêter la version variable de la table après 5 minutes.
Je dois utiliser une variable de table car la requête fait partie d'une fonction de valeur de table, qui ne permet pas d'accéder à une table temporaire.
Plan d'exécution pour la version variable de table
Plan d'exécution pour la version de table temporaire
EXEC
une fonction ... devinez que j'avais tortInvalid use of a side-effecting operator 'INSERT EXEC' within a function.
. LeOPENQUERY
travail autour pourrait cependant fonctionner.Les variables de table sont parfois plus lentes car il n'y a pas de statistiques sur les variables de table, et donc l'optimiseur suppose toujours un seul enregistrement.
Cependant, je ne peux pas garantir que c'est le cas ici, vous devrez jeter un œil aux informations sur les "lignes estimées" dans le plan de requête pour la variable de table.
la source