Кілька років тому я думав, що DELETE і TRUNCATE — це майже одне й те саме. Обидва ж видаляють рядки, правда?
Поки одного дня мені не довелося очистити 10 мільйонів рядків з таблиці.
Як справжній новачок, я впевнено набрав у SQL:
DELETE FROM big_table;
Запит виконувався… і виконувався… і виконувався.
⚡ Система почала гальмувати.
⚡ Таблиця заблокувалася.
⚡ Інші задачі почали падати.
Усе через те, що я обрав DELETE, тоді як потрібно було використати TRUNCATE.
Цей болючий досвід дав мені урок, який повинен знати кожен SQL-розробник:
❌ DELETE vs ✅ TRUNCATE
На перший погляд, обидва видаляють дані з таблиці. Але під капотом вони дуже різні.
1. DELETE → DML (Data Manipulation Language)
- Видаляє рядки по одному
- Можна використовувати WHERE, щоб фільтрувати конкретні рядки
- Генерує лог для кожного видаленого рядка → повільно при великій кількості даних
- Підтримує rollback, якщо обгорнути в транзакцію
Приклад: Видалити лише неактивних користувачів:
DELETE FROM users
WHERE status = 'inactive';
👉 Ідеально, коли потрібен контроль над тим, які рядки видаляти.
2️⃣ TRUNCATE → DDL (Data Definition Language)
- Видаляє всі рядки миттєво
- WHERE не дозволяється (все або нічого)
- Скидає identity/auto-increment колонки до початкового значення
- Мінімальне логування → значно швидше
- Автокоміт у більшості баз даних → неможливо відкотити
Приклад: Очистити всю таблицю staging перед повторним завантаженням:
TRUNCATE TABLE staging_orders;
👉 Ідеально, коли потрібен контроль над тим, які рядки видаляти.
2. TRUNCATE → DDL (Data Definition Language)
- Видаляє всі рядки миттєво
- WHERE не дозволяється (все або нічого)
- Скидає identity/auto-increment колонки до початкового значення
- Мінімальне логування → значно швидше
- Автокоміт у більшості баз даних → неможливо відкотити
Приклад: Очистити всю таблицю staging перед повторним завантаженням:
TRUNCATE TABLE staging_orders;
👉 Ідеально, коли важлива швидкість і не цікавлять індивідуальні видалення рядків.
🔍 Швидке порівняння

⚡ Реальний приклад
Уявіть таблицю staging, яка завантажується щоночі:
- Якщо використати DELETE, доведеться сканувати мільйони рядків і система почне гальмувати.
- Якщо використати TRUNCATE, таблиця очищується миттєво і готова до нового завантаження.
Але якщо потрібно видалити лише погані записи за вчорашній день — тоді має сенс DELETE з WHERE.
💡 Урок
- Потрібен контроль → використовуйте DELETE.
- Потрібна швидкість → використовуйте TRUNCATE.
SQL — це не просто знання команд, а уміння знати, коли яку застосовувати.
✅ Наступного разу, коли чиститимеш таблицю, запитай себе:
- Потрібно вибірково видаляти рядки? → DELETE
- Потрібна просто чиста таблиця? → TRUNCATE
Твоя система (і колеги) скажуть тобі спасибі.
👉 Твоя черга:
Чи траплялося тобі використовувати неправильну SQL-команду і шкодувати про це потім?
Якщо цей матеріал був корисним:
👍 Постав clap, якщо сподобалося!
🧠 Хочеш більше про SQL, дата-інженерію та сучасний стек обробки даних? Підписуйся на мене на Medium: @workwithalam
🔗 З’єднаймося в LinkedIn — ділюся практичними порадами, інсайтами індустрії та реальними уроками з роботи з даними:www.linkedin.com/in/sahil-alam-680986173/
Дякую за прочитання! 🙌
Хештеги для посту:
#SQL #DatabaseTips #DeleteVsTruncate #SQLPerformance #DataEngineering #DBA #LearningSQL #BackendDevelopment #DataManagement #TechTips #QueryOptimization #DatabaseDesign #SQLBasics #DataLife #SoftwareEngineering
ОРИГІНАЛ СТАТТІ:🚀 DELETE vs TRUNCATE in SQL: The Lesson I Learned the Hard Way
АВТОР СТАТІ:Sahil Alam
🚀Долучайтесь до нашої спільноти Telegram:
🚀Долучайтесь до нашої спільноти FaceBook:
🚀Долучайтесь до нашої спільноти Twiter X:
