Top 50 de întrebări și răspunsuri la interviu T-SQL (2026)

Întrebări și răspunsuri pentru interviul T-SQL

Te pregătești pentru un interviu T-SQL? E timpul să vă îmbunătățiți înțelegerea modului în care funcționează cu adevărat bazele de date în subsol. Cu Întrebări de interviu T-SQLRecrutorii evaluează nu doar cunoștințele de sintaxă, ci și stăpânirea dumneavoastră asupra manipulării datelor, optimizării și structurării logice.

Oportunitățile în acest domeniu continuă să se extindă, deoarece companiile se bazează pe informații bazate pe date. Candidații cu expertiză tehnică solidă, abilități de analiză și capacități de rezolvare a problemelor din lumea reală ies în evidență - fie ei începători, fie profesioniști cu 5 până la 10 ani de experiență. Înțelegerea întrebărilor și răspunsurilor, atât la nivel de bază, cât și avansat, îi ajută pe liderii de echipă, managerii și seniorii tehnici să identifice seturi solide de competențe SQL și experiență la nivel de bază.

Ghidul nostru se bazează pe informațiile a peste 65 de manageri de angajare, peste 40 de dezvoltatori seniori și profesioniști în domeniul datelor din diverse industrii, asigurând o acoperire de la logica SQL fundamentală până la tehnici avansate de optimizare în care au încredere liderii tehnici din întreaga lume.
Citeste mai mult…

👉 Descărcare gratuită în format PDF: Întrebări și răspunsuri pentru interviul T-SQL

Întrebări și răspunsuri importante pentru interviuri T-SQL

1) Ce este T-SQL și cum diferă de SQL standard?

Transact-SQL (T-SQL) este Microsoftextensia proprietară a limbajului SQL, utilizată în principal cu Microsoft SQL ServerÎmbunătățește SQL standard prin introducerea de caracteristici de programare procedurală, cum ar fi variabile, condiții, bucle, tratarea erorilor și funcții încorporate. În timp ce SQL standard se concentrează pe manipularea datelor (SELECT, INSERT, UPDATE, DELETE), T-SQL acceptă instrucțiuni de control al fluxului (IF…ELSE, WHILE), tratarea tranzacțiilor și funcții de sistem care permit dezvoltatorilor să scrie scripturi complexe.

Aspect SQL T-SQL
Proprietate Standardul ANSI/ISO Microsoft
Logică procedurală Limitat Suportate (variabile, bucle)
Gestionarea erorilor Minim TRY…CATCH este acceptat
Utilizare primară Baze de date generice SQL Server

Exemplu:

DECLARE @count INT = 5;
WHILE @count > 0
BEGIN
    PRINT @count;
    SET @count -= 1;
END;

2) Explicați diferitele tipuri de join-uri în T-SQL cu exemple.

Join-urile din T-SQL combină rânduri din două sau mai multe tabele pe baza coloanelor corelate. Înțelegerea tipurilor acestora este crucială pentru interogările de date relaționale.

Alăturați-vă tipului Descriere Exemplu de sintaxă
INNER JOIN Returnează doar rândurile care se potrivesc SELECT * FROM A INNER JOIN B ON A.id = B.id;
REDUCEREA LOCULUI Toate din stânga + potriviri din dreapta SELECT * FROM A LEFT JOIN B ON A.id = B.id;
ÎNSCRIEȚI DREPT Toate din dreapta + potriviri din stânga SELECT * FROM A RIGHT JOIN B ON A.id = B.id;
ALĂTURAREA COMPLETĂ Combină STÂNGA + DREAPTA SELECT * FROM A FULL JOIN B ON A.id = B.id;
CROS JOIN produs cartezian SELECT * FROM A CROSS JOIN B;

Exemplu practic: Aderarea Orders și Customers pentru a afla ce clienți au plasat comenzi folosind INNER JOIN.


3) Ce sunt expresiile comune de tabel (CTE) și care sunt avantajele lor?

O expresie comună de tabel (CTE) oferă un set temporar de rezultate denumite care pot fi referențiate într-un SELECT, INSERT, UPDATE, DELETE instrucțiune. Îmbunătățește lizibilitatea și simplifică interogările recursive.

avantaje:

  • Îmbunătățește claritatea și întreținerea interogărilor.
  • Permite recursivitatea (pentru date ierarhice, cum ar fi organigramele).
  • Ajută la evitarea subinterogărilor repetate.
  • Crește modularitatea în scripturile mari.

Exemplu:

WITH EmployeeCTE AS (
    SELECT EmpID, EmpName, ManagerID
    FROM Employees
)
SELECT * FROM EmployeeCTE WHERE ManagerID IS NULL;

4) Cum diferă tabelele temporare și variabilele de tabel în T-SQL?

Ambele sunt folosite pentru stocarea rezultatelor intermediare, dar comportamentul și domeniul lor de aplicare diferă semnificativ.

Caracteristică Tabel temporar (#Temp) Variabilă de tabel (@TableVar)
Stocat în TempDB Memorie (cu utilizare limitată a TempDB)
Domeniu de aplicare tranzacțional Urmărește tranzacțiile Independent de tranzacții
Indexuri Suportat Limitat
Performanţă Mai bun pentru seturi de date mari Mai bun pentru seturi de date mici

Exemplu:

DECLARE @TableVar TABLE (ID INT, Name NVARCHAR(50));
INSERT INTO @TableVar VALUES (1, 'Alice');

Folosește tabele temporare atunci când lucrezi cu seturi de date mari sau când ai nevoie de indexuri.


5) Explicați conceptul de tranzacții în T-SQL și ciclul lor de viață.

O tranzacție în T-SQL asigură că o secvență de operații se execută ca o singură unitate logică. Ciclul de viață include ÎNCEPE TRANZACȚIA, COMITEAZA și REALIZARE.

Etapă Descriere
ÎNCEPE TRANZACȚIA Începe tranzacția
ANGAJARE TRANZACȚIE Salvează toate modificările permanent
TRANZACȚIE DE RETURNARE Anulează toate operațiunile de la ultimul BEGIN

