SQL Server — Cheat Sheet

Tag: sql-server, t-sql, database, rdbms, backend, performance

Livello: intermedio

TL;DR: Sintesi rapida su Microsoft SQL Server, costrutti T-SQL essenziali, differenze tra indici e ottimizzazione delle query per colloqui tecnici backend.

Concetti chiave

T-SQL (Transact-SQL) è l'estensione proprietaria di Microsoft per SQL, dotata di costrutti procedurali e gestione errori.

I clustered index determinano l'ordinamento fisico dei dati nella tabella. È possibile averne solo uno per tabella.

I non-clustered index contengono puntatori ai dati reali, mantenendo una struttura a B-Tree separata dai dati fisici.

Le Common Table Expressions (CTE) migliorano la leggibilità e permettono di scrivere query ricorsive tramite il blocco WITH.

Le Window Functions (ROW_NUMBER(), RANK(), OVER()) eseguono calcoli su un set di righe senza raggrupparle in una singola riga.

Le transazioni garantiscono le proprietà ACID (Atomicity, Consistency, Isolation, Durability) tramite BEGIN TRAN, COMMIT e ROLLBACK.

I deadlock si verificano quando due processi si bloccano a vicenda; SQL Server sceglie automaticamente una "victim" e ne annulla la transazione.

L'Execution Plan mostra la strategia del motore SQL per eseguire la query, essenziale per il troubleshooting delle performance.

Le Stored Procedure sono script pre-compilati: riducono il traffico di rete, ottimizzano l'esecuzione e proteggono da SQL Injection.

Domande tipiche e risposte pronte

Q: Qual è la differenza tra TRUNCATE e DELETE?R: TRUNCATE è un'operazione DDL, molto più veloce, che resetta le identity e logga solo le deallocazioni di pagina. DELETE è DML, logga ogni singola riga eliminata e supporta la clausola WHERE.

Q: Come differiscono UNION e UNION ALL?R: UNION unisce due set di risultati rimuovendo i duplicati tramite un ordinamento implicito. UNION ALL unisce i set senza controlli, risultando molto più veloce.

Q: Cosa sono e a cosa servono i Trigger?R: Sono procedure speciali associate a tabelle o viste che vengono eseguite in automatico come reazione a eventi DML (INSERT, UPDATE, DELETE).

Insidie e errori comuni

Utilizzare SELECT * in produzione (causa un consumo inutile di memoria e I/O di rete, impedendo l'uso ottimale dei covering index).

Abusare dei cursori o dei cicli WHILE invece di preferire approcci set-based nativi (abbatte drasticamente le performance).

Sottovalutare i valori NULL nelle clausole NOT IN (se la subquery restituisce un NULL, il set di risultati esterno sarà sempre vuoto).

Concatenare stringhe per comporre le query al posto della parametrizzazione (apre gravi vulnerabilità di SQL Injection).

Snippet e comandiSQL

```-- CTE Ricorsiva

WITH EmployeeHierarchy AS (

SELECT Id, Name, ManagerId

FROM Employees

WHERE ManagerId IS NULL

UNION ALL

SELECT e.Id, e.Name, e.ManagerId

FROM Employees e

INNER JOIN EmployeeHierarchy eh ON e.ManagerId = eh.Id

)

SELECT * FROM EmployeeHierarchy;

-- Window function per estrarre il più pagato di ogni dipartimento

SELECT Name, Salary, DepartmentId

FROM (

SELECT Name, Salary, DepartmentId,

ROW_NUMBER() OVER(PARTITION BY DepartmentId ORDER BY Salary DESC) as Rank

FROM Employees

) t

WHERE Rank = 1;

```

Da ripassare

[ ] Isolation levels (Read Uncommitted, Read Committed, Repeatable Read, Serializable)

[ ] Differenza tra funzioni scalari (Scalar UDF) e funzioni tabellari (Table-Valued UDF)

Riferimenti

Documentazione ufficiale Microsoft Learn (SQL Server)

T-SQL Fundamentals (Itzik Ben-Gan)

Jarvis Interviews
Jarvis