web-dev-qa-db-fra.com

Quelle est la principale différence entre les tables CTE et TEMP?

Y a-t-il un avantage à utiliser CTE's (common table expressions) à la place d'utiliser temp tables.

J'ai passé des tests de performance entre les deux, mais je ne trouve pas beaucoup de différence entre eux.

Quels sont les avantages et les inconvénients de l'utilisation de CTE'S?

19
GreatLakes07

La plus grande différence entre un CTE et une table temporaire est probablement que le CTE a une portée d'exécution d'un simple SELECT, INSERT, UPDATE, DELETE ou Instruction CREATE VIEW.

Essentiellement, vous ne pouvez pas réutiliser le CTE, comme vous le pouvez avec les tables temporaires.

De la documentation

Une expression de table commune (CTE) peut être considérée comme un jeu de résultats temporaire défini dans la portée d'exécution d'une seule instruction SELECT, INSERT, UPDATE, DELETE ou CREATE VIEW. Un CTE est similaire à une table dérivée en ce qu'il n'est pas stocké en tant qu'objet et ne dure que pendant la durée de la requête. Contrairement à une table dérivée, un CTE peut être auto-référencé et peut être référencé plusieurs fois dans la même requête.

Un CTE peut être utilisé pour:

  1. Créez une requête récursive. Pour plus d'informations, consultez Requêtes récursives à l'aide d'expressions de table communes.

  2. Remplacer une vue lorsque l'utilisation générale d'une vue n'est pas requise; c'est-à-dire que vous n'avez pas besoin de stocker la définition dans des métadonnées.

  3. Activez le regroupement par une colonne dérivée d'une sous-sélection scalaire ou une fonction non déterministe ou disposant d'un accès externe.

  4. Référencez la table résultante plusieurs fois dans la même instruction.

14
bastos.sergio

CTE: CTE signifie expressions de table commune. Il a été introduit avec SQL Server 2005. Il est utilisé pour stocker le résultat d'une sous-requête complexe sur des bases temporaires. Sa durée de vie est limitée à la requête en cours. Il est défini à l'aide de l'instruction WITH. Il est principalement utilisé pour les appels récursifs.

Exemple

;with myCTE as 
(
    select ParentLevel, ParentID, ChildID 
    from MHA 
    where ChildID = 1 
    UNION ALL
    select MHA.ParentLevel, MHA.ParentID, MHA.ChildID 
    from MHA
    inner join myCTE on MHA.ParentID = myCTE.ChildID
    where MHA.ParentID <> 0
)

(erreur)

select top (5) * from myCTE

donc dans l'exemple ci-dessus, j'ai créé un nom CTE comme myCTE, qui ne peut être utilisé que dans la requête ci-dessus (je ne peux pas utiliser myCTE en dehors de la requête ci-dessus)

TEMP: Il est également utilisé pour stocker le résultat de la requête sur des bases temporaires. Mais sa durée de vie est limitée à la session en cours. Il est défini en utilisant #. Il ne prend pas en charge récursif.

Exemple:

select * into #tempTable from MHA

Dans la requête ci-dessus, j'ai créé une table temporaire, maintenant je peux l'utiliser en dehors de cette requête, mais en session. Voir ci-dessous

(pas d'erreur)

select top (5) * from #tempTable
5
Sonu Rajpoot