50 nejčastějších otázek a odpovědí na pohovor T-SQL (2026)

Příprava na pohovor v T-SQL? Je čas prohloubit si znalosti o tom, jak databáze skutečně fungují pod povrchem. S Otázky na pohovor o T-SQLNáboráři hodnotí nejen znalost syntaxe, ale i vaši znalost manipulace s daty, optimalizace a logického strukturování.
Příležitosti v této oblasti se neustále rozšiřují, protože firmy jsou závislé na poznatcích založených na datech. Vynikají kandidáti se silnými technickými znalostmi, analytickými dovednostmi a schopnostmi řešit problémy v reálném světě – ať už se jedná o absolventy, nebo profesionály s 5 až 10 lety zkušeností. Pochopení otázek a odpovědí na základní i pokročilé úrovni pomáhá vedoucím týmů, manažerům a technickým seniorům identifikovat silné SQL dovednosti a základní zkušenosti.
Náš průvodce čerpá z poznatků více než 65 náborových manažerů, více než 40 seniorních vývojářů a datových profesionálů napříč odvětvími a zajišťuje pokrytí od základní logiky SQL až po pokročilé optimalizační techniky, kterým důvěřují techničtí lídři po celém světě. Přečtěte si více ...
👉 Stažení PDF zdarma: Otázky a odpovědi k pohovoru o T-SQL
Nejčastější otázky a odpovědi na pohovoru o T-SQL
1) Co je T-SQL a jak se liší od standardního SQL?
Transact-SQL (T-SQL) je Microsoftproprietární rozšíření jazyka SQL, používané primárně s Microsoft SQL ServerVylepšuje standardní SQL zavedením procedurálních programovacích funkcí, jako jsou proměnné, podmínky, smyčky, ošetření chyb a vestavěné funkce. Zatímco standardní SQL se zaměřuje na manipulaci s daty (SELECT, INSERT, UPDATE, DELETE), T-SQL podporuje příkazy pro řízení toku (IF…ELSE, WHILE), ošetření transakcí a systémové funkce, které vývojářům umožňují psát složité skripty.
| Vzhled | SQL | T-SQL |
|---|---|---|
| Vlastnictví | Norma ANSI/ISO | Microsoft |
| Procedurální logika | Omezený | Podporované (proměnné, smyčky) |
| Vypořádání se s chybou | Minimální | Podporováno TRY…CATCH |
| Primární použití | Generické databáze | SQL Server |
Příklad:
DECLARE @count INT = 5;
WHILE @count > 0
BEGIN
PRINT @count;
SET @count -= 1;
END;
2) Vysvětlete různé typy spojení v T-SQL na příkladech.
Metody join v T-SQL kombinují řádky ze dvou nebo více tabulek na základě souvisejících sloupců. Pochopení jejich typů je klíčové pro relační datové dotazy.
| Typ připojení | Description | Příklad syntaxe |
|---|---|---|
| INNER JOIN | Vrací pouze odpovídající řádky | SELECT * FROM A INNER JOIN B ON A.id = B.id; |
| LEVÉ SPOJENÍ | Vše zleva + shody zprava | SELECT * FROM A LEFT JOIN B ON A.id = B.id; |
| SPRÁVNÉ PŘIPOJENÍ SE | Vše zprava + shody zleva | SELECT * FROM A RIGHT JOIN B ON A.id = B.id; |
| PLNÉ PŘIPOJENÍ | Kombinuje LEVÉ + PRAVÉ | SELECT * FROM A FULL JOIN B ON A.id = B.id; |
| KRÍŽNÍ PŘIPOJENÍ | kartézský součin | SELECT * FROM A CROSS JOIN B; |
Praktický příklad: spojování Orders a Customers zjistit, kteří zákazníci zadali objednávky pomocí INNER JOIN.
3) Co jsou společné tabulkové výrazy (CTE) a jaké jsou jejich výhody?
Společný tabulkový výraz (CTE) poskytuje dočasnou pojmenovanou sadu výsledků, na kterou se lze odkazovat v rámci SELECT, INSERT, UPDATEnebo DELETE příkaz. Zlepšuje čitelnost a zjednodušuje rekurzivní dotazy.
Výhody:
- Zlepšuje srozumitelnost a údržbu dotazů.
- Umožňuje rekurzi (pro hierarchická data, jako jsou organizační diagramy).
- Pomáhá vyhnout se opakovaným poddotazům.
- Zvyšuje modularitu ve velkých skriptech.
Příklad:
WITH EmployeeCTE AS (
SELECT EmpID, EmpName, ManagerID
FROM Employees
)
SELECT * FROM EmployeeCTE WHERE ManagerID IS NULL;
4) Jak se liší dočasné tabulky a tabulkové proměnné v T-SQL?
Oba se používají k ukládání mezivýsledků, ale jejich chování a rozsah se výrazně liší.
| vlastnost | Dočasná tabulka (#Temp) |
Tabulková proměnná (@TableVar) |
|---|---|---|
| Uloženo v | TempDB | Paměť (s omezeným využitím TempDB) |
| Transakční rozsah | Sleduje transakce | Nezávisle na transakcích |
| Indexy | Podporované | Omezený |
| Výkon | Lepší pro velké datové sady | Lepší pro malé datové sady |
Příklad:
DECLARE @TableVar TABLE (ID INT, Name NVARCHAR(50)); INSERT INTO @TableVar VALUES (1, 'Alice');
Při práci s velkými datovými sadami nebo při požadavku na indexy používejte dočasné tabulky.
5) Vysvětlete koncept transakcí v T-SQL a jejich životní cyklus.
Transakce v T-SQL zajišťuje, že sekvence operací se provede jako jedna logická jednotka. Životní cyklus zahrnuje ZAČNĚTE TRANSAKCI, SPÁCHAT, a NÁVRAT.
| Fáze | Description |
|---|---|
| ZAČNĚTE TRANSAKCI | Zahájí transakci |
| ZÁVĚREČNÁ TRANSAKCE | Uloží všechny změny trvale |
| TRANSAKCE VRÁCENÍ ZPĚT | Vrátí zpět všechny operace od posledního BEGIN |
Příklad:
BEGIN TRANSACTION; UPDATE Accounts SET Balance = Balance - 100 WHERE AccID = 1; UPDATE Accounts SET Balance = Balance + 100 WHERE AccID = 2; COMMIT TRANSACTION;
Pokud se v polovině vyskytne chyba, ROLLBACK zachovává integritu dat.
6) Jaký je rozdíl mezi příkazy DELETE, TRUNCATE a DROP?
| Příkaz | funkce | Rollback | Ovlivňuje strukturu | Rychlost |
|---|---|---|---|---|
| DELETE | Odstraní konkrétní řádky | Ano | Ne | Pomaleji |
| Zkrátit | Odstraní všechny řádky | Ne (obvykle) | Ne | rychlý |
| DROP | Smaže celou tabulku | Ne | Ano | nejrychlejší |
Příklad:
DELETE FROM Employees WHERE Department = 'HR'; TRUNCATE TABLE TempData; DROP TABLE OldLogs;
Použijte DELETE pro selektivní odstranění, TRUNCATE pro vyúčtování a DROP aby se stůl úplně odstranil.
7) Jak funguje ošetřování chyb v T-SQL?
T-SQL poskytuje strukturované zpracování chyb prostřednictvím TRY...CATCH blok, což vývojářům umožňuje elegantně spravovat chyby za běhu.
Příklad:
BEGIN TRY
INSERT INTO Employees VALUES (1, 'John');
END TRY
BEGIN CATCH
PRINT 'Error: ' + ERROR_MESSAGE();
END CATCH;
Tento přístup izoluje chybnou operaci a zabraňuje transakci v narušení integrity dat. Vývojáři mají také přístup k systémovým funkcím, jako je ERROR_NUMBER() or ERROR_SEVERITY() pro diagnostiku.
8) Jaké jsou různé způsoby optimalizace výkonu dotazů T-SQL?
Optimalizace zahrnuje jemné doladění návrhu SQL, indexování a strategií provádění.
Klíčové techniky:
- Použijte správné indexování na často dotazovaných sloupcích.
- Vyhnout se
SELECT *— explicitně specifikujte sloupce. - Použijte operace založené na množinách místo kurzorů.
- Analyzujte plány provedení pomocí SQL Server Management Studio.
- Použijte Efektivní spojení za správných podmínek ZAPNUTO.
- Snížit vnořené poddotazy; preferujte CTE nebo dočasné tabulky.
Ladění výkonu v T-SQL zahrnuje také sledování statistik provádění dotazů pomocí SET STATISTICS IO ON.
9) Co jsou okenní funkce a kdy byste je měli používat?
Funkce okna provádějí výpočty napříč sadou řádků souvisejících s aktuálním řádkem, aniž by je sbalily do jednoho výsledku. Jsou užitečné pro řazení, průběžné součty a klouzavé průměry.
Příklad:
SELECT
EmployeeID,
Salary,
RANK() OVER (ORDER BY Salary DESC) AS RankBySalary
FROM Employees;
Mezi běžné funkce patří RANK(), ROW_NUMBER(), DENSE_RANK(), a SUM() OVER().
Ty jsou klíčové pro analytické úlohy, kde potřebujete agregovaná data i data na úrovni řádků.
10) Vysvětlete rozdíl mezi klastrovanými a neklastrovanými indexy.
| vlastnost | Clustered Index | NeClustered Index |
|---|---|---|
| Data Storage | Fyzicky přeskupí tabulku | Samostatná struktura |
| Počet na stůl | Jedna | Násobek |
| Výkon | Rychlejší pro dotazy rozsahu | Rychlejší pro konkrétní vyhledávání |
| Příklad použití | Primární klíč | Sekundární vyhledávání |
Příklad:
CREATE CLUSTERED INDEX IX_EmployeeID ON Employees(EmployeeID); CREATE NONCLUSTERED INDEX IX_Dept ON Employees(Department);
Výběr správného typu indexu přímo ovlivňuje rychlost provádění dotazů a efektivitu úložiště.
11) Co jsou uložené procedury v T-SQL a k čemu se používají?
Uložená procedura je předkompilovaná kolekce jednoho nebo více příkazů SQL uložených na serveru. Zvyšuje výkon, zabezpečení a opětovnou použitelnost tím, že umožňuje zapouzdřit logiku a opakovaně ji spustit bez nutnosti rekompilace. Uložené procedury snižují síťový provoz a podporují parametry pro dynamické spouštění.
Příklad:
CREATE PROCEDURE GetEmployeeDetails @Dept NVARCHAR(50)
AS
BEGIN
SELECT EmpName, Position FROM Employees WHERE Department = @Dept;
END;
Výhody:
- Lepší výkon díky předkompilaci.
- Zlepšené zabezpečení díky kontrolovanému provádění.
- Snadnější údržba a modularizace kódu.
12) Vysvětlete rozdíl mezi uloženou procedurou a funkcí v T-SQL.
| Vzhled | Uložené procedury | funkce |
|---|---|---|
| Typ vrácení | Může vracet více hodnot | Musí vrátit jednu hodnotu nebo tabulku |
| Použít ve SELECT | Není povoleno | Povoleno |
| Vypořádání se s chybou | Podporováno TRY…CATCH | Omezený |
| Provedení | Provedeno prostřednictvím EXEC |
Používá se inline s SQL |
| Řízení transakcí | Podporované | Není podporováno |
Příklad:
- Postup:
EXEC GetEmployeeDetails 'HR'; - Funkce:
SELECT dbo.GetSalary(101);
Funkce jsou ideální pro výpočty; procedury jsou lepší pro obchodní logiku a manipulaci s daty.
13) Co je to trigger v T-SQL a jaké jsou jeho typy?
Trigger je speciální uložená procedura, která se automaticky spouští v reakci na určité události (INSERT, UPDATE, DELETE) v tabulce nebo pohledu. Triggery se používají k vynucování obchodních pravidel, auditování změn nebo udržování referenční integrity.
| Typ | Description |
|---|---|
| PO spouštění | Spustí se po dokončení události |
| MÍSTO Spouště | Provede se místo spouštěcí události |
Příklad:
CREATE TRIGGER trgAfterInsert
ON Employees
AFTER INSERT
AS
BEGIN
PRINT 'New employee record added!';
END;
Vyhněte se nadužívání triggerů – mohou ovlivnit výkon a zkomplikovat ladění.
14) Jak se v T-SQL zpracovávají hodnoty NULL?
Hodnota NULL představuje chybějící nebo neznámá data. T-SQL nabízí několik funkcí pro efektivní zpracování těchto dat:
ISNULL(expression, replacement)→ nahradí NULL výchozí hodnotou.COALESCE(expression1, expression2, ...)→ vrací první hodnotu, která není NULL.NULLIF(expression1, expression2)→ vrací NULL, pokud jsou výrazy stejné.
Příklad:
SELECT ISNULL(Manager, 'No Manager') AS ManagerName FROM Employees;
Nejlepší postup: Vždy zohledněte hodnoty NULL ve spojeních a podmínkách, abyste předešli neočekávaným výsledkům.
15) Co jsou kurzory v T-SQL a kdy je třeba se jim vyhnout?
Kurzor umožňuje zpracování výsledků dotazu řádek po řádku – což je užitečné pro složitou logiku, kde operace založené na množinách nejsou dostatečné. Kurzory jsou však… zpomalit a náročné na zdroje ve srovnání s alternativami založenými na sadách.
Příklad:
DECLARE emp_cursor CURSOR FOR SELECT EmpName FROM Employees; OPEN emp_cursor; FETCH NEXT FROM emp_cursor; -- process CLOSE emp_cursor; DEALLOCATE emp_cursor;
Nevýhody:
- Zvýšené využití paměti.
- Špatná škálovatelnost.
- Snížený výkon.
alternativa: Kdykoli je to možné, používejte spojení tabulek, poddotazy nebo okenní funkce.
16) Vysvětlete příkaz MERGE a jeho případy použití.
Jedno MERGE prohlášení provádí INSERT, UPDATE, a DELETE operace v jednom příkazu – ideální pro synchronizaci dvou tabulek.
Příklad syntaxe:
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;
Případy užití:
- Datové sklady (synchronizace stagingových a cílových tabulek).
- Inkrementální načítání dat.
- Údržba auditních nebo dimenzních tabulek.
17) Jaké jsou různé typy uživatelsky definovaných funkcí (UDF) v T-SQL?
| Typ | Description | Příklad |
|---|---|---|
| Skalární | Vrací jednu hodnotu | CREATE FUNCTION GetTax(@Salary DECIMAL) RETURNS DECIMAL |
| Vložené tabulkové hodnoty | Vrátí tabulku pomocí jediného SELECT |
RETURN SELECT * FROM Employees WHERE Dept = 'HR' |
| Vícevýkazové tabulkové hodnoty | Vrátí tabulku po více příkazech | Užitečné pro složitou logiku |
Funkce podporují opětovné použití kódu a vylepšují modulární návrh dotazů.
Měly by být deterministické (vracet stejný výsledek pro stejný vstup), kdykoli je to možné, z důvodu optimalizace výkonu.
18) Co je normalizace a jaké jsou její výhody a nevýhody?
Normalizace je proces organizace dat v databázi za účelem minimalizace redundance a zlepšení integrity. Zahrnuje rozdělení tabulek na menší, související entity.
| Normální forma | Pravidlo | Příklad |
|---|---|---|
| 1NF | Eliminujte opakující se skupiny | Rozdělení dat oddělených čárkami |
| 2NF | Odebrat částečné závislosti | Zajistěte plnou závislost na primárním klíči |
| 3NF | Odstranění tranzitivních závislostí | Přesunout odvozené atributy |
Výhody:
- Snižuje redundanci.
- Zajišťuje konzistenci dat.
- Zjednodušuje údržbu.
Nevýhody:
- Komplexní spojení.
- Potenciální kompromisy ve výkonu analytických dotazů.
19) Jaké jsou různé typy omezení v T-SQL?
Omezení vynucují pravidla pro integritu dat v tabulce.
| Omezení | Účel | Příklad |
|---|---|---|
| ZÁKLADNÍ KLÍČ | Jednoznačně identifikuje každý řádek | PRIMARY KEY (EmpID) |
| ZAHRANIČNÍ KLÍČ | Propojuje dvě tabulky | FOREIGN KEY (DeptID) |
| UNIKÁTNÍ | Zajišťuje jedinečné hodnoty sloupců | UNIQUE (Email) |
| KONTROLA | Ověřuje rozsah dat | CHECK (Age >= 18) |
| DEFAULT | Poskytuje výchozí hodnoty | DEFAULT GETDATE() |
Omezení zajišťují přesnost a spolehlivost, čímž snižují potřebu rozsáhlého ověřování na úrovni aplikace.
20) Jak se spravují oprávnění a zabezpečení v T-SQL?
T-SQL spravuje zabezpečení databáze prostřednictvím přihlašovací údaje, uživatelé, role a oprávnění.
Oprávnění lze udělovat nebo odebírat na úrovni objektů nebo schémat.
Příklad:
CREATE LOGIN John WITH PASSWORD = 'Strong@123'; CREATE USER John FOR LOGIN John; GRANT SELECT, INSERT ON Employees TO John;
Osvědčené postupy:
- Použijte role místo přímých uživatelských oprávnění.
- Nepoužívejte
sanebo systémové účty pro aplikace. - Pravidelně auditujte oprávnění pomocí
sys.database_permissions.
Správná správa oprávnění zajišťuje princip nejnižších oprávnění a dodržování bezpečnostních zásad.
21) Jaké jsou různé úrovně izolace transakcí v T-SQL?
Úrovně izolace transakcí určují, jak je jedna transakce izolována od ostatních – vyvažování konzistence s souběžnostSQL Server podporuje následující:
| Úroveň izolace | Description | Špinavé čtení | Neopakovatelné čtení | Fantomové čtení |
|---|---|---|---|---|
| PŘEČTĚTE SI NENÍ DOPORUČENO | Čte nepotvrzená data | Ano | Ano | Ano |
| PŘEČTĚTE SI POVINNÉ | Výchozí; zámky zabraňují nečistému čtení | Ne | Ano | Ano |
| OPAKOVATELNÉ ČTĚNÍ | Zabraňuje změně dat až do potvrzení (commit) | Ne | Ne | Ano |
| SERIALIZAČNÍ | Plná izolace; nejvyšší stupeň uzamčení | Ne | Ne | Ne |
| MOMENTKA | Používá verzování, ne zamykání | Ne | Ne | Ne |
Příklad:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; BEGIN TRANSACTION; -- your code COMMIT;
Použijte MOMENTKA pro systémy s vysokou souběžností, aby se minimalizovalo blokování bez obětování konzistence.
22) Co je to deadlock v SQL Serveru a jak mu lze předejít?
A zablokování K tomu dochází, když dvě transakce drží zámky, které si ta druhá potřebuje, což vede k patové situaci. SQL Server automaticky detekuje a ukončí jednu transakci jako oběť zablokování.
Příklad scénáře:
- Transakce A uzamkne Tabulku1 a poté čeká na Tabulku2.
- Transakce B uzamkne Tabulku2 a poté čeká na Tabulku1.
Preventivní techniky:
- Přístup k zdrojům ve stejném pořadí.
- Udržujte transakce krátké.
- Používejte vhodné úrovně izolace.
- Vyhněte se interakci s uživatelem uvnitř transakcí.
Use SQL Profiler or Extended Events to trace deadlocks in real time.
23) Vysvětlete rozdíl mezi pesimistickým a optimistickým řízením souběžnosti.
| Typ | Description | Uzamykací mechanismus | Použijte pouzdro |
|---|---|---|---|
| Pesimistický | Uzamkne data během transakce | Silné zamykání | Prostředí s vysokou mírou konfliktu |
| Optimistický | Používá verzování řádků, kontroluje před potvrzením (commitem) | Minimální zamykání | Úlohy s vysokým obsahem čtení a nízkými konflikty |
Příklad:
- Pesimistický: Výchozí
READ COMMITTEDzamykání. - Optimistický:
SNAPSHOTizolace s verzováním řádků.
Optimistická souběžnost zvyšuje výkon systémů s velkým objemem operací čtení a častými aktualizacemi.
24) Jak lze analyzovat a optimalizovat pomalu běžící T-SQL dotaz?
- Zkontrolujte plán provedení: Identifikujte skeny, chybějící indexy a nákladné operace.
- Použijte SET STATISTICS IO/TIME: Analyzujte využití I/O a CPU.
- Vyhněte se kurzorům a smyčkám: Nahraďte operacemi založenými na množinách.
- Optimalizace indexu: Přidejte nebo reorganizujte fragmentované indexy.
- Čmuchání parametrů: Použijte
OPTION (RECOMPILE)k vytvoření nových plánů.
Příklad:
SET STATISTICS TIME ON; SELECT * FROM Orders WHERE CustomerID = 123;
Pravidelné sledování pomalých dotazů pomocí Dynamické pohledy pro správu (DMV) jako sys.dm_exec_query_stats je osvědčený postup.
25) Co je dynamické SQL a jaké jsou jeho výhody a rizika?
Dynamické SQL umožňuje dynamicky sestavovat SQL příkazy za běhu pomocí proměnných.
Příklad:
DECLARE @sql NVARCHAR(MAX); SET @sql = 'SELECT * FROM Employees WHERE Dept = ''' + @Dept + ''''; EXEC(@sql);
Výhody:
- Flexibilita pro názvy tabulek proměnných nebo filtry.
- Znovupoužitelné pro více schémat.
Nevýhody:
- Zranitelný vůči SQL Injection pokud není parametrizováno.
- Obtížnější ladění a údržba.
Vždy používejte sp_executesql s parametry pro bezpečnost.
26) Co jsou dočasné objekty v T-SQL a jak se liší?
Dočasné objekty jsou uloženy v TempDB a pomáhají spravovat mezilehlá data.
| Typ objektu | Rozsah | Příklad |
|---|---|---|
| Tabulka místních teplot | Specifické pro relaci | CREATE TABLE #TempTable |
| Globální tabulka teplot | Viditelné pro všechny relace | CREATE TABLE ##TempGlobal |
| Tabulková proměnná | Specifické pro šarži | DECLARE @Temp TABLE (...) |
Osvědčené postupy:
- Pro menší datové sady upřednostňujte tabulkové proměnné.
- Pro větší data s potřebou indexování použijte lokální dočasné tabulky.
- Pro rychlejší uvolnění zdrojů explicitně odstraňte dočasné tabulky.
27) Jak se v T-SQL používají funkce pro dělení oken?
Dělení umožňuje použití okenních funkcí na specifické podmnožiny dat.
Příklad:
SELECT
Department,
EmpName,
Salary,
RANK() OVER (PARTITION BY Department ORDER BY Salary DESC) AS RankInDept
FROM Employees;
Výhody:
- Efektivně vypočítává pořadí, součty a průměry pro každou skupinu.
- Eliminuje potřebu samospojení nebo poddotazů.
Případy užití: Platové pásma, žebříčky prodeje a analýzy trendů.
28) Jaký je rozdíl mezi UNION a UNION ALL v T-SQL?
| Doložka | Duplikáty | Výkon | Použijte pouzdro |
|---|---|---|---|
| UNION | Odstraňuje duplikáty | Pomalejší (používá sort/distinct) | Čisté kombinování sad výsledků |
| UNION ALL | Uchovává duplikáty | Rychlejší | Agregace nebo migrace dat |
Příklad:
SELECT City FROM Customers UNION SELECT City FROM Suppliers;
Preferujte UNION ALL kdy jsou duplikáty přijatelné a na výkonu záleží.
29) Jak se pracuje s daty JSON v T-SQL?
SQL Server podporuje nativní funkce JSON pro parsování a generování dat JSON.
Příklad:
DECLARE @json NVARCHAR(MAX) = '{"Name":"John","Age":30}';
SELECT JSON_VALUE(@json, '$.Name') AS Name;
Klíčové funkce:
JSON_VALUE()→ Extracts scalar values.JSON_QUERY()→ Extracts objects/arrays.OPENJSON()→ Analyzuje JSON do řádků.FOR JSON→ Převádí výsledky dotazu do formátu JSON.
Užitečné pro API, hybridní systémy a NoSQL integrace.
30) Jak lze spravovat a optimalizovat dočasnou databázi (TempDB) v SQL Serveru?
TempDB je systémová databáze kritická pro dočasné ukládání a správu verzí. Špatná správa může způsobit vážné problémy s výkonem.
Optimalizační techniky:
- Umístěte TempDB na rychlé úložiště (SSD).
- Předběžná úprava velikosti dat a souborů protokolů.
- Používejte více datových souborů (1 na jádro CPU, maximálně 8).
- Sledujte pomocí
sys.dm_db_file_space_usage. - Pravidelně uklízejte dočasné předměty.
Příklad dotazu:
SELECT * FROM sys.dm_db_file_space_usage;
Proaktivní správa dočasné databáze (TempDB) zabraňuje konfliktům na alokačních stránkách a zlepšuje celkovou propustnost databáze.
31) Co jsou to nápovědy k dotazům v T-SQL a kdy by se měly používat?
Tipy pro dotazy instruují optimalizátor SQL Serveru, aby změnil svůj běžný plán provádění.
Měly by se používat střídmě – pouze pokud plně rozumíte kontextu distribuce dat a jejich provádění.
Příklad:
SELECT * FROM Orders WITH (NOLOCK) WHERE CustomerID = 102;
Běžné tipy:
NOLOCK:Čte bez zámků (může číst nepotvrzená data).FORCESEEK:Vynutí vyhledávání indexu místo skenování.OPTIMIZE FOR:Určuje hodnoty parametrů pro generování plánu.RECOMPILE:Vynutí rekompilaci pro každé spuštění.
Upozornění: Nadměrné používání nápověd může snižovat výkon s rostoucím objemem dat nebo změnou vzorců. Používejte je pouze tehdy, když je plán optimalizátoru prokazatelně neefektivní.
32) Vysvětlete koncept ukládání plánu provádění do mezipaměti v SQL Serveru.
SQL Server ukládá plány spuštění do mezipaměti, aby se zabránilo opětovné kompilaci opakujících se dotazů.
Když se stejný dotaz znovu spustí se stejnou strukturou, znovu použije plán uložený v mezipaměti, což zlepšuje výkon.
Příklad:
EXEC GetCustomerOrders @CustomerID = 101;
Výhody:
- Snižuje zatížení CPU.
- Zlepšuje konzistenci doby odezvy.
Problémy:
- Čmuchání parametrů může vést k neefektivním plánům.
- Nafouknutí mezipaměti plánu může spotřebovávat paměť.
Zmírnění: Použijte OPTION (RECOMPILE) or OPTIMIZE FOR UNKNOWN kde se parametry značně liší.
33) Co je to sniffing parametrů a jak může ovlivnit výkon?
K „sniffingu“ parametrů dochází, když SQL Server použije hodnoty parametrů z prvního spuštění dotazu k vygenerování plánu, který se poté znovu použije – i když je pro pozdější spuštění neoptimální.
Příklad scénáře:
- První spuštění: malá datová sada → plán vyhledávání indexu.
- Další spuštění: velká datová sada → stejný plán znovu použit, ale pomalý.
Řešení:
- Použijte
OPTION (RECOMPILE)k vytvoření nových plánů. - Použijte lokální proměnné k maskování hodnot parametrů.
- Použijte
OPTIMIZE FORorOPTIMIZE FOR UNKNOWN.
Čmuchání parametrů je jedním z hlavních reálných viníků nepředvídatelného výkonu v T-SQL.
34) Jak monitorujete a analyzujete výkon dotazů v SQL Serveru?
K profilování a ladění výkonu můžete použít několik nástrojů a DMV:
- Prováděcí plány:
Ctrl + Mv SSMS nebosys.dm_exec_query_plan. - DMV:
sys.dm_exec_query_stats– CPU a doba trvání.sys.dm_exec_sql_text– SQL text.sys.dm_exec_requests– Aktivní dotazy.
- Sledování výkonu a rozšířené události dlouhodobě trackrál.
Příklad:
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) Vysvětlete roli statistik v optimalizaci dotazů.
Statistiky popisují rozložení dat (např. odlišné hodnoty, hustotu, histogram), které optimalizátor používá k odhadu mohutnosti.
Pokud jsou statistiky zastaralé, SQL Server může zvolit špatné plány.
Klíčové příkazy:
UPDATE STATISTICS Employees;sp_updatestats;- Nastavení automatických aktualizací: ve výchozím nastavení povoleno.
Osvědčené postupy:
- Udržet
AUTO_UPDATE_STATISTICSpovoleno. - U velkých tabulek naplánujte ruční aktualizace.
- Použijte
FULLSCANpro kritické indexy.
Zastaralé statistiky jsou tichým zabijákem výkonu.
36) Jaký je rozdíl mezi vyhledáváním indexu a skenováním indexu?
| Operavání | Description | Výkon | Použijte pouzdro |
|---|---|---|---|
| Vyhledávání v indexu | Přejde přímo na odpovídající řádky | rychlý | Vysoce selektivní dotazy |
| Indexové skenování | Postupně čte všechny položky indexu | Pomaleji | Dotazy s nízkou selektivitou |
Příklad:
SELECT * FROM Orders WHERE OrderID = 123; -- Seek SELECT * FROM Orders WHERE Status = 'Active'; -- May Scan
Tip pro optimalizaci: Vytvořte filtrované nebo krycí indexy, abyste proměnili prohledávání ve vyhledávání.
37) Vysvětlete dělené tabulky a jejich výhody.
Rozdělení rozděluje velkou tabulku na menší, lépe spravovatelné části (oddíly), často na základě sloupce rozsahu (například data).
Výhody:
- Rychlejší správa dat (načítání/uvolňování podle oddílu).
- Vylepšený výkon dotazů na velkých datových sadách.
- Paralelní zpracování pro rozdělené skenování.
Příklad:
CREATE PARTITION FUNCTION pfRange (DATETIME)
AS RANGE LEFT FOR VALUES ('2022-12-31', '2023-12-31');
Případ použití: Datové sklady zpracovávající miliardy řádků, kde lze efektivně archivovat staré oddíly.
38) Co jsou rekurzivní CTE a jaká mají omezení?
A rekurzivní společný tabulkový výraz (CTE) odkazuje sám na sebe, obvykle v případě hierarchických dat, jako jsou organizační diagramy nebo stromové struktury.
Příklad:
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;
Omezení:
- Výchozí limit rekurze = 100 úrovní.
- Může způsobit problémy s výkonem, pokud je hloubka rekurze vysoká.
- Použijte
OPTION (MAXRECURSION n)pro úpravu limitu.
39) Jak SQL Server interně zpracovává chyby v transakcích?
Když dojde k chybě v rámci transakce:
- Jestli je to závažné (úroveň > 20), spojení se okamžitě ukončí.
- If nezávažné, dá se to chytit s
TRY...CATCH.
Příklad:
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;
Nejlepší praxe: Pro odolnost vůči chybám vždy zabalte DML do TRY…CATCH.
40) Jaké jsou některé pokročilé techniky ladění výkonu T-SQL?
- Vyhněte se skalárním UDF v SELECTu — inline funkce jsou rychlejší.
- Použít filtrované indexy zmenšit velikost indexu.
- Využijte OLTP v paměti (Hekaton) pro systémy s vysokou souběžností.
- Dávkové provádění na indexech columnstore pro analytické účely.
- Eliminujte implicitní konverze porovnáváním datových typů.
- Použít úložiště dotazů porovnat historické plány.
Příklad pro detekci implicitních konverzí:
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%';
Ladění výkonu je průběžný proces – nikoli jednorázová událost.
41) Jak byste identifikovali dotazy v SQL Serveru, které jsou nejnáročnější na zdroje?
Dotazy s vysokou cenou můžete identifikovat pomocí dynamických zobrazení správy (DMV), která zaznamenávají historické statistiky provádění.
Příklad:
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;
Klíčové metriky:
AvgCPUPrůměrný čas CPU na spuštění.AvgReadsIntenzita I/O operací.AvgDurationLatence provádění.
Tento přístup pomáhá správcům databází izolovat těžké dotazy dříve, než si uživatelé vůbec všimnou snížení výkonu.
42) Jak lze detekovat a opravit chybějící indexy v SQL Serveru?
SQL Server automatically tracks missing index recommendations through DMVs.
Příklad:
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;
Osvědčené postupy:
- Nejprve upřednostňujte indexy s vysokým vyhledáváním.
- Před vytvořením ověřte pomocí plánů provedení.
- Vyhněte se nadměrnému indexování – zpomaluje to zápisy.
43) What is the difference between database mirroring, replication, and log shipping?
| vlastnost | Účel | Real-time | Failover | Komplexita |
|---|---|---|---|---|
| Zrcadlení | Vysoce dostupná kopie databáze | Ano | Automatický | Střední |
| replikace | Distribuce dat mezi databázemi | Částečný | Manuál | Vysoký |
| Log Shipping | Strategie DR založená na zálohování | Ne | Manuál | Nízké |
Návod k použití:
- Zrcadlení → OLTP systémy s vysokou dostupností.
- Replikace → Distribuované reportování.
- Log Shipping → Disaster recovery setups.
44) Jak řešíte problémy s blokováním v SQL Serveru?
K blokování dochází, když jeden proces drží zámky, které potřebuje jiný proces.
Identifikace blokátorů:
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;
Řešení:
- Zkraťte délku transakce.
- Použijte izolaci snímků.
- Vylaďte dotazy, abyste minimalizovali zamykání.
- Identifikujte dlouhodobě probíhající otevřené transakce pomocí
DBCC OPENTRAN.
45) Jak pomáhá úložiště dotazů SQL Serveru s laděním výkonu?
Úložiště dotazů zachycuje text dotazu, plány a statistiky běhového prostředí – což umožňuje regresní analýza plánu.
Pomáhá identifikovat, kdy se dotaz náhle zpomalí kvůli změnám plánu.
Příklad:
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;
Výhody:
- Porovnejte historické plány.
- Vynuťte si dobré plány.
- Track performance trends over time.
46) Jak lze zabránit SQL injection v T-SQL aplikacích?
Primární obrana:
- Použijte parametrizované dotazy přes
sp_executesql. - Ověřte a dezinfikujte všechny uživatelské vstupy.
- Vyhněte se dynamickému zřetězení SQL.
- Zaměstnat princip nejmenších privilegií pro databázové účty.
Bezpečný příklad:
DECLARE @sql NVARCHAR(MAX); SET @sql = N'SELECT * FROM Employees WHERE Dept = @Dept'; EXEC sp_executesql @sql, N'@Dept NVARCHAR(50)', @Dept = 'HR';
I když je SQL injection na úrovni aplikace, DBA musí auditovat uložené procedury a protokoly. pro neparametrizované provedení.
47) Jak používáte rozšířené události pro hloubkové monitorování výkonu?
Extended Events (XEvents) is a lightweight performance monitoring framework — a modern alternative to SQL Trace.
Příklad:
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;
Případy užití:
- Monitorování dotazů s vysokou zátěží CPU.
- Zachycení zablokování nebo chybějících indexů.
- Profilování dlouhodobých příkazů v produkčním prostředí s minimálními režijními náklady.
48) Co jsou filtrované indexy a kdy by se měly používat?
Filtrovaný index indexuje pouze podmnožinu řádků, které splňují podmínku filtru – což zlepšuje výkon a snižuje úložný prostor.
Příklad:
CREATE INDEX IX_ActiveEmployees ON Employees (Department) WHERE Status = 'Active';
Výhody:
- Menší velikost indexu.
- Rychlejší údržba.
- Optimalizováno pro selektivní dotazy.
Nejlepší pro: Sloupce s nerovnoměrným rozdělením dat (např. aktivní vs. neaktivní záznamy).
49) Jak bezpečně migrovat data mezi prostředími SQL Serveru?
Bezpečná migrace dat zahrnuje plánování konzistence, prostoje a vrácení zpět.
Osvědčené postupy:
- Použijte transakční replikace or sběr změn dat (CDC) pro živou synchronizaci.
- Dočasně deaktivujte omezení a spouštěče.
- Použijte BCP or SSIS pro hromadný přenos dat.
- Ověřte počet řádků a kontrolní součty.
- Vždy spouštět kontroly integrity po migraci (
DBCC CHECKDB).
Příklad:
bcp Database.dbo.Table out TableData.dat -n -S Server -T
Testování migračních skriptů ve stagingovém prostředí je nedílnou součástí.
50) Jak identifikujete a opravíte problémy s parametricky citlivými dotazy (PSQ)?
Dotazy citlivé na parametry fungují nekonzistentně na základě hodnot parametrů – což je častý problém v reálném světě.
Detekce: Použijte Dotazový obchod or sys.dm_exec_query_stats identifikovat více plánů pro jeden dotaz.
Strategie opravy:
- Použijte MOŽNOST (REKOMPILOVAT) pro každou popravu.
- Použijte OPTIMALIZUJTE PRO NEZNÁMÉ vytvořit obecný plán.
- Vytvořit plánovací průvodci vynucovat optimální cesty provádění.
- Použijte nápovědy k dotazům pouze v případě potřeby.
Problémy citlivé na parametry vyžadují vyvážení stability plánu a předvídatelnosti výkonu.
🔍 Nejčastější otázky na pohovoru o T-SQL s reálnými scénáři a strategickými odpověďmi
1) Jaký je rozdíl mezi INNER JOIN a LEFT JOIN v T-SQL?
Očekává se od kandidáta: Tazatel chce posoudit vaše znalosti operací spojení a toho, jak se spravují datové vztahy v dotazech SQL.
Příklad odpovědi: An INNER JOIN vrací pouze řádky, které mají v obou tabulkách shodné hodnoty, zatímco a LEFT JOIN Vrací všechny řádky z levé tabulky spolu s odpovídajícími řádky z pravé tabulky. Pokud nedojde k žádné shodě, vrátí se pro sloupce z pravé tabulky hodnoty NULL. Toto rozlišení je klíčové při práci s částečnými nebo volitelnými vztahy v databázích.
2) Jak byste v T-SQL identifikovali a odstranili duplicitní záznamy z tabulky?
Očekává se od kandidáta: Tazatel chce vidět vaši schopnost používat okenní funkce a CTE k řešení problémů s kvalitou dat.
Příklad odpovědi: Použil bych Common Table Expression (CTE) v kombinaci s ROW_NUMBER() funkce pro identifikaci duplikátů. Například:
WITH CTE AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY column1, column2 ORDER BY id) AS rn FROM MyTable ) DELETE FROM CTE WHERE rn > 1;
Tento přístup pomáhá odstranit duplikáty a zároveň zachovat jeden jedinečný záznam pro každou skupinu.
3) Můžete vysvětlit, co je CTE (Common Table Expression) a kdy byste ho použili?
Očekává se od kandidáta: Tazatel ověřuje vaše znalosti strukturování dotazů a dočasných sad výsledků.
Příklad odpovědi: CTE je dočasná sada výsledků definovaná v rámci rozsahu provádění jednoho dotazu. Je užitečná pro zjednodušení složitých spojení a poddotazů, zlepšení čitelnosti a umožnění rekurzivních dotazů. V mé předchozí roli jsem CTE často používal k rozdělení logiky vícekrokové agregace na lépe udržovatelné komponenty.
4) Jak řešíte ladění výkonu v T-SQL dotazech?
Očekává se od kandidáta: Tazatel chce zhodnotit vaše zkušenosti s optimalizací dotazů a řešením problémů s výkonem.
Příklad odpovědi: Začínám prozkoumáním plánu provádění, abych identifikoval pomalé operace, jako je prohledávání tabulek nebo nákladné spojení. Poté kontroluji chybějící indexy, redundantní poddotazy nebo neefektivní spojení. Také analyzuji statistiky a používám strategie indexování, jako je pokrytí indexů nebo filtrované indexy, pro zlepšení výkonu. Nakonec kontroluji logiku dotazů, abych se ujistil, že využívá operace založené na sadách, spíše než zpracování řádek po řádku.
5) Popište situaci, kdy jste museli ladit pomalu běžící dotaz v produkčním prostředí. Jaké kroky jste podnikli?
Očekává se od kandidáta: Tato behaviorální otázka hodnotí vaše dovednosti v řešení problémů a komunikaci v reálném světě.
Příklad odpovědi: Na předchozí pozici trvalo provedení dotazu na sestavu přes 20 minut. Analyzoval jsem plán provedení a zjistil jsem, že jednomu ze spojení chyběl index ve sloupci cizího klíče. Po vytvoření indexu a aktualizaci statistik se doba běhu dotazu snížila na méně než 30 sekund. Také jsem zdokumentoval opravu a sdílel ji s týmem, aby se v budoucnu předešlo podobným problémům.
6) Co jsou dočasné tabulky a tabulkové proměnné a jak se liší?
Očekává se od kandidáta: Tazatel testuje vaše znalosti možností dočasného ukládání dat v T-SQL.
Příklad odpovědi: Dočasné tabulky (#TempTable) se vytvářejí v databázi tempdb a podporují indexy, omezení a statistiky. Proměnné tabulky (@TableVar) jsou uloženy v paměti a mají omezenou podporu statistik, takže jsou vhodné pro menší datové sady. Dočasné tabulky jsou lepší pro velké nebo složité datové sady, zatímco proměnné tabulky jsou efektivnější pro malá, krátkodobá data.
7) Jak byste řešili ošetřování chyb a transakcí v T-SQL?
Očekává se od kandidáta: Tazatel ověřuje vaše znalosti transakční integrity a zpracování výjimek.
Příklad odpovědi: používám BEGIN TRANSACTION, COMMIT, a ROLLBACK příkazy pro zajištění konzistence dat. Také zahrnujem TRY...CATCH bloky pro elegantní zpracování chyb. Například:
BEGIN TRY
BEGIN TRANSACTION
-- SQL operations here
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
PRINT ERROR_MESSAGE()
END CATCH
Tento přístup zabraňuje částečným aktualizacím dat v případě chyb.
8) Jak se používají okenní funkce v T-SQL a můžete uvést příklad?
Očekává se od kandidáta: Tazatel chce posoudit vaši znalost pokročilých analytických dotazů.
Příklad odpovědi: Funkce okna umožňují výpočty napříč sadami řádků souvisejících s aktuálním řádkem bez sbalení dat. Například:
SELECT EmployeeID, Salary, RANK() OVER (ORDER BY Salary DESC) AS SalaryRank FROM Employees;
Toto přiřazuje zaměstnancům čísla v žebříčku na základě platu, což usnadňuje analýzu trendů výkonnosti.
9) Povězte mi o nějakém komplexním T-SQL projektu, na kterém jste pracovali, a o tom, jak jste se s jeho výzvami vypořádali.
Očekává se od kandidáta: Tazatel hledá hloubku zkušeností, schopnost řešit problémy a týmovou práci.
Příklad odpovědi: V mé poslední roli jsem budoval ETL pipeline datového skladu s využitím uložených procedur T-SQL. Náročnou úlohou bylo efektivní zpracování velkých objemů dat. Optimalizoval jsem dotazy pomocí dělených tabulek, inkrementálního načítání a dávkového zpracování. Také jsem koordinoval práci s týmem BI, abych zajistil konzistentní návrhy schémat a zvýšil rychlost reportingu o více než 40 %.
10) Jak byste řešili situaci, kdy by vámi napsaná uložená procedura způsobila zablokování v produkčním prostředí?
Očekává se od kandidáta: Tazatel testuje vaše znalosti krizového řízení a technické znalosti.
Příklad odpovědi: Nejprve bych identifikoval zablokování pomocí SQL Serveru sys.dm_tran_locks a grafy deadlocků. Pak bych analyzoval pořadí přístupu k prostředkům a refaktoroval proceduru tak, abych získával zámky v konzistentním pořadí. V mém předchozím zaměstnání jsem také implementoval logiku opakování pro postižené transakce a naplánoval pravidelné monitorování, abych včas odhalil podobné vzorce.