Exemplu:

BEGIN TRANSACTION;
UPDATE Accounts SET Balance = Balance - 100 WHERE AccID = 1;
UPDATE Accounts SET Balance = Balance + 100 WHERE AccID = 2;
COMMIT TRANSACTION;

Dacă apare o eroare la jumătatea drumului, ROLLBACK menține integritatea datelor.


6) Care este diferența dintre comenzile DELETE, TRUNCATE și DROP?

Comandă Funcţie Rollback Afectează structura Viteză
DELETE Elimină anumite rânduri Da Nu Mai lent
TRUNCHIA Elimină toate rândurile Nu (de obicei) Nu Rapid
CĂDERE BRUSCA Șterge întregul tabel Nu Da Cel mai rapid

Exemplu:

DELETE FROM Employees WHERE Department = 'HR';
TRUNCATE TABLE TempData;
DROP TABLE OldLogs;

Utilizare DELETE pentru îndepărtarea selectivă, TRUNCATE pentru curățare și DROP pentru a îndepărta complet masa.


7) Cum funcționează tratarea erorilor în T-SQL?

T-SQL oferă o gestionare structurată a erorilor prin intermediul TRY...CATCH bloc, permițând dezvoltatorilor să gestioneze cu eleganță erorile de execuție.

Exemplu:

BEGIN TRY
    INSERT INTO Employees VALUES (1, 'John');
END TRY
BEGIN CATCH
    PRINT 'Error: ' + ERROR_MESSAGE();
END CATCH;

Această abordare izolează operațiunea defectuoasă și previne coruperea integrității datelor de către tranzacție. Dezvoltatorii pot accesa, de asemenea, funcții de sistem precum ERROR_NUMBER() or ERROR_SEVERITY() pentru diagnosticare.


8) Care sunt diferitele modalități de a optimiza performanța interogărilor T-SQL?

Optimizarea implică reglarea fină a strategiilor de proiectare, indexare și execuție SQL.

Tehnici cheie:

  1. Utilizare indexare corectă pe coloanele interogate frecvent.
  2. Evita SELECT * — specifică explicit coloanele.
  3. Utilizare operații bazate pe seturi în loc de cursori.
  4. Analizați planurile de execuție utilizând SQL Server Management Studio.
  5. Utilizare JOIN-uri eficiente cu condiții de pornire corespunzătoare.
  6. Reduce subinterogări imbricate; preferați CTE-uri sau tabele temporare.

Reglarea performanței în T-SQL include și monitorizarea statisticilor de execuție a interogărilor folosind SET STATISTICS IO ON.


9) Ce sunt funcțiile ferestrelor și când ar trebui să le folosiți?

Funcțiile de tip fereastră efectuează calcule pe un set de rânduri legate de rândul curent, fără a le restrânge într-un singur rezultat. Sunt utile pentru clasament, totaluri mobile și medii mobile.

Exemplu:

SELECT
    EmployeeID,
    Salary,
    RANK() OVER (ORDER BY Salary DESC) AS RankBySalary
FROM Employees;

Funcțiile comune includ RANK(), ROW_NUMBER(), DENSE_RANK() și SUM() OVER().

Acestea sunt cruciale pentru sarcinile de lucru analitice unde aveți nevoie atât de date agregate, cât și de date la nivel de rând.


10) Explicați diferența dintre indexurile grupate și cele negrupate.

Caracteristică Clustered Index Nu-Clustered Index
Stocarea datelor Rearanjează fizic tabelul Structură separată
Număr per tabel O Multiplu
Performanţă Mai rapid pentru interogările de interval Mai rapid pentru căutări specifice
Exemplu de utilizare Cheia principala Căutări secundare

Exemplu:

CREATE CLUSTERED INDEX IX_EmployeeID ON Employees(EmployeeID);
CREATE NONCLUSTERED INDEX IX_Dept ON Employees(Department);

Alegerea tipului de index potrivit afectează direct viteza de execuție a interogărilor și eficiența stocării.


11) Ce sunt procedurile stocate în T-SQL și de ce sunt utilizate?

O procedură stocată este o colecție precompilată de una sau mai multe instrucțiuni SQL stocate pe server. Acestea îmbunătățesc performanța, securitatea și reutilizabilitatea permițându-vă să încapsulați logica și să o executați în mod repetat fără recompilare. Procedurile stocate reduc traficul de rețea și acceptă parametri pentru execuția dinamică.

Exemplu:

CREATE PROCEDURE GetEmployeeDetails @Dept NVARCHAR(50)
AS
BEGIN
    SELECT EmpName, Position FROM Employees WHERE Department = @Dept;
END;

Beneficii:

  • Performanță mai bună datorită precompilării.
  • Securitate îmbunătățită prin execuție controlată.
  • Întreținere și modularizare mai ușoară a codului.

12) Explicați diferența dintre o procedură stocată și o funcție în T-SQL.

Aspect Procedură stocată Funcţie
Tipul de returnare Poate returna mai multe valori Trebuie să returneze o singură valoare sau un singur tabel
Utilizare în SELECT Nu sunt permise Permis
Gestionarea erorilor TRY…CATCH este acceptat Limitat
Execuție Executat prin EXEC Folosit în linie cu SQL
Controlul tranzacțiilor Suportat Nu este suportat

Exemplu:

  • Procedură: EXEC GetEmployeeDetails 'HR';
  • Funcția: SELECT dbo.GetSalary(101);

Funcțiile sunt ideale pentru calcule; procedurile sunt mai potrivite pentru logica de afaceri și manipularea datelor.


13) Ce este un trigger în T-SQL și care sunt tipurile sale?

Un declanșator este o procedură stocată specială care se execută automat ca răspuns la anumite evenimente (INSERT, UPDATE, DELETE) într-un tabel sau o vizualizare. Declanșatoarele sunt utilizate pentru aplicarea regulilor de business, auditarea modificărilor sau menținerea integrității referențiale.

Tip Descriere
DUPĂ declanșator Incendii după finalizarea evenimentului
ÎN LOC DE Declanșare Se execută în locul evenimentului declanșator

Exemplu:

CREATE TRIGGER trgAfterInsert
ON Employees
AFTER INSERT
AS
BEGIN
    PRINT 'New employee record added!';
END;

Evitați utilizarea excesivă a declanșatoarelor — acestea pot afecta performanța și pot complica depanarea.


14) Cum gestionați valorile NULL în T-SQL?

NULL reprezintă date lipsă sau necunoscute. T-SQL oferă mai multe funcții pentru a gestiona eficient acest lucru:

  • ISNULL(expression, replacement) → înlocuiește NULL cu o valoare implicită.
  • COALESCE(expression1, expression2, ...) → returnează prima valoare diferită de NULL.
  • NULLIF(expression1, expression2) → returnează NULL dacă expresiile sunt egale.

Exemplu:

SELECT ISNULL(Manager, 'No Manager') AS ManagerName FROM Employees;

Cea mai bună practică: Luați întotdeauna în considerare valorile NULL în joncțiuni și condiții pentru a evita rezultate neașteptate.


15) Ce sunt cursorii în T-SQL și când ar trebui evitați?

Un cursor permite procesarea rând cu rând a rezultatelor interogării — util pentru logica complexă unde operațiile bazate pe seturi sunt insuficiente. Cu toate acestea, cursoarele sunt încetini și grele de resurse comparativ cu alternativele bazate pe seturi.

Exemplu:

DECLARE emp_cursor CURSOR FOR SELECT EmpName FROM Employees;
OPEN emp_cursor;
FETCH NEXT FROM emp_cursor;
-- process
CLOSE emp_cursor;
DEALLOCATE emp_cursor;

Dezavantaje:

  • Utilizare crescută a memoriei.
  • Scalabilitate slabă.
  • Performanță redusă.

Alternative: Folosiți joncțiuni de tabele, subinterogări sau funcții de fereastră ori de câte ori este posibil.


16) Explicați instrucțiunea MERGE și cazurile sale de utilizare.

MERGE instrucțiunea efectuează INSERT, UPDATE și DELETE operațiuni într-o singură comandă — ideal pentru sincronizarea a două tabele.

Exemplu de sintaxă:

MERGE INTO Target AS T
USING Source AS S
ON T.ID = S.ID
WHEN MATCHED THEN UPDATE SET T.Name = S.Name
WHEN NOT MATCHED BY TARGET THEN INSERT (ID, Name) VALUES (S.ID, S.Name)
WHEN NOT MATCHED BY SOURCE THEN DELETE;

Cazuri de utilizare:

  • Depozitare de date (sincronizare staging și tabele țintă).
  • Încărcare incrementală a datelor.
  • Întreținerea tabelelor de audit sau de dimensiuni.

17) Care sunt diferitele tipuri de funcții definite de utilizator (UDF-uri) în T-SQL?

Tip Descriere Exemplu
mărime scalară Returnează o singură valoare CREATE FUNCTION GetTax(@Salary DECIMAL) RETURNS DECIMAL
Valori în tabel inline Returnează un tabel prin intermediul unui singur SELECT RETURN SELECT * FROM Employees WHERE Dept = 'HR'
Valori tabelare cu mai multe declarații Returnează un tabel după mai multe instrucțiuni Util pentru logica complexă

Funcțiile promovează reutilizarea codului și îmbunătățesc designul modular al interogărilor.

Acestea ar trebui să fie deterministe (să returneze același rezultat pentru aceeași intrare) ori de câte ori este posibil pentru optimizarea performanței.


18) Ce este normalizarea și care sunt avantajele și dezavantajele acesteia?

Normalizarea este procesul de organizare a datelor dintr-o bază de date pentru a minimiza redundanța și a îmbunătăți integritatea. Aceasta implică împărțirea tabelelor în entități mai mici, corelate.

Formă normală Regula Exemplu
1NF Eliminați grupurile repetitive Separarea datelor separate prin virgulă
2NF Eliminați dependențele parțiale Asigurați dependența completă de cheia primară
3NF Eliminați dependențele tranzitive Mută ​​atributele derivate

avantaje:

  • Reduce redundanța.
  • Asigură consistența datelor.
  • Simplifica intretinerea.

Dezavantaje:

  • Îmbinari complexe.
  • Potențiale compromisuri de performanță pentru interogările analitice.

19) Care sunt diferitele tipuri de constrângeri în T-SQL?

Restricțiile impun reguli privind integritatea datelor dintr-un tabel.

Constrângere Scop Exemplu
CHEIA PRINCIPALA Identifică în mod unic fiecare rând PRIMARY KEY (EmpID)
CHEIE EXTERNĂ Leagă două tabele FOREIGN KEY (DeptID)
UNIC Asigură valori unice ale coloanelor UNIQUE (Email)
VERIFICA Validează intervalul de date CHECK (Age >= 18)
DEFAULT Oferă valori implicite DEFAULT GETDATE()

Constrângerile asigură acuratețea și fiabilitatea, reducând necesitatea unei validări extinse la nivel de aplicație.


20) Cum gestionați permisiunile și securitatea în T-SQL?

T-SQL gestionează securitatea bazei de date prin intermediul autentificări, utilizatori, roluri și permisiuni.

Permisiunile pot fi acordate sau revocate la nivel de obiect sau schemă.

Exemplu:

CREATE LOGIN John WITH PASSWORD = 'Strong@123';
CREATE USER John FOR LOGIN John;
GRANT SELECT, INSERT ON Employees TO John;

Cele mai bune practici:

  • Utilizare rolurile în loc de permisiuni directe ale utilizatorilor.
  • Evita sa folosesti sa sau conturi de sistem pentru aplicații.
  • Verificați periodic permisiunile cu sys.database_permissions.

Gestionarea corectă a permisiunilor asigură principiul privilegiilor minime și respectarea politicilor de securitate.


21) Care sunt diferitele niveluri de izolare a tranzacțiilor în T-SQL?

Nivelurile de izolare a tranzacțiilor determină modul în care o tranzacție este izolată de celelalte — echilibrarea consistenţă implementate cu concurențăSQL Server acceptă următoarele:

Nivel de izolare Descriere Citire murdară Citire nerepetabilă Citire fantomă
CITIȚI NECOMITAT Citește datele neconfirmate Da Da Da
CITIȚI ANGAJATE Implicit; blocările previn citirile nedorite Nu Da Da
CITIRE REPETABILĂ Previne modificarea datelor până la validare Nu Nu Da
SERIALIZABIL Izolare completă; blocare maximă Nu Nu Nu
INSTANTANEU Folosește controlul versiunilor, nu blocarea Nu Nu Nu

Exemplu:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;
-- your code
COMMIT;

Utilizare INSTANTANEU pentru sistemele cu concurență ridicată, pentru a minimiza blocarea fără a sacrifica consecvența.


22) Ce este un blocaj în SQL Server și cum îl puteți preveni?

A impas apare atunci când două tranzacții dețin blocaje de care are nevoie reciproc, rezultând o impas. SQL Server detectează și termină automat o tranzacție ca victimă a blocajului.

Exemplu de scenariu:

  • Tranzacția A blochează Table1, apoi așteaptă Table2.
  • Tranzacția B blochează Table2, apoi așteaptă Table1.

Tehnici de prevenție:

  1. Accesați resursele în aceeași ordine.
  2. Păstrați tranzacțiile scurte.
  3. Folosiți niveluri de izolare adecvate.
  4. Evitați interacțiunea utilizatorului în cadrul tranzacțiilor.

Folosește SQL Profiler sau Extended Events pentru a urmări blocajele în timp real.


23) Explicați diferența dintre controlul concurențial pesimist și optimist.

Tip Descriere Mecanism de blocare Utilizare caz
Pesimist Blochează datele în timpul tranzacției Încuietori grele Medii cu conflict ridicat
Optimist Folosește versionarea rândurilor, verifică înainte de validare Blocare minimă Sarcini de lucru cu citire intensă și conflicte reduse

Exemplu:

  • Pesimist: Implicit READ COMMITTED blocare.
  • Optimist: SNAPSHOT izolare cu versionare a rândurilor.

Concurența optimistă îmbunătățește performanța sistemelor cu operațiuni de citire mari și actualizări rare.


24) Cum poți analiza și optimiza o interogare T-SQL cu rulare lentă?

  1. Verificați planul de execuție: Identificați scanările, indexurile lipsă și operațiunile costisitoare.
  2. Folosește SET STATISTICS IO/TIME: Analizați I/O și utilizarea CPU.
  3. Evitați cursorii și buclele: Înlocuiți cu operații bazate pe mulțimi.
  4. Optimizarea indexului: Adăugați sau reorganizați indexuri fragmentate.
  5. Mirosirea parametrilor: Utilizare OPTION (RECOMPILE) pentru a genera noi planuri.

Exemplu:

SET STATISTICS TIME ON;
SELECT * FROM Orders WHERE CustomerID = 123;

Monitorizarea regulată a interogărilor lente cu Vizualizări de gestionare dinamică (DMV-uri) ca sys.dm_exec_query_stats este o practică recomandată.


25) Ce este SQL dinamic și care sunt avantajele și riscurile sale?

SQL dinamic vă permite să construiți instrucțiuni SQL dinamic în timpul execuției folosind variabile.

Exemplu:

DECLARE @sql NVARCHAR(MAX);
SET @sql = 'SELECT * FROM Employees WHERE Dept = ''' + @Dept + '''';
EXEC(@sql);

avantaje:

  • Flexibilitate pentru numele sau filtrele tabelelor variabile.
  • Reutilizabil pentru mai multe scheme.

Dezavantaje:

  • Vulnerabil la Injecție SQL dacă nu este parametrizat.
  • Mai greu de depanat și de întreținut.

Folosiți întotdeauna sp_executesql cu parametri de siguranță.


26) Ce sunt obiectele temporare în T-SQL și cum diferă acestea?

Obiectele temporare sunt stocate în TempDB și ajută la gestionarea datelor intermediare.

Tip obiect domeniu Exemplu
Tabel temporar local Specific sesiunii CREATE TABLE #TempTable
Tabelul temporar global Vizibil pentru toate sesiunile CREATE TABLE ##TempGlobal
Variabilă de tabel Specific lotului DECLARE @Temp TABLE (...)

Cele mai bune practici:

  • Preferați variabile de tip tabel pentru seturi de date mai mici.
  • Folosește tabele temporare locale pentru date mai mari cu nevoi de indexare.
  • Eliminați explicit tabelele temporare pentru a elibera resursele mai rapid.

27) Cum se utilizează funcțiile de partiționare a ferestrelor în T-SQL?

Partiționarea permite aplicarea funcțiilor ferestrei la subseturi specifice de date.

Exemplu:

SELECT
    Department,
    EmpName,
    Salary,
    RANK() OVER (PARTITION BY Department ORDER BY Salary DESC) AS RankInDept
FROM Employees;

Beneficii:

  • Calculează eficient clasamentele, totalurile și mediile pe grupe.
  • Elimină necesitatea auto-unirii sau a subinterogărilor.

Cazuri de utilizare: Intervale salariale, clasamente ale vânzărilor și analize ale tendințelor.


28) Care este diferența dintre UNION și UNION ALL în T-SQL?

Clauză Dubluri Performanţă Utilizare caz
UNIUNE Îndepărtează duplicatele Mai lent (folosește sortare/distincție) Combinarea curată a seturilor de rezultate
UNION TOATE Păstrează duplicatele Mai rapid Agregarea sau migrarea datelor

Exemplu:

SELECT City FROM Customers
UNION
SELECT City FROM Suppliers;

Prefera UNION ALL când duplicatele sunt acceptabile și performanța contează.


29) Cum se lucrează cu date JSON în T-SQL?

SQL Server acceptă funcții JSON native pentru analizarea și generarea de date JSON.

Exemplu:

DECLARE @json NVARCHAR(MAX) = '{"Name":"John","Age":30}';
SELECT JSON_VALUE(@json, '$.Name') AS Name;

Funcții cheie:

  • JSON_VALUE() → Extrage valori scalare.
  • JSON_QUERY() → Extrage obiecte/matrici.
  • OPENJSON() → Analizează JSON în rânduri.
  • FOR JSON → Convertește rezultatele interogării în format JSON.

Util pentru API-uri, sisteme hibride și integrări NoSQL.


30) Cum poți gestiona și optimiza TempDB în SQL Server?

TempDB este o bază de date de sistem esențială pentru stocarea temporară și controlul versiunilor. Gestionarea defectuoasă poate cauza probleme grave de performanță.

Tehnici de optimizare:

  1. Plasați TempDB pe un stocare rapidă (SSD).
  2. Predimensionați fișierele de date și jurnal.
  3. Folosește mai multe fișiere de date (1 per nucleu CPU, până la 8).
  4. Monitorizați cu sys.dm_db_file_space_usage.
  5. Curățați regulat obiectele temporare.

Exemplu de interogare:

SELECT * FROM sys.dm_db_file_space_usage;

Gestionarea TempDB în mod proactiv evită concurența pe paginile de alocare și îmbunătățește debitul general al bazei de date.


31) Ce sunt indiciile de interogare în T-SQL și când ar trebui utilizate?

Sugestiile de interogare instruiesc optimizatorul SQL Server să își modifice planul normal de execuție.

Acestea ar trebui utilizate cu moderație — doar atunci când înțelegeți pe deplin contextul de distribuție și execuție a datelor.

Exemplu:

SELECT * FROM Orders WITH (NOLOCK) WHERE CustomerID = 102;

Sugestii comune:

  • NOLOCK: Citește fără blocări (poate citi date nevalidate).
  • FORCESEEK: Forțează căutarea indexului în loc de scanare.
  • OPTIMIZE FOR: Ghidează valorile parametrilor pentru generarea planului.
  • RECOMPILE: Forțează recompilarea pentru fiecare execuție.

Prudență: Suprautilizarea indiciilor poate degrada performanța pe măsură ce datele cresc sau modelele se schimbă. Folosiți-le numai atunci când planul optimizatorului este demonstrabil ineficient.


32) Explicați conceptul de memorare în cache a planului de execuție în SQL Server.

SQL Server stochează în cache planurile de execuție pentru a evita recompilarea pentru interogările recurente.

Când aceeași interogare se execută din nou cu o structură identică, aceasta reutilizează planul din cache, îmbunătățind performanța.

Exemplu:

EXEC GetCustomerOrders @CustomerID = 101;

Beneficii:

  • Reduce consumul suplimentar al procesorului.
  • Îmbunătățește consecvența timpului de răspuns.

Probleme:

  • Adulmecarea parametrilor poate duce la planuri ineficiente.
  • Supradimensionarea memoriei cache a planului poate consuma memorie.

Atenuare: Utilizare OPTION (RECOMPILE) or OPTIMIZE FOR UNKNOWN unde parametrii variază foarte mult.


33) Ce este sniffing-ul parametrilor și cum poate afecta performanța?

Recuperarea parametrilor are loc atunci când SQL Server utilizează valorile parametrilor de la prima execuție a unei interogări pentru a genera un plan care este apoi reutilizat, chiar dacă este suboptim pentru execuțiile ulterioare.

Exemplu de scenariu:

  • Prima execuție: set mic de date → plan de căutare a indexului.
  • Următoarea execuție: set de date mare → același plan reutilizat, dar lent.

Soluții:

  1. Utilizare OPTION (RECOMPILE) pentru a genera planuri noi.
  2. Folosește variabile locale pentru a masca valorile parametrilor.
  3. Utilizare OPTIMIZE FOR or OPTIMIZE FOR UNKNOWN.

Adulmecarea parametrilor este una dintre principalele cauze ale performanței imprevizibile în T-SQL.


34) Cum monitorizați și analizați performanța interogărilor în SQL Server?

Puteți utiliza mai multe instrumente și DMV-uri pentru a crea profiluri și a regla performanța:

  • Planuri de execuție: Ctrl + M în SSMS sau sys.dm_exec_query_plan.
  • DMV-uri:

    • sys.dm_exec_query_stats – CPU și durată.
    • sys.dm_exec_sql_text – Text SQL.
    • sys.dm_exec_requests – Interogări active.
  • Monitor de performanță și evenimente extinse pentru urmărire pe termen lung.

Exemplu:

SELECT TOP 5
    total_worker_time / execution_count AS AvgCPU,
    total_elapsed_time / execution_count AS AvgTime,
    SUBSTRING(qt.text, 1, 100) AS QueryText
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
ORDER BY AvgTime DESC;

35) Explicați rolul statisticilor în optimizarea interogărilor.

Statisticile descriu distribuția datelor (de exemplu, valori distincte, densitate, histogramă) pe care optimizatorul o folosește pentru a estima cardinalitatea.

Dacă statisticile sunt învechite, SQL Server poate alege planuri slabe.

Comenzi cheie:

  • UPDATE STATISTICS Employees;
  • sp_updatestats;
  • Setare actualizare automată: activată în mod implicit.

Cele mai bune practici:

  • A pastra AUTO_UPDATE_STATISTICS activat.
  • Pentru tabele mari, programați actualizări manuale.
  • Utilizare FULLSCAN pentru indici critici.

Statisticile învechite sunt un ucigaș tăcut al performanței.


36) Care este diferența dintre o căutare a indexului și o scanare a indexului?

Ziua Operației Descriere Performanţă Utilizare caz
Căutare index Navighează direct la rândurile corespunzătoare Rapid Interogări extrem de selective
Scanare index Citește toate intrările din index secvențial Mai lent Interogări cu selectivitate redusă

Exemplu:

SELECT * FROM Orders WHERE OrderID = 123; -- Seek
SELECT * FROM Orders WHERE Status = 'Active'; -- May Scan

Sfat de optimizare: Creați indexuri filtrate sau de acoperire pentru a transforma scanările în căutări.


37) Explicați tabelele partiționate și avantajele acestora.

Partiționarea împarte un tabel mare în părți mai mici, ușor de gestionat (partiții), adesea pe baza unei coloane de interval (cum ar fi data).

Beneficii:

  • Gestionare mai rapidă a datelor (încărcare/descărcare pe partiții).
  • Performanță îmbunătățită a interogărilor pe seturi de date mari.
  • Procesare paralelă pentru scanări partiționate.

Exemplu:

CREATE PARTITION FUNCTION pfRange (DATETIME)
AS RANGE LEFT FOR VALUES ('2022-12-31', '2023-12-31');

Utilizare caz: Depozite de date care gestionează miliarde de rânduri unde partițiile vechi pot fi arhivate eficient.


38) Ce sunt CTE-urile recursive și ce limitări au?

A Expresie recursivă comună de tabel (CTE) face referire la sine, de obicei pentru date ierarhice, cum ar fi organigramele sau structurile arborescente.

Exemplu:

WITH EmployeeCTE AS (
    SELECT EmpID, ManagerID, EmpName FROM Employees WHERE ManagerID IS NULL
    UNION ALL
    SELECT e.EmpID, e.ManagerID, e.EmpName
    FROM Employees e
    INNER JOIN EmployeeCTE c ON e.ManagerID = c.EmpID
)
SELECT * FROM EmployeeCTE;

Limitări:

  • Limită implicită de recurență = niveluri 100.
  • Poate cauza probleme de performanță dacă adâncimea de recurență este mare.
  • Utilizare OPTION (MAXRECURSION n) pentru a ajusta limita.

39) Cum gestionează SQL Server intern erorile din tranzacții?

Când apare o eroare în cadrul unei tranzacții:

  • Daca este severă (nivel > 20), conexiunea se încheie imediat.
  • If non-sever, poate fi prins cu TRY...CATCH.

Exemplu:

BEGIN TRY
    BEGIN TRANSACTION;
    UPDATE Accounts SET Balance -= 500 WHERE ID = 1;
    INSERT INTO AuditLog VALUES ('Debit');
    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    ROLLBACK TRANSACTION;
    PRINT ERROR_MESSAGE();
END CATCH;

Cea mai buna practica: Încadrați întotdeauna DML în TRY…CATCH pentru rezistență la erori.


40) Care sunt câteva tehnici avansate de optimizare a performanței T-SQL?

  1. Evitați UDF-urile scalare în SELECT — funcțiile inline sunt mai rapide.
  2. Utilizați indexuri filtrate pentru a reduce dimensiunea indexului.
  3. Valorificarea OLTP în memorie (Hekaton) pentru sisteme cu concurență ridicată.
  4. Execuție în mod batch pe indexurile columnstore pentru analiză.
  5. Eliminați conversiile implicite prin potrivirea tipurilor de date.
  6. Utilizați depozitul de interogări pentru a compara planurile istorice.

Exemplu pentru detectarea conversiilor implicite:

SELECT * FROM sys.dm_exec_query_stats CROSS APPLY sys.dm_exec_query_plan(plan_handle)
WHERE CAST(query_plan AS NVARCHAR(MAX)) LIKE '%CONVERT_IMPLICIT%';

Reglarea performanței este un proces continuu - nu un eveniment singular.


41) Cum ați identifica cele mai mari interogări consumatoare de resurse în SQL Server?

Puteți identifica interogările cu costuri ridicate utilizând vizualizări de gestionare dinamică (DMV) care înregistrează statistici istorice de execuție.

Exemplu:

SELECT TOP 10
    total_logical_reads / execution_count AS AvgReads,
    total_worker_time / execution_count AS AvgCPU,
    total_elapsed_time / execution_count AS AvgDuration,
    SUBSTRING(qt.text, 1, 200) AS QueryText
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
ORDER BY AvgCPU DESC;

Valori cheie:

  • AvgCPUTimp mediu al CPU-ului per execuție.
  • AvgReadsIntensitatea I/O.
  • AvgDurationLatență de execuție.

Această abordare ajută administratorii de baze de date să izoleze interogările complexe înainte ca utilizatorii să observe măcar o degradare a performanței.


42) Cum puteți detecta și remedia indexurile lipsă în SQL Server?

SQL Server urmărește automat recomandările de index lipsă prin DMV-uri.

Exemplu:

SELECT
    migs.user_seeks AS Seeks,
    mid.statement AS TableName,
    mid.equality_columns,
    mid.inequality_columns,
    mid.included_columns
FROM sys.dm_db_missing_index_details mid
JOIN sys.dm_db_missing_index_groups mig ON mid.index_handle = mig.index_handle
JOIN sys.dm_db_missing_index_group_stats migs ON mig.index_group_handle = migs.group_handle
ORDER BY migs.user_seeks DESC;

Cele mai bune practici:

  • Prioritizați mai întâi indexurile cu căutare ridicată.
  • Verificați prin intermediul planurilor de execuție înainte de creare.
  • Evitați supraindexarea - aceasta încetinește scrierile.

43) Care este diferența dintre oglindirea bazei de date, replicare și transportul jurnalelor (log shipping)?

Caracteristică Scop În timp real Failover Complexitate
Oglindire Copie a bazei de date cu disponibilitate ridicată Da Automat Mediu
Replicarea Distribuția datelor între bazele de date Parțial Manual Înalt
Expediere busteni Strategie DR bazată pe backup Nu Manual Scăzut

Îndrumări de utilizare:

  • Oglindire → sisteme OLTP cu disponibilitate ridicată.
  • Replicare → Raportare distribuită.
  • Transmiterea jurnalelor → Configurații de recuperare în caz de dezastru.

44) Cum depanați problemele de blocare în SQL Server?

Blocarea apare atunci când un proces deține blocări de care are nevoie un alt proces.

Pentru a identifica blocanții:

SELECT
    blocking_session_id AS Blocker,
    session_id AS Blocked,
    wait_type,
    wait_time,
    wait_resource
FROM sys.dm_exec_requests
WHERE blocking_session_id <> 0;

Soluții:

  • Reduceți durata tranzacției.
  • Folosește izolarea instantaneelor.
  • Ajustați interogările pentru a minimiza blocarea.
  • Identificați tranzacțiile deschise de lungă durată cu DBCC OPENTRAN.

45) Cum ajută Query Store-ul din SQL Server la optimizarea performanței?

Query Store capturează textul interogării, planurile și statisticile de execuție — permițând analiza de regresie a planului.

Ajută la identificarea momentului în care o interogare devine brusc lentă din cauza modificărilor de plan.

Exemplu:

SELECT q.query_id, p.plan_id, rs.avg_duration
FROM sys.query_store_query q
JOIN sys.query_store_plan p ON q.query_id = p.query_id
JOIN sys.query_store_runtime_stats rs ON p.plan_id = rs.plan_id
ORDER BY rs.avg_duration DESC;

Beneficii:

  • Comparați planurile istorice.
  • Forțează-ți planuri bune.
  • Urmăriți tendințele de performanță în timp.

46) Cum poți preveni injecția SQL în aplicațiile T-SQL?

Apărări primare:

  1. Utilizare interogări parametrizate de sp_executesql.
  2. Validați și igienizați toate intrările utilizatorilor.
  3. Evitați concatenarea SQL dinamică.
  4. Angaja principiul cel mai mic privilegiu pentru conturile bazei de date.

Exemplu securizat:

DECLARE @sql NVARCHAR(MAX);
SET @sql = N'SELECT * FROM Employees WHERE Dept = @Dept';
EXEC sp_executesql @sql, N'@Dept NVARCHAR(50)', @Dept = 'HR';

Chiar dacă injecția SQL este la nivel de aplicație, Administratorii de baze de date trebuie să auditeze procedurile stocate și jurnalele pentru execuție neparametrizată.


47) Cum utilizați Extended Events pentru monitorizarea profundă a performanței?

Extended Events (XEvents) este un framework ușor de monitorizare a performanței — o alternativă modernă la SQL Trace.

Exemplu:

CREATE EVENT SESSION TrackQueries
ON SERVER
ADD EVENT sqlserver.sql_statement_completed
(WHERE duration > 1000)
ADD TARGET package0.event_file (SET filename = 'C:\Temp\QueryMonitor.xel');
ALTER EVENT SESSION TrackQueries ON SERVER STATE = START;

Cazuri de utilizare:

  • Monitorizați interogările cu utilizare ridicată a CPU-ului.
  • Capturați blocajele sau indexurile lipsă.
  • Profilați instrucțiunile de lungă durată în producție cu costuri suplimentare minime.

48) Ce sunt indexurile filtrate și când ar trebui utilizate?

Un index filtrat indexează doar un subset de rânduri care îndeplinesc o condiție de filtrare — îmbunătățind performanța și reducând spațiul de stocare.

Exemplu:

CREATE INDEX IX_ActiveEmployees
ON Employees (Department)
WHERE Status = 'Active';

Beneficii:

  • Dimensiune mai mică a indexului.
  • Întreținere mai rapidă.
  • Optimizat pentru interogări selective.

Cel mai bun pentru: Coloane cu distribuție asimetrică a datelor (de exemplu, înregistrări active vs. inactive).


49) Cum migrați datele în siguranță între medii SQL Server?

Migrarea sigură a datelor implică planificarea pentru consecvență, timp de nefuncționare și revenire la normal.

Cele mai bune practici:

  1. Utilizare replicare tranzacțională or captura de date privind modificările (CDC) pentru sincronizare live.
  2. Dezactivați temporar constrângerile și declanșatoarele.
  3. Utilizare BCP or SSIS pentru transferul de date în masă.
  4. Validați numărul de rânduri și sumele de control.
  5. Executați întotdeauna verificări de integritate post-migrare (DBCC CHECKDB).

Exemplu:

bcp Database.dbo.Table out TableData.dat -n -S Server -T

Testarea scripturilor de migrare în staging nu este negociabilă.


50) Cum identificați și remediați problemele legate de interogările sensibile la parametri (PSQ)?

Interogările sensibile la parametri au performanțe inconsistente pe baza valorilor parametrilor — o provocare frecventă în lumea reală.

Detectare: Utilizare Magazin de interogări or sys.dm_exec_query_stats pentru a identifica mai multe planuri pentru o singură interogare.

Strategii de remediere:

  1. Utilizare OPȚIUNE (RECOMPILARE) pentru fiecare execuție.
  2. Utilizare OPTIMIZAȚI PENTRU NECUNOSCUT pentru a crea un plan generic.
  3. Crează ghiduri de planificare pentru a impune căi de execuție optime.
  4. Utilizare indicii pentru interogări numai dacă este necesar.

Problemele sensibile la parametri necesită un echilibru între stabilitatea planului și predictibilitatea performanței.

🔍 Întrebări de interviu T-SQL de top cu scenarii din lumea reală și răspunsuri strategice

1) Care este diferența dintre INNER JOIN și LEFT JOIN în T-SQL?

Așteptat de la candidat: Intervievatorul dorește să evalueze înțelegerea dumneavoastră a operațiunilor de unire și a modului în care sunt gestionate relațiile de date în interogările SQL.

Exemplu de răspuns: An INNER JOIN returnează doar rândurile care au valori corespondente în ambele tabele, în timp ce un LEFT JOIN returnează toate rândurile din tabelul din stânga, împreună cu rândurile corespondente din tabelul din dreapta. Dacă nu există nicio potrivire, se returnează valori NULL pentru coloanele din tabelul din dreapta. Această distincție este crucială atunci când se lucrează cu relații parțiale sau opționale în bazele de date.


2) Cum ați identifica și elimina înregistrările duplicate dintr-un tabel în T-SQL?

Așteptat de la candidat: Intervievatorul dorește să vadă abilitatea dumneavoastră de a utiliza funcțiile ferestrelor și CTE-urile pentru a gestiona problemele legate de calitatea datelor.

Exemplu de răspuns: Aș folosi o expresie comună de tabel (CTE) combinată cu ROW_NUMBER() funcție pentru identificarea duplicatelor. De exemplu:

WITH CTE AS (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY column1, column2 ORDER BY id) AS rn
  FROM MyTable
)
DELETE FROM CTE WHERE rn > 1;

Această abordare ajută la eliminarea duplicatelor, păstrând în același timp o înregistrare unică pentru fiecare grup.


3) Puteți explica ce este o CTE (Common Table Expression - expresie comună de tabel) și când ați folosi-o?

Așteptat de la candidat: Intervievatorul îți verifică cunoștințele despre structurarea interogărilor și seturile de rezultate temporare.

Exemplu de răspuns: Un CTE este un set temporar de rezultate definit în domeniul de execuție al unei singure interogări. Este util pentru simplificarea joncțiunilor și subinterogărilor complexe, îmbunătățirea lizibilității și facilitarea interogărilor recursive. În rolul meu anterior, am folosit frecvent CTE-uri pentru a descompune logica de agregare în mai mulți pași în componente mai ușor de întreținut.


4) Cum gestionați optimizarea performanței în interogările T-SQL?

Așteptat de la candidat: Intervievatorul dorește să vă evalueze experiența în optimizarea interogărilor și depanarea performanței.

Exemplu de răspuns: Încep prin a examina planul de execuție pentru a identifica operațiuni lente, cum ar fi scanările de tabele sau joncțiunile costisitoare. Apoi verific dacă există indexuri lipsă, subinterogări redundante sau joncțiuni ineficiente. De asemenea, analizez statisticile și utilizez strategii de indexare, cum ar fi acoperirea indexurilor sau indexurile filtrate, pentru a îmbunătăți performanța. În cele din urmă, revizuiesc logica interogărilor pentru a mă asigura că utilizează operațiuni bazate pe seturi, mai degrabă decât procesarea rând cu rând.


5) Descrieți o situație în care a trebuit să depanați o interogare lentă în producție. Ce pași ați urmat?

Așteptat de la candidat: Această întrebare comportamentală îți evaluează abilitățile de rezolvare a problemelor din lumea reală și de comunicare.

Exemplu de răspuns: Într-o poziție anterioară, o interogare de raport dura peste 20 de minute pentru a se executa. Am analizat planul de execuție și am descoperit că uneia dintre joncțiuni îi lipsea un index pe o coloană de cheie externă. După crearea indexului și actualizarea statisticilor, timpul de execuție al interogării a scăzut la sub 30 de secunde. De asemenea, am documentat remedierea și am distribuit-o echipei pentru a preveni probleme similare în viitor.


6) Ce sunt tabelele temporare și variabilele de tabel și cum diferă acestea?

Așteptat de la candidat: Intervievatorul îți testează înțelegerea opțiunilor de stocare temporară a datelor în T-SQL.

Exemplu de răspuns: Tabele temporare (#TempTable) sunt create în baza de date tempdb și acceptă indexuri, constrângeri și statistici. Variabile de tabel (@TableVar) sunt stocate în memorie și au suport limitat pentru statistici, ceea ce le face potrivite pentru seturi de date mai mici. Tabelele temporare sunt mai bune pentru seturi de date mari sau complexe, în timp ce variabilele de tabel sunt mai eficiente pentru date mici și de scurtă durată.


7) Cum ați gestiona gestionarea erorilor și tranzacțiile în T-SQL?

Așteptat de la candidat: Intervievatorul verifică înțelegerea ta privind integritatea tranzacțională și gestionarea excepțiilor.

Exemplu de răspuns: eu folosesc BEGIN TRANSACTION, COMMIT și ROLLBACK declarații pentru a asigura consecvența datelor. De asemenea, includ TRY...CATCH blocuri pentru a gestiona erorile cu eleganță. De exemplu:

BEGIN TRY
  BEGIN TRANSACTION
    -- SQL operations here
  COMMIT TRANSACTION
END TRY
BEGIN CATCH
  ROLLBACK TRANSACTION
  PRINT ERROR_MESSAGE()
END CATCH

Această abordare previne actualizările parțiale ale datelor atunci când apar erori.


8) Cum se utilizează funcțiile de tip window în T-SQL și puteți da un exemplu?

Așteptat de la candidat: Intervievatorul dorește să vă evalueze competența în utilizarea întrebărilor analitice avansate.

Exemplu de răspuns: Funcțiile de tip fereastră permit calcule pe seturi de rânduri legate de rândul curent fără a restrânge datele. De exemplu:

SELECT 
  EmployeeID, 
  Salary,
  RANK() OVER (ORDER BY Salary DESC) AS SalaryRank
FROM Employees;

Aceasta metodă atribuie angajaților ierarhii în funcție de salariu, facilitând analiza tendințelor de performanță.


9) Povestește-mi despre un proiect T-SQL complex la care ai lucrat și cum ai abordat provocările sale.

Așteptat de la candidat: Intervievatorul caută experiență vastă, capacitate de rezolvare a problemelor și spirit de echipă.

Exemplu de răspuns: În ultimul meu rol, am construit o conductă ETL pentru un depozit de date folosind proceduri stocate T-SQL. Provocarea a fost gestionarea eficientă a volumelor mari de date. Am optimizat interogările cu tabele partiționate, încărcări incrementale și procesare în loturi. De asemenea, m-am coordonat cu echipa BI pentru a asigura designuri de scheme consecvente și a îmbunătățit viteza de raportare cu peste 40%.


10) Cum ați gestiona o situație în care o procedură stocată pe care ați scris-o ar cauza un blocaj în producție?

Așteptat de la candidat: Intervievatorul îți testează abilitățile de gestionare a crizelor și cunoștințele tehnice.

Exemplu de răspuns: Aș identifica mai întâi blocajul folosind SQL Server sys.dm_tran_locks și grafice de blocaje. Apoi, analizam ordinea de acces la resurse și refactorizam procedura pentru a obține blocări într-o secvență consistentă. În jobul meu anterior, am implementat și o logică de reîncercare pentru tranzacțiile afectate și am programat monitorizare regulată pentru a detecta din timp modele similare.

Rezumați această postare cu: