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.
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.
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).
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).
```-- 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;
```
[ ] Isolation levels (Read Uncommitted, Read Committed, Repeatable Read, Serializable)
[ ] Differenza tra funzioni scalari (Scalar UDF) e funzioni tabellari (Table-Valued UDF)
Documentazione ufficiale Microsoft Learn (SQL Server)
T-SQL Fundamentals (Itzik Ben-Gan)