Per CTE o meno CTE
-
26-09-2019 - |
Domanda
Essendo stato bloccato con SQL2000 per troppo tempo, non ho davvero avuto un sacco di esposizione a tavola espressioni comuni.
Le risposte che ho dato qui (# 4.025.380) e qui (# 4.018.793) sono andati contro il flusso, nel senso che non ha utilizzato una CTE.
Mi rendo conto che per la ricorsione sono il Beez Kneez, e ci sono un paio di domande che possono essere notevolmente semplificato dal loro uso, ma a che punto è il loro uso solo frivola? Hanno un grande miglioramento delle prestazioni nel corso di un sottoquery o un join? Fanno il codice davvero semplificare e rendere più gestibile?
In breve, quando è buona norma utilizzare un CTE su una sintassi 'minore'.
Soluzione
Si dovrebbe in genere utilizzare un CTE nel corso di un subquery normale se:
- Vostri criteri richiede ricorsione (come avrete notato)
- Il subquery è grande o complesso
- La query che contiene è grande o complesso
- Il subquery viene ripetuto (o almeno le più sottointerrogazioni può essere semplificata effettuando diverse operazioni semplici su una sottoquery comune)
In breve, si fanno domande fanno più leggibile se ben utilizzato.
Altri suggerimenti
Personalmente, una volta ho avuto agio con loro, penso che producono più pulito, il codice più leggibile. A titolo di esempio, confrontare la vostra risposta alla mia # 4.018.793 . Abbiamo sostanzialmente fatto la stessa cosa; Ho usato un CTE e non l'hai fatto.
La tua risposta senza CTE:
SELECT
course,
section,
grade,
gradeCount
FROM
table
INNER JOIN
(SELECT
grade,
Max(gradeCount) as MaxGradeCount
FROM
table
) MaxGrades
ON table.grade = MaxGrades.grade
AND table.gradeCount = MaxGrades.MaxGradeCount
ORDER BY
table.grade
La mia risposta con CTE:
;with cteMaxGradeCount as (
select
grade,
max(gradeCount) as MaxGradeCount
from @Test
group by grade
)
select
t.course,
t.SECTION,
t.grade,
t.gradeCount
from cteMaxGradeCount c
inner join @Test t
on c.grade = t.grade
and c.MaxGradeCount = t.gradeCount
order by t.grade
Sono zucchero sintattico, con l'eccezione di query gerarchiche / ricorsive.
Tuttavia, non tutto ciò che può essere fatto in modo ricorsivo dovrebbe essere - la generazione della data tramite CTE ricorsiva era appena meglio di un cursore -. Il trucco tavolo NUMERI scalato molto meglio
CTE produce un risultato più veloce in uno scenario ricorsivo. Il risultato di CTE è ripetutamente utilizzato per ottenere il gruppo di risultati finale. Quindi, dal momento che hai preso la tua clausola where o subquery in CTE, sicuramente sta andando a mostrare un miglioramento delle prestazioni.
Riferimento: http://msdn.microsoft.com/ it-it / library / ms190766 (v = SQL.105) aspx
Solo una nota, in molti scenari, tabelle temporanee dà la migliore prestazione allora CTE anche, così si dovrebbe dare una prova di tabelle temporanee pure.
Riferimento: http: //social.msdn .microsoft.com / Forum / it / Transact-SQL / thread / d040d19d-016e-4a21-bf44-a0359fb3c7fb