50 найпопулярніші питання та відповіді на інтерв’ю T-SQL (2026)

Запитання та відповіді на співбесіді з T-SQL

Готуєтеся до співбесіди з T-SQL? Час покращити своє розуміння того, як бази даних насправді працюють «під поверхнею». За допомогою Запитання на співбесіді з T-SQLРекрутери оцінюють не лише запам'ятовування синтаксису, а й ваше володіння маніпулюванням даними, оптимізацією та логічним структуруванням.

Можливості в цій галузі продовжують розширюватися, оскільки бізнес залежить від аналітичних даних. Виділяються кандидати з сильними технічними знаннями, навичками аналізу та здібностями до вирішення реальних проблем — як новачки, так і професіонали з 5-10 роками досвіду. Розуміння питань та відповідей як на базовому, так і на просунутому рівнях допомагає керівникам команд, менеджерам та старшим технічним спеціалістам визначити сильні навички SQL та досвід базового рівня.

Наш посібник спирається на думки понад 65 менеджерів з найму, понад 40 старших розробників та фахівців з обробки даних з різних галузей, охоплюючи все: від базової логіки SQL до передових методів оптимізації, яким довіряють технічні лідери по всьому світу.
Детальніше ...

👉 Безкоштовне завантаження PDF: Запитання та відповіді для співбесіди з T-SQL

Найпопулярніші питання та відповіді на співбесіді з T-SQL

1) Що таке T-SQL і чим він відрізняється від стандартного SQL?

Transact-SQL (T-SQL) – це Microsoftвласне розширення мови SQL, яке переважно використовується з Microsoft SQL ServerВін удосконалює стандартний SQL, впроваджуючи функції процедурного програмування, такі як змінні, умови, цикли, обробка помилок та вбудовані функції. У той час як стандартний SQL зосереджений на маніпуляції даними (SELECT, INSERT, UPDATE, DELETE), T-SQL підтримує оператори керування потоком (IF…ELSE, WHILE), обробку транзакцій та системні функції, що дозволяють розробникам писати складні скрипти.

Аспект SQL T-SQL
Власність Стандарт ANSI/ISO Microsoft
Процедурна логіка обмеженою Підтримувані (змінні, цикли)
Обробка помилок Minimal Підтримується TRY…CATCH
Основне використання Загальні бази даних SQL Server

приклад:

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

2) Поясніть різні типи об'єднань у T-SQL на прикладах.

Об'єднання в T-SQL об'єднують рядки з двох або більше таблиць на основі пов'язаних стовпців. Розуміння їхніх типів є критично важливим для реляційних запитів даних.

Тип приєднання Опис Приклад синтаксису
INNER JOIN Повертає лише відповідні рядки SELECT * FROM A INNER JOIN B ON A.id = B.id;
LEFT JOIN Все зліва + збіги справа SELECT * FROM A LEFT JOIN B ON A.id = B.id;
ПРАВИЛЬНИЙ ПРИЄДН Все справа + збіги зліва SELECT * FROM A RIGHT JOIN B ON A.id = B.id;
ПОВНЕ ПРИЄДНАННЯ Поєднує ЛІВИЙ + ПРАВИЙ SELECT * FROM A FULL JOIN B ON A.id = B.id;
КРОВИЙ ПРИЄДНАЙТЕСЬ Декартовий продукт SELECT * FROM A CROSS JOIN B;

Практичний приклад: приєднання Orders та Customers щоб знайти, які клієнти розмістили замовлення за допомогою INNER JOIN.


3) Що таке загальні табличні вирази (CTE) та які їхні переваги?

Загальний табличний вираз (CTE) надає тимчасовий іменований набір результатів, на який можна посилатися всередині SELECT, INSERT, UPDATEабо DELETE оператор. Це покращує читабельність та спрощує рекурсивні запити.

переваги:

  • Покращує чіткість запитів та їх обслуговування.
  • Увімкнути рекурсію (для ієрархічних даних, таких як організаційні діаграми).
  • Допомагає уникнути повторних підзапитів.
  • Збільшує модульність у великих скриптах.

приклад:

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

4) Чим відрізняються тимчасові таблиці та табличні змінні в T-SQL?

Обидва використовуються для зберігання проміжних результатів, але їхня поведінка та область застосування суттєво відрізняються.

особливість Тимчасова таблиця (#Temp) Таблична змінна (@TableVar)
Зберігається в TempDB Пам'ять (з обмеженим використанням TempDB)
Транзакційний обсяг Слідкує за транзакціями Незалежно від транзакцій
Індекси Підтриманий обмеженою
продуктивність Краще для великих наборів даних Краще для невеликих наборів даних

приклад:

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

Використовуйте тимчасові таблиці під час роботи з великими наборами даних або потреби в індексах.


5) Поясніть концепцію транзакцій у T-SQL та їх життєвий цикл.

Транзакція в T-SQL гарантує, що послідовність операцій виконується як єдина логічна одиниця. Життєвий цикл включає ПОЧАТИ ОПЕРАЦІЮ, COMMIT та ПОВЕРНЕННЯ.

Стажування Опис
ПОЧАТИ ОПЕРАЦІЮ Розпочинає транзакцію
COMMIT TRANSACTION Зберігає всі зміни назавжди
ВІДКАТ ТРАНЗАКЦІЇ Скасовує всі операції з моменту останнього BEGIN

приклад:

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

Якщо помилка сталася посеред процесу, ROLLBACK зберігає цілісність даних.


6) Яка різниця між командами DELETE, TRUNCATE та DROP?

Command функція Скасування Впливає на структуру швидкість
DELETE Видаляє певні рядки Так Немає Повільніше
ЗРУЧИТИ Видаляє всі рядки Ні (зазвичай) Немає Fast
DROP Видаляє всю таблицю Немає Так Найшвидший

приклад:

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

Скористайтеся кнопкою DELETE для вибіркового видалення, TRUNCATE для очищення, та DROP щоб повністю зняти стіл.


7) Як працює обробка помилок у T-SQL?

T-SQL забезпечує структуровану обробку помилок через TRY...CATCH блок, що дозволяє розробникам коректно керувати помилками під час виконання.

приклад:

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

Такий підхід ізолює несправну операцію та запобігає пошкодженню цілісності даних транзакцією. Розробники також можуть отримати доступ до системних функцій, таких як ERROR_NUMBER() or ERROR_SEVERITY() для діагностики.


8) Які існують різні способи оптимізації продуктивності запитів T-SQL?

Оптимізація включає точне налаштування стратегій проектування, індексації та виконання SQL.

Ключові прийоми:

  1. Скористайтеся кнопкою належне індексування у часто запитуваних стовпцях.
  2. Уникнути SELECT * — явно вказати стовпці.
  3. Скористайтеся кнопкою операції на основі множин замість курсорів.
  4. Аналізуйте плани виконання за допомогою SQL Server Management Studio.
  5. Скористайтеся кнопкою Ефективне об'єднання за належних умов увімкнення.
  6. Зменшити вкладені підзапити; віддавайте перевагу CTE або тимчасовим таблицям.

Налаштування продуктивності в T-SQL також включає моніторинг статистики виконання запитів за допомогою SET STATISTICS IO ON.


9) Що таке віконні функції та коли їх слід використовувати?

Віконні функції виконують обчислення для набору рядків, пов'язаних з поточним рядком, не згортаючи їх в один результат. Вони корисні для ранжування, підрахунку підсумків та ковзних середніх.

приклад:

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

Загальні функції включають RANK(), ROW_NUMBER(), DENSE_RANK() та SUM() OVER().

Вони є критично важливими для аналітичних робочих навантажень, де потрібні як агреговані дані, так і дані на рівні рядків.


10) Поясніть різницю між кластерними та некластерними індексами.

особливість Clusterред Індекс Не-Clusterред Індекс
зберігання даних Фізично переставляє таблицю Окрема структура
Кількість на стіл Один множинний
продуктивність Швидше для запитів діапазону Швидше для конкретних пошуків
Приклад використання Основний ключ Додаткові пошуки

приклад:

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

Вибір правильного типу індексу безпосередньо впливає на швидкість виконання запитів та ефективність зберігання.


11) Що таке збережені процедури в T-SQL і для чого вони використовуються?

Збережена процедура — це попередньо скомпільована колекція з одного або кількох SQL-інструкцій, що зберігаються на сервері. Вони підвищують продуктивність, безпеку та можливість повторного використання, дозволяючи інкапсулювати логіку та виконувати її багаторазово без повторної компіляції. Збережені процедури зменшують мережевий трафік та підтримують параметри для динамічного виконання.

приклад:

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

Переваги:

  • Краща продуктивність завдяки попередній компіляції.
  • Покращена безпека завдяки контрольованому виконанню.
  • Легше обслуговування коду та модуляризація.

12) Поясніть різницю між збереженою процедурою та функцією в T-SQL.

Аспект Збережена процедура функція
Тип повернення Може повертати кілька значень Повинно повертати одне значення або таблицю
Використати у SELECT Не дозволено Дозволено
Обробка помилок Підтримується TRY…CATCH обмеженою
Виконання Виконано через EXEC Використовується вбудовано з SQL
Контроль транзакцій Підтриманий Не підтримується

приклад:

  • Процедура подання заявки: EXEC GetEmployeeDetails 'HR';
  • Функції: SELECT dbo.GetSalary(101);

Функції ідеально підходять для обчислень; процедури краще підходять для бізнес-логіки та маніпулювання даними.


13) Що таке тригер у T-SQL, і які його типи?

Тригер — це спеціальна збережена процедура, яка виконується автоматично у відповідь на певні події (INSERT, UPDATE, DELETE) у таблиці або представленні. Тригери використовуються для забезпечення дотримання бізнес-правил, аудиту змін або підтримки цілісності посилань.

тип Опис
ПІСЛЯ тригера Постріли після завершення події
ЗАМІСТЬ Тригер Виконується замість події-тригера

приклад:

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

Уникайте надмірного використання тригерів — вони можуть вплинути на продуктивність і ускладнити налагодження.


14) Як обробляти значення NULL у T-SQL?

NULL представляє відсутні або невідомі дані. T-SQL надає кілька функцій для ефективної обробки цих даних:

  • ISNULL(expression, replacement) → замінює NULL значенням за замовчуванням.
  • COALESCE(expression1, expression2, ...) → повертає перше значення, відмінне від NULL.
  • NULLIF(expression1, expression2) → повертає NULL, якщо вирази рівні.

приклад:

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

Найкраща практика: Завжди враховуйте значення NULL у з'єднаннях та умовах, щоб уникнути неочікуваних результатів.


15) Що таке курсори в T-SQL і коли їх слід уникати?

Курсор дозволяє обробляти результати запиту рядок за рядком — це корисно для складної логіки, де операцій на основі множин недостатньо. Однак курсори… сповільнювати та ресурсоємний порівняно з альтернативами на основі наборів.

приклад:

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

Недоліки:

  • Збільшене використання пам'яті.
  • Погана масштабованість.
  • Зниження продуктивності.

альтернатива: Використовуйте об'єднання таблиць, підзапити або віконні функції, коли це можливо.


16) Поясніть оператор MERGE та варіанти його використання.

Команда MERGE виконання оператора INSERT, ОНОВЛЕННЯ та DELETE операції в одній команді — ідеально підходить для синхронізації двох таблиць.

Приклад синтаксису:

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;

Використовуйте випадки:

  • Сховище даних (синхронізація проміжних та цільових таблиць).
  • Інкрементне завантаження даних.
  • Ведення таблиць аудиту або вимірів.

17) Які різні типи користувацьких функцій (UDF) існують у T-SQL?

тип Опис Приклад
Скалярний Повертає одне значення CREATE FUNCTION GetTax(@Salary DECIMAL) RETURNS DECIMAL
Вбудовані табличні значення Повертає таблицю через одинарний SELECT RETURN SELECT * FROM Employees WHERE Dept = 'HR'
Багатооператорний таблично-значний Повертає таблицю після кількох операторів Корисно для складної логіки

Функції сприяють повторному використанню коду та покращують модульний дизайн запитів.

Вони повинні бути детермінованими (повертати однаковий результат для однакових вхідних даних), коли це можливо, для оптимізації продуктивності.


18) Що таке нормалізація, які її переваги та недоліки?

Нормалізація — це процес упорядкування даних у базі даних для мінімізації надлишковості та покращення цілісності. Він передбачає поділ таблиць на менші, пов'язані сутності.

Нормальна форма Правило Приклад
1 НФ Виключіть повторювані групи Розділення даних, розділених комами
2 НФ Видалити часткові залежності Забезпечити повну залежність від первинного ключа
3 НФ Видалити транзитивні залежності Переміщення похідних атрибутів

переваги:

  • Зменшує надлишковість.
  • Забезпечує узгодженість даних.
  • Спрощує технічне обслуговування.

Недоліки:

  • Складні з'єднання.
  • Потенційні компроміси в продуктивності для аналітичних запитів.

19) Які різні типи обмежень існують у T-SQL?

Обмеження забезпечують дотримання правил цілісності даних у таблиці.

Обмеження Мета Приклад
PRIMARY KEY Унікально ідентифікує кожен рядок PRIMARY KEY (EmpID)
FOREIGN KEY Зв'язує дві таблиці FOREIGN KEY (DeptID)
UNIQUE Забезпечує унікальність значень стовпців UNIQUE (Email)
ПЕРЕВІРКА Перевіряє діапазон даних CHECK (Age >= 18)
ПОВЕРНЕНО Надає значення за замовчуванням DEFAULT GETDATE()

Обмеження забезпечують точність і надійність, зменшуючи потребу в ретельній перевірці на рівні застосунку.


20) Як керувати дозволами та безпекою в T-SQL?

T-SQL керує безпекою бази даних через логіни, користувачі, ролі та дозволи.

Дозволи можна надавати або скасовувати на рівні об'єкта або схеми.

приклад:

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

Кращі практики:

  • Скористайтеся кнопкою ролі замість прямих дозволів користувача.
  • Уникайте використання sa або системні облікові записи для програм.
  • Регулярно перевіряйте дозволи за допомогою sys.database_permissions.

Правильне управління дозволами забезпечує принцип найменших привілеїв та дотримання політик безпеки.


21) Які різні рівні ізоляції транзакцій існують у T-SQL?

Рівні ізоляції транзакцій визначають, як одна транзакція ізольована від інших — балансування узгодженість з одночасністьSQL Server підтримує наступне:

Рівень ізоляції Опис Брудне читання Неповторне читання Фантомне читання
ПРОЧИТАЙТЕ НЕЗАМОВЛЕНО Зчитує незафіксовані дані Так Так Так
READ COMMITTED За замовчуванням; блокування запобігають брудному читанню Немає Так Так
ПОВТОРНЕ ЧИТАННЯ Запобігає зміні даних до моменту фіксації (commit) Немає Немає Так
СЕРІАЛІЗАЦІЙНИЙ Повна ізоляція; найвищий рівень блокування Немає Немає Немає
СНАПШОТ Використовує керування версіями, а не блокування Немає Немає Немає

приклад:

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

Скористайтеся кнопкою СНАПШОТ для систем з високим рівнем паралельності, щоб мінімізувати блокування без шкоди для узгодженості.


22) Що таке глухий кут у SQL Server і як його можна запобігти?

A тупик виникає, коли дві транзакції утримують блокування, які потрібні одна одній, що призводить до протистояння. SQL Server автоматично виявляє та завершує одну транзакцію як жертву взаємоблокування.

Приклад сценарію:

  • Транзакція A блокує Таблицю1, а потім очікує на Таблицю2.
  • Транзакція B блокує Таблицю2, а потім очікує на Таблицю1.

Методи профілактики:

  1. Отримуйте доступ до ресурсів у тому ж порядку.
  2. Зробіть транзакції короткими.
  3. Використовуйте відповідні рівні ізоляції.
  4. Уникайте взаємодії з користувачем всередині транзакцій.

Використовуйте SQL Profiler або розширені події для tracтупикові ситуації в режимі реального часу.


23) Поясніть різницю між песимістичним та оптимістичним керуванням паралельністю.

тип Опис Механізм блокування Використовуйте Case
Песимістичний Блокує дані під час транзакції Важке блокування Середовища з високим рівнем конфліктності
Оптимістичний Використовує керування версіями рядків, перевіряє перед фіксацією (commit) Мінімальне блокування Робочі навантаження з високим навантаженням на читання та низьким рівнем конфліктів

приклад:

  • Песимістичний: За замовчуванням READ COMMITTED блокування.
  • Оптимістично: SNAPSHOT ізоляція з керуванням версіями рядків.

Оптимістичний паралельний режим підвищує продуктивність систем з великим обсягом операцій читання та рідкісними оновленнями.


24) Як можна проаналізувати та оптимізувати повільно виконуваний T-SQL запит?

  1. Перевірте план виконання: Визначте сканування, відсутні індекси та дороговартісні операції.
  2. Використовуйте SET STATISTICS IO/TIME: Аналіз вводу-виводу та використання процесора.
  3. Уникайте курсорів та циклів: Замініть операціями на основі множин.
  4. Оптимізація індексу: Додати або реорганізувати фрагментовані індекси.
  5. Перевірка параметрів: Скористайтеся кнопкою OPTION (RECOMPILE) генерувати нові плани.

приклад:

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

Регулярний моніторинг повільних запитів за допомогою Динамічні подання керування (DMV) як sys.dm_exec_query_stats є найкращою практикою.


25) Що таке динамічний SQL та які його переваги та ризики?

Динамічний SQL дозволяє динамічно створювати SQL-запитувачі під час виконання, використовуючи змінні.

приклад:

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

переваги:

  • Гнучкість для імен змінних таблиць або фільтрів.
  • Можна використовувати повторно для кількох схем.

Недоліки:

  • Вразливий до SQL-ін'єкція якщо не параметризовано.
  • Складніше налагоджувати та обслуговувати.

Завжди використовуйте sp_executesql з параметрами безпеки.


26) Що таке тимчасові об'єкти в T-SQL і чим вони відрізняються?

Тимчасові об'єкти зберігаються в TempDB та допомагають керувати проміжними даними.

Тип об'єкта Сфера Приклад
Таблиця локальних температур Специфічний для сеансу CREATE TABLE #TempTable
Глобальна таблиця температур Видимо для всіх сеансів CREATE TABLE ##TempGlobal
Таблична змінна Специфічний для партії DECLARE @Temp TABLE (...)

Кращі практики:

  • Для менших наборів даних надавайте перевагу табличним змінним.
  • Використовуйте локальні тимчасові таблиці для більших даних з потребами індексації.
  • Явно видаляйте тимчасові таблиці, щоб швидше звільняти ресурси.

27) Як використовувати функції розбиття вікон у T-SQL?

Розбиття дозволяє застосовувати віконні функції до певних підмножин даних.

приклад:

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

Переваги:

  • Ефективно розраховує рейтинги, загальні та середні показники для кожної групи.
  • Усуває потребу в самоз'єднаннях або підзапитах.

Використовуйте випадки: Зарплатні смуги, рейтинги продажів та аналітика тенденцій.


28) Яка різниця між UNION та UNION ALL в T-SQL?

Стаття Дублікати продуктивність Використовуйте Case
СОЮЗ Видаляє дублікати Повільніше (використовує сортування/вирізнення) Чисте об'єднання наборів результатів
UNION ALL Зберігає дублікати Швидше Агрегація або міграція даних

приклад:

SELECT City FROM Customers
UNION
SELECT City FROM Suppliers;

Віддавайте перевагу UNION ALL коли дублікати прийнятні, а продуктивність має значення.


29) Як працюється з даними JSON у T-SQL?

SQL Server підтримує власні функції JSON для розбору та генерації даних JSON.

приклад:

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

Основні функції:

  • JSON_VALUE() → Колишнійtracскалярні значення ts.
  • JSON_QUERY() → Колишнійtracоб'єкти/масиви ts.
  • OPENJSON() → Розбирає JSON на рядки.
  • FOR JSON → Перетворює результати запиту у формат JSON.

Корисно для API, гібридних систем та NoSQL інтеграцій.


30) Як можна керувати та оптимізувати TempDB у SQL Server?

TempDB є системною базою даних, критично важливою для тимчасового зберігання та керування версіями. Неправильне керування може спричинити серйозні проблеми з продуктивністю.

Методи оптимізації:

  1. Розмістіть TempDB на швидкому сховищі (SSD).
  2. Попереднє визначення розміру файлів даних та журналів.
  3. Використовуйте кілька файлів даних (1 на ядро ​​процесора, до 8).
  4. Монітор с sys.dm_db_file_space_usage.
  5. Регулярно прибирайте тимчасові предмети.

Приклад запиту:

SELECT * FROM sys.dm_db_file_space_usage;

Проактивне керування тимчасовою базою даних дозволяє уникнути конфліктів на сторінках розподілу та покращити загальну пропускну здатність бази даних.


31) Що таке підказки запитів у T-SQL, і коли їх слід використовувати?

Підказки запитів вказують оптимізатору SQL Server змінити свій звичайний план виконання.

Їх слід використовувати економно — лише тоді, коли ви повністю розумієте контекст розподілу та виконання даних.

приклад:

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

Загальні поради:

  • NOLOCK: Читає без блокувань (може читати незафіксовані дані).
  • FORCESEEK: Примусово виконує пошук по індексу замість сканування.
  • OPTIMIZE FOR: Керує значеннями параметрів для створення плану.
  • RECOMPILE: Примусово виконує перекомпіляцію для кожного виконання.

Увага: Надмірне використання підказок може погіршити продуктивність зі зростанням обсягу даних або зміною шаблонів. Використовуйте їх лише тоді, коли план оптимізатора є очевидно неефективним.


32) Поясніть концепцію кешування плану виконання в SQL Server.

SQL Server кешує плани виконання, щоб уникнути повторної компіляції повторюваних запитів.

Коли той самий запит виконується знову з ідентичною структурою, він повторно використовує кешований план, покращуючи продуктивність.

приклад:

EXEC GetCustomerOrders @CustomerID = 101;

Переваги:

  • Зменшує навантаження на процесор.
  • Покращує узгодженість часу відгуку.

Проблеми:

  • Перехоплення параметрів може призвести до неефективних планів.
  • Перевантаження кешу плану може споживати пам'ять.

Пом'якшення: Скористайтеся кнопкою OPTION (RECOMPILE) or OPTIMIZE FOR UNKNOWN де параметри сильно змінюються.


33) Що таке перехоплення параметрів і як це може вплинути на продуктивність?

Перехоплення параметрів відбувається, коли SQL Server використовує значення параметрів з першого виконання запиту для створення плану, який потім використовується повторно, навіть якщо він неоптимальний для подальших виконань.

Приклад сценарію:

  • Перше виконання: невеликий набір даних → план пошуку індексу.
  • Наступне виконання: великий набір даних → той самий план використано повторно, але повільно.

Розв'язки:

  1. Скористайтеся кнопкою OPTION (RECOMPILE) генерувати нові плани.
  2. Використовуйте локальні змінні для маскування значень параметрів.
  3. Скористайтеся кнопкою OPTIMIZE FOR or OPTIMIZE FOR UNKNOWN.

Перехоплення параметрів є однією з головних причин непередбачуваної продуктивності в T-SQL у реальному світі.


34) Як контролювати та аналізувати продуктивність запитів у SQL Server?

Ви можете використовувати кілька інструментів та DMV для профілювання та налаштування продуктивності:

  • Плани виконання: Ctrl + M в SSMS або sys.dm_exec_query_plan.
  • DMV (Департаменти дорожнього руху):

    • sys.dm_exec_query_stats – Процесор та тривалість.
    • sys.dm_exec_sql_text – SQL-текст.
    • sys.dm_exec_requests – Активні запити.
  • Монітор продуктивності та розширені події на тривалий термін tracкороль.

приклад:

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) Поясніть роль статистики в оптимізації запитів.

Статистика описує розподіл даних (наприклад, окремі значення, щільність, гістограма), який оптимізатор використовує для оцінки кардинальності.

Якщо статистика застаріла, SQL Server може вибрати погані плани.

Ключові команди:

  • UPDATE STATISTICS Employees;
  • sp_updatestats;
  • Налаштування автоматичного оновлення: увімкнено за замовчуванням.

Кращі практики:

  • тримати AUTO_UPDATE_STATISTICS включений.
  • Для великих таблиць плануйте оновлення вручну.
  • Скористайтеся кнопкою FULLSCAN для критичних показників.

Застаріла статистика — це тихий вбивця продуктивності.


36) Яка різниця між пошуком за індексом та скануванням індексу?

Operaції Опис продуктивність Використовуйте Case
Пошук покажчика Переходить безпосередньо до відповідних рядків Fast Високоселективні запити
Сканування індексу Послідовно зчитує всі записи індексу Повільніше Запити з низькою вибірковістю

приклад:

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

Порада щодо оптимізації: Створюйте фільтровані або покриваючі індекси, щоб перетворити сканування на пошук.


37) Поясніть секціоновані таблиці та їхні переваги.

Розбиття на секції розділяє велику таблицю на менші, керовані частини (розділи), часто на основі стовпця діапазону (наприклад, дати).

Переваги:

  • Швидше керування даними (завантаження/вивантаження за розділами).
  • Покращена продуктивність запитів для великих наборів даних.
  • Паралельна обробка для розділених сканувань.

приклад:

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

Корпус: Сховища даних, що обробляють мільярди рядків, де старі розділи можна ефективно архівувати.


38) Що таке рекурсивні CTE та які вони мають обмеження?

A рекурсивний загальний табличний вираз (CTE) посилається на себе, зазвичай для ієрархічних даних, таких як організаційні схеми або деревоподібні структури.

приклад:

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;

Обмеження:

  • Ліміт рекурсії за замовчуванням = 100 рівнів.
  • Може спричинити проблеми з продуктивністю, якщо глибина рекурсії висока.
  • Скористайтеся кнопкою OPTION (MAXRECURSION n) щоб налаштувати ліміт.

39) Як SQL Server обробляє помилки внутрішньо в транзакціях?

Коли під час транзакції виникає помилка:

  • Якщо це важкий (рівень > 20), з’єднання негайно розривається.
  • If неважкий, його можна зловити за допомогою TRY...CATCH.

приклад:

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;

Найкраща практика: Завжди обгортайте DML в TRY…CATCH для стійкості до помилок.


40) Які є деякі передові методи налаштування продуктивності T-SQL?

  1. Уникайте скалярних UDF у SELECT — вбудовані функції швидші.
  2. Використовувати відфільтровані індекси щоб зменшити розмір індексу.
  3. Використовуйте OLTP в пам'яті (Hekaton) для систем з високим рівнем паралельності.
  4. Виконання в пакетному режимі на індексах columnstore для аналітики.
  5. Виключіть неявні перетворення шляхом зіставлення типів даних.
  6. Використовувати сховище запитів порівняти історичні плани.

Приклад виявлення неявних перетворень:

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%';

Налаштування продуктивності – це безперервний процес, а не одноразова подія.


41) Як би ви визначили найбільш ресурсоємні запити в SQL Server?

Ви можете ідентифікувати запити з високою вартістю за допомогою динамічних представлень керування (DMV), які записують статистику виконання в історичних даних.

приклад:

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;

Ключові показники:

  • AvgCPUСередній час роботи процесора на виконання.
  • AvgReadsІнтенсивність вводу/виводу.
  • AvgDurationЗатримка виконання.

Такий підхід допомагає адміністраторам баз даних ізолювати важкі запити ще до того, як користувачі помітять зниження продуктивності.


42) Як можна виявити та виправити відсутні індекси в SQL Server?

SQL Server автоматично tracks відсутні рекомендації щодо індексу через DMV.

приклад:

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;

Кращі практики:

  • Спочатку надайте пріоритет індексам з високим рівнем пошуку.
  • Перевірте за допомогою планів виконання перед створенням.
  • Уникайте надмірного індексування — це уповільнює запис.

43) Яка різниця між дзеркалюванням бази даних, реплікацією та веденням журналів?ping?

особливість Мета Переклад повідомлень Failover складність
Дзеркальне відображення Копія бази даних високої доступності Так автоматичний Medium
Реплікація Розподіл даних між базами даних Частковий Мануал Високий
Корабль з колодping Стратегія DR на основі резервного копіювання Немає Мануал низький

Інструкція з використання:

  • Дзеркальне відображення → OLTP-системи високої доступності.
  • Реплікація → Розподілена звітність.
  • Корабль з колодping → Налаштування аварійного відновлення.

44) Як ви вирішуєте проблеми блокування в SQL Server?

Блокування відбувається, коли один процес утримує блокування, які потрібні іншому процесу.

Щоб визначити блокатори:

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;

Розв'язки:

  • Зменште тривалість транзакції.
  • Використовуйте ізоляцію знімків.
  • Налаштуйте запити, щоб мінімізувати блокування.
  • Визначте довготривалі відкриті транзакції за допомогою DBCC OPENTRAN.

45) Як сховище запитів SQL Server допомагає в налаштуванні продуктивності?

Сховище запитів збирає текст запиту, плани та статистику виконання, що дозволяє регресійний аналіз плану.

Це допомагає визначити, коли запит раптово стає повільним через зміни плану.

приклад:

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;

Переваги:

  • Порівняйте історичні плани.
  • Примусово будуйте гарні плани.
  • Track тенденцій продуктивності з плином часу.

46) Як можна запобігти SQL-ін'єкції в T-SQL-застосунках?

Первинні захисні механізми:

  1. Скористайтеся кнопкою параметризовані запити через sp_executesql.
  2. Перевіряти та очищувати всі введені користувачем дані.
  3. Уникайте динамічного об'єднання SQL.
  4. Працівник принцип найменших привілеїв для облікових записів баз даних.

Безпечний приклад:

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

Хоча SQL-ін'єкція здійснюється на рівні програми, Адміністратори баз даних повинні перевіряти збережені процедури та журнали для непараметризованого виконання.


47) Як використовувати розширені події для глибокого моніторингу продуктивності?

Розширені події (XEvents) — це легкий фреймворк для моніторингу продуктивності — сучасна альтернатива SQL. Trace.

приклад:

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;

Використовуйте випадки:

  • Моніторинг запитів з високим навантаженням на процесор.
  • Зафіксувати глухі блокування або відсутні індекси.
  • Профілювання тривалих операторів у продакшені з мінімальними накладними витратами.

48) Що таке фільтровані індекси, і коли їх слід використовувати?

Фільтрований індекс індексує лише підмножину рядків, які відповідають умові фільтра, що покращує продуктивність та зменшує обсяг пам'яті.

приклад:

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

Переваги:

  • Менший розмір індексу.
  • Швидше обслуговування.
  • Оптимізовано для вибіркових запитів.

Найкраще для: Стовпці з асиметричним розподілом даних (наприклад, активні та неактивні записи).


49) Як безпечно переносити дані між середовищами SQL Server?

Безпечна міграція даних передбачає планування узгодженість, час простою та відкат.

Кращі практики:

  1. Скористайтеся кнопкою транзакційна реплікація or збору даних про зміни (CDC) для синхронізації в реальному часі.
  2. Тимчасово вимкніть обмеження та тригери.
  3. Скористайтеся кнопкою BCP or SSIS для передачі великих обсягів даних.
  4. Перевіряти кількість рядків та контрольні суми.
  5. Завжди запускати перевірки цілісності після міграції (DBCC CHECKDB).

приклад:

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

Тестування скриптів міграції на стадії проміжної версії не підлягає обговоренню.


50) Як ви виявляєте та виправляєте проблеми із параметрично-чутливими запитами (PSQ)?

Запити, чутливі до параметрів, виконуються непослідовно залежно від значень параметрів — часта проблема в реальному світі.

Виявлення: Скористайтеся кнопкою Магазин запитів or sys.dm_exec_query_stats визначити кілька планів для одного запиту.

Стратегії виправлення:

  1. Скористайтеся кнопкою OPTION (RECOMPILE) за кожне виконання.
  2. Скористайтеся кнопкою ОПТИМІЗАЦІЯ ДЛЯ НЕВІДОМОГО створити універсальний план.
  3. Створити посібники з планування забезпечити оптимальні шляхи виконання.
  4. Скористайтеся кнопкою підказки щодо запитів лише за необхідності.

Питання, чутливі до параметрів, вимагають балансування між стабільністю плану та передбачуваністю продуктивності.

🔍 Найпопулярніші питання на співбесіді з T-SQL з реальними сценаріями та стратегічними відповідями

1) Яка різниця між INNER JOIN та LEFT JOIN у T-SQL?

Очікується від кандидата: Інтерв'юер хоче оцінити ваше розуміння операцій об'єднання та того, як керуються зв'язки між даними в SQL-запитах.

Приклад відповіді: An INNER JOIN повертає лише рядки, які мають співпадаючі значення в обох таблицях, тоді як a LEFT JOIN повертає всі рядки з лівої таблиці, а також відповідні рядки з правої таблиці. Якщо збігу немає, для стовпців з правої таблиці повертаються значення NULL. Ця відмінність є критично важливою під час роботи з частковими або необов'язковими зв'язками в базах даних.


2) Як би ви виявили та видалили дублікати записів з таблиці в T-SQL?

Очікується від кандидата: Інтерв'юер хоче побачити вашу здатність використовувати віконні функції та CTE для вирішення проблем якості даних.

Приклад відповіді: Я б використав загальний табличний вираз (CTE) у поєднанні з ROW_NUMBER() функція для виявлення дублікатів. Наприклад:

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

Такий підхід допомагає видалити дублікати, зберігаючи при цьому один унікальний запис для кожної групи.


3) Чи можете ви пояснити, що таке CTE (загальний табличний вираз) і коли його слід використовувати?

Очікується від кандидата: Інтерв'юер перевіряє ваші знання структурування запитів та тимчасових наборів результатів.

Приклад відповіді: CTE – це тимчасовий набір результатів, визначений в області виконання одного запиту. Він корисний для спрощення складних об'єднань та підзапитів, покращення читабельності та уможливлення рекурсивних запитів. На попередній посаді я часто використовував CTE для розбиття логіки багатоетапної агрегації на більш зручні для підтримки компоненти.


4) Як ви керуєте налаштуванням продуктивності в запитах T-SQL?

Очікується від кандидата: Інтерв'юер хоче оцінити ваш досвід оптимізації запитів та усунення несправностей, пов'язаних з продуктивністю.

Приклад відповіді: Я починаю з вивчення плану виконання, щоб виявити повільні операції, такі як сканування таблиць або дорогі об'єднання. Потім я перевіряю наявність відсутніх індексів, надлишкових підзапитів або неефективних об'єднань. Я також аналізую статистику та використовую стратегії індексування, такі як покриття індексів або фільтровані індекси, для підвищення продуктивності. Нарешті, я переглядаю логіку запитів, щоб переконатися, що вона використовує операції на основі множин, а не обробку рядків за рядком.


5) Опишіть випадок, коли вам довелося налагоджувати повільно виконуваний запит у продакшені. Які кроки ви зробили?

Очікується від кандидата: Це поведінкове питання оцінює ваші навички вирішення реальних проблем та комунікації.

Приклад відповіді: На попередній посаді виконання запиту до звіту займало понад 20 хвилин. Я проаналізував план виконання та виявив, що в одному з об'єднань бракувало індексу у стовпці зовнішнього ключа. Після створення індексу та оновлення статистики час виконання запиту скоротився до менш ніж 30 секунд. Я також задокументував виправлення та поділився ним з командою, щоб запобігти подібним проблемам у майбутньому.


6) Що таке тимчасові таблиці та табличні змінні, і чим вони відрізняються?

Очікується від кандидата: Інтерв'юер перевіряє ваше розуміння варіантів тимчасового зберігання даних у T-SQL.

Приклад відповіді: Тимчасові таблиці (#TempTable) створюються в базі даних tempdb та підтримують індекси, обмеження та статистику. Табличні змінні (@TableVar) зберігаються в пам'яті та мають обмежену підтримку статистики, що робить їх придатними для менших наборів даних. Тимчасові таблиці краще підходять для великих або складних наборів даних, тоді як табличні змінні ефективніші для невеликих, короткочасних даних.


7) Як би ви обробили помилки та транзакції в T-SQL?

Очікується від кандидата: Інтерв'юер перевіряє ваше розуміння цілісності транзакцій та обробки винятків.

Приклад відповіді: я використовую BEGIN TRANSACTION, COMMIT та ROLLBACK оператори для забезпечення узгодженості даних. Я також включаю TRY...CATCH блоки для коректної обробки помилок. Наприклад:

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

Такий підхід запобігає частковому оновленню даних у разі виникнення помилок.


8) Як використовувати віконні функції в T-SQL, і чи можете ви навести приклад?

Очікується від кандидата: Інтерв'юер хоче оцінити вашу здатність відповідати на складні аналітичні запити.

Приклад відповіді: Віконні функції дозволяють виконувати обчислення між наборами рядків, пов'язаних з поточним рядком, без згортання даних. Наприклад:

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

Це призначає працівникам рейтингові номери на основі заробітної плати, що спрощує аналіз тенденцій продуктивності.


9) Розкажіть мені про складний T-SQL проект, над яким ви працювали, та як ви підійшли до його вирішення.

Очікується від кандидата: Інтерв'юер очікує глибокого досвіду, вміння вирішувати проблеми та працювати в команді.

Приклад відповіді: На моїй попередній посаді я створив ETL-конвеєр сховища даних, використовуючи збережені процедури T-SQL. Завдання полягало в ефективній обробці великих обсягів даних. Я оптимізував запити за допомогою секціонованих таблиць, інкрементального завантаження та пакетної обробки. Я також координував роботу з командою бізнес-аналітики, щоб забезпечити узгодженість схем та покращити швидкість звітності більш ніж на 40%.


10) Як би ви впоралися з ситуацією, коли написана вами збережена процедура спричинила глухий кут у виробництві?

Очікується від кандидата: Інтерв'юер перевіряє ваші навички кризового менеджменту та технічної обізнаності.

Приклад відповіді: Спочатку я б визначив глухий кут за допомогою SQL Server sys.dm_tran_locks і графи блокувань. Потім я б проаналізував порядок доступу до ресурсів і рефакторинг процедури для отримання блокувань у послідовній послідовності. На попередній роботі я також реалізував логіку повторних спроб для уражених транзакцій і запланував регулярний моніторинг для раннього виявлення подібних закономірностей.

Підсумуйте цей пост за допомогою: