Яка різниця між TRUNCATE
і DELETE
в SQL?
Якщо ваша відповідь залежить від платформи, будь ласка, вкажіть це.
Яка різниця між TRUNCATE
і DELETE
в SQL?
Якщо ваша відповідь залежить від платформи, будь ласка, вкажіть це.
Відповіді:
Ось перелік відмінностей. Я наголосив на особливостях Oracle, і, сподіваємось, спільнота також може додати до певної різниці інших постачальників. Відмінності, характерні для більшості постачальників, можуть знаходитись безпосередньо під заголовками, а відмінності виділяються нижче.
Якщо ви хочете швидко видалити всі рядки з таблиці, і ви дійсно впевнені, що хочете це зробити, і у вас немає сторонніх ключів проти таблиць, то TRUNCATE, ймовірно, буде швидше, ніж DELETE .
Необхідно розглянути різні специфічні для системи питання, як це детально описано нижче.
Видалити - це DML, скорочення - DDL ( що таке DDL та DML? )
Змінна за постачальником
SQL * Сервер
Обрізання можна відкотити назад.
PostgreSQL
Обрізання можна відкотити назад.
Oracle
Оскільки TRUNCATE є DDL, це включає два коміти, один до і після виконання оператора. Тому обрізання не можна повернути назад, і невдача в процесі урізання все одно призведе до зобов'язання.
Однак дивіться Flashback нижче.
Видалення не відновлює простір, Обрізання відновлює простір
Oracle
Якщо ви використовуєте пункт REUSE STORAGE, то сегменти даних не виділяються, що може бути незначно ефективнішим, якщо таблицю потрібно перезавантажити даними. Значок високої води скидається.
Видалити можна використовувати для видалення всіх рядків або лише підмножини рядків. Урізання видаляє всі рядки.
Oracle
Коли таблиця розділяється, окремі розділи можуть бути усічені окремо, таким чином можливе часткове видалення всіх даних таблиці.
Видалити можна застосувати до таблиць і таблиць всередині кластеру. Скорочення стосується лише таблиць або всього кластеру. (Може бути специфічним для Oracle)
Oracle
Видалення не впливає на ідентифікатор об'єкта даних, але усікання призначає новий ідентифікатор об’єкта даних, якщо ніколи не було вставки проти таблиці з моменту її створення. Навіть одна вкладена вставка, яка повертається назад, призведе до присвоєння нового ідентифікатора об'єкта даних при усіканні .
Flashback працює в рамках видалення, але усікання запобігає спалаху до станів перед операцією.
Однак з 11gR2 функція FLASHBACK ARCHIVE дозволяє це, за винятком Express Edition
Використання FLASHBACK в Oracle http://docs.oracle.com/cd/E11882_01/appdev.112/e41502/adfns_flashback.htm#ADFNS638
Змінна
Oracle
Видалення може бути надано на столі іншому користувачеві або ролі, але усікати неможливо без використання DROP ANY TABLE grant.
Видалення створює невелику кількість повторень та велику кількість скасування. Урізання утворює незначну кількість кожного.
Oracle
Операція обрізання знову робить непридатними індекси. Видалення не робить.
Урізання не може бути застосоване, коли включений зовнішній ключ посилається на таблицю. Лікування видаленням залежить від конфігурації сторонніх ключів.
Oracle
Обрізання вимагає ексклюзивного блокування таблиці, для видалення потрібен загальний блочний стіл. Отже, вимкнення блокування таблиць - це спосіб запобігання скороченню операцій на столі.
Тригери DML не спрацьовують на усікання.
Oracle
Доступні тригери DDL.
Oracle
Скорочення не може бути видане через посилання на базу даних.
SQL * Сервер
Скорочення скидає послідовність для типів стовпців IDENTITY, видалення не робить.
У більшості реалізацій DELETE
оператор може повернути клієнту рядки, які були видалені.
наприклад, у підпрограмі Oracle PL / SQL ви можете:
DELETE FROM employees_temp
WHERE employee_id = 299
RETURNING first_name,
last_name
INTO emp_first_name,
emp_last_name;
Різниця між усіченням та видаленням вказана нижче:
+----------------------------------------+----------------------------------------------+
| Truncate | Delete |
+----------------------------------------+----------------------------------------------+
| We can't Rollback after performing | We can Rollback after delete. |
| Truncate. | |
| | |
| Example: | Example: |
| BEGIN TRAN | BEGIN TRAN |
| TRUNCATE TABLE tranTest | DELETE FROM tranTest |
| SELECT * FROM tranTest | SELECT * FROM tranTest |
| ROLLBACK | ROLLBACK |
| SELECT * FROM tranTest | SELECT * FROM tranTest |
+----------------------------------------+----------------------------------------------+
| Truncate reset identity of table. | Delete does not reset identity of table. |
+----------------------------------------+----------------------------------------------+
| It locks the entire table. | It locks the table row. |
+----------------------------------------+----------------------------------------------+
| Its DDL(Data Definition Language) | Its DML(Data Manipulation Language) |
| command. | command. |
+----------------------------------------+----------------------------------------------+
| We can't use WHERE clause with it. | We can use WHERE to filter data to delete. |
+----------------------------------------+----------------------------------------------+
| Trigger is not fired while truncate. | Trigger is fired. |
+----------------------------------------+----------------------------------------------+
| Syntax : | Syntax : |
| 1) TRUNCATE TABLE table_name | 1) DELETE FROM table_name |
| | 2) DELETE FROM table_name WHERE |
| | example_column_id IN (1,2,3) |
+----------------------------------------+----------------------------------------------+
ДРОП
Команда DROP видаляє таблицю з бази даних. Усі рядки, індекси та привілеї таблиць також будуть видалені. Жодні триггери DML не запускаються. Операцію не можна повернути назад.
TRUNCATE
TRUNCATE видаляє всі рядки з таблиці. Операцію неможливо повернути назад, і тригери не будуть активовані. Таким чином, TRUNCATE швидше і не використовує стільки місця для скасування, як DELETE. Блокування рівня таблиці буде додано при обрізанні.
УДАЛИТИ
Команда DELETE використовується для видалення рядків із таблиці. Заява WHERE може використовуватися лише для видалення деяких рядків. Якщо умови WHERE не вказані, всі рядки будуть видалені. Виконуючи операцію DELETE, вам потрібно ЗДОРОВИТИ або РОЗВИЩИТИ транзакцію, щоб зробити зміну постійною або скасувати її. Зауважте, що ця операція призведе до запуску всіх тригерів DELETE на столі. Блокування рівня рядка буде додано при видаленні.
Від: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands
Усі хороші відповіді, до яких я повинен додати:
Оскільки TRUNCATE TABLE
DDL ( Мова визначення даних ), а не команда DML (" Маніпуляція з даними" ), Delete Triggers
не виконується.
Підсумок видалення Vs Truncate на SQL-сервері.
Для повної статті перейдіть за цим посиланням: http://codaffection.com/sql-server-article/delete-vs-truncate-in-sql-server/
Взяте зі статті дотнет-мобу: Видалити Vs Truncate у SQL Server
За допомогою SQL Server або MySQL, якщо є ПК з автоматичним збільшенням, усікання скине лічильник.
DBCC CHECKIDENT (table_name, RESEED, 1)
Правильне значення "усікання не записує". Я б пішов далі:
Скорочення не виконується в контексті транзакції.
Перевага скорочення скорочення над видаленням має бути очевидним. Ця перевага коливається від тривіальної до величезної, залежно від вашої ситуації.
Однак я бачив, як усікання ненавмисно порушує референтну цілісність та порушує інші обмеження. Потужність, яку ви отримуєте, змінюючи дані поза трансакцією, має бути збалансована проти відповідальності, яку ви успадковуєте, коли ходите по канату без мережі.
TRUNCATE
є оператором DDL, тоді DELETE
як оператором DML. Нижче наведені відмінності між цими двома:
Оскільки оператор TRUNCATE
DDL ( мова визначення даних ), він не вимагає зобов'язання робити зміни постійними. І це є причиною того, що рядки, видалені усіканням, не можна повернути назад. З іншого боку, DELETE
це висловлювання DML ( мова маніпулювання даними ), отже, вимагає явної фіксації, щоб зробити його ефект постійним.
TRUNCATE
завжди видаляє всі рядки з таблиці, залишаючи таблицю порожньою, а структуру таблиці недоторканою, тоді як DELETE
може умовно видаляти, якщо використовується застереження де
Рядки, видалені TRUNCATE TABLE
оператором, не можна відновити, і ви не можете вказати пункт де у TRUNCATE
виписці.
TRUNCATE
оператори не спрацьовують тригери, на відміну від тригера видалення на DELETE
операторі
Ось дуже гарне посилання, що стосується теми.
Так, DELETE повільніше, TRUNCATE швидше. Чому?
DELETE повинен прочитати записи, перевірити обмеження, оновити блок, оновити індекси та створити повтор / скасувати. На все це потрібен час.
TRUNCATE просто налаштовує вказівник у базі даних для таблиці (Висока марка води) та пуф! даних немає.
Це специфічно для Oracle, AFAIK.
TRUNCATE
TRUNCATE SQL-запит видаляє всі рядки з таблиці, не реєструючи окремі видалення рядків.
УДАЛИТИ
Для виконання черги DELETE в цільовій таблиці потрібні дозволи видалення. Якщо вам потрібно використовувати пункт WHERE у DELETE, необхідні дозволи вибору також потрібні.
Якщо випадково ви видалили всі дані з таблиці за допомогою Видалити / скоротити. Ви можете відкатати здійснену транзакцію. Відновіть останню резервну копію та запустіть журнал транзакцій до моменту, коли відбудеться Видалення / скорочення.
Нижче наведена відповідна інформація з публікації в блозі :
Працюючи над базою даних, ми використовуємо Видалити і скорочувати, не знаючи відмінностей між ними. У цій статті ми обговоримо різницю між видаленням і скороченням у Sql.
Видалити:
- Видалити - це команда DML.
- Оператор видалення виконується за допомогою блокування рядків, кожен рядок у таблиці заблокований для видалення.
- Ми можемо вказати фільтри, де пункт.
- Він видаляє вказані дані, якщо там існує умова.
- Видалити активізатор діяльності, оскільки операція реєструється індивідуально.
- Повільніше, ніж обрізати, оскільки він зберігає журнали
Обрізати
- Урізати - це команда DDL.
- Обрізана таблиця завжди блокує таблицю та сторінку, але не кожен рядок. Оскільки вона видаляє всі дані.
- Неможливо використати стан.
- Він видаляє всі дані.
- Обрізана таблиця не може активувати тригер, оскільки операція не реєструє окремі видалення рядків.
- Швидше в продуктивності, оскільки він не зберігає журналів.
Примітка: Видалення та обрізання обох можна повернути назад при використанні з транзакцією. Якщо трансакція виконана, це означає, що здійснено, ми не можемо відкатати команду «Відрізати», але ми все одно можемо відкатати команду «Видалити» з файлів журналу, оскільки видалити запис записує їх у журнал «Файл журналу», якщо це потрібно для відкату в майбутньому з файлів журналу.
Якщо у вас є обмеження для зовнішнього ключа, яке стосується таблиці, яку ви намагаєтеся скоротити, це не буде працювати, навіть якщо в таблиці, що посилається, немає в ній даних. Це тому, що перевірка зовнішніх ключів проводиться з DDL, а не з DML. Це можна усунути, тимчасово відключивши обмеження (-ів) іноземного ключа до таблиці.
Видалити таблицю - це зареєстрована операція. Таким чином, видалення кожного рядка входить у журнал транзакцій, що робить його повільним. Урізана таблиця також видаляє всі рядки в таблиці, але вона не записуватиме видалення кожного рядка, замість цього вона записує розстановку сторінок даних таблиці, що робить її швидшою.
~ Якщо випадково ви видалили всі дані з таблиці за допомогою Видалити / скоротити. Ви можете відкатати здійснену транзакцію. Відновіть останню резервну копію та запустіть журнал транзакцій до моменту, коли відбудеться Видалення / скорочення.
У SQL Server 2005 я вважаю, що ви можете відкати усікання
УДАЛИТИ
Команда DELETE використовується для видалення рядків із таблиці. Заява WHERE може використовуватися лише для видалення деяких рядків. Якщо умови WHERE не вказані, всі рядки будуть видалені. Виконуючи операцію DELETE, вам потрібно ЗДОРОВИТИ або РОЗВИЩИТИ транзакцію, щоб зробити зміну постійною або скасувати її. Зауважте, що ця операція призведе до запуску всіх тригерів DELETE на столі.
TRUNCATE
TRUNCATE видаляє всі рядки з таблиці. Операцію неможливо повернути назад, і тригери не будуть активовані. Таким чином, TRUCATE швидше і не використовує стільки місця для скасування, як DELETE.
ДРОП
Команда DROP видаляє таблицю з бази даних. Усі рядки, індекси та привілеї таблиць також будуть видалені. Жодні триггери DML не запускаються. Операцію не можна повернути назад.
DROP і TRUNCATE - команди DDL, тоді як DELETE - команда DML. Тому операції DELETE можна повернути назад (скасувати), тоді як операції DROP та TRUNCATE не можна повернути назад.
Від: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands
TRUNCATE можна повернути назад, якщо він завершений в транзакції.
Будь ласка, перегляньте дві посилання нижче та протестуйте себе: -
TRUNCATE vs. DELETE - одне з сумнівних питань під час інтерв'ю SQL. Просто переконайтесь, що ви правильно пояснили його інтерв'юєру, інакше це може коштувати вам роботи. Проблема полягає в тому, що не багато хто знає, тому, швидше за все, вони вважатимуть відповідь неправильним, якщо ви скажете їм, що ТАК Truncate можна відкотити назад.
Невелике виправлення вихідної відповіді - видалення також генерує значну кількість повторень (оскільки скасування захищено повторно). Це видно з результатів автоматичного відстеження:
SQL> delete from t1;
10918 rows deleted.
Elapsed: 00:00:00.58
Execution Plan
----------------------------------------------------------
0 DELETE STATEMENT Optimizer=FIRST_ROWS (Cost=43 Card=1)
1 0 DELETE OF 'T1'
2 1 TABLE ACCESS (FULL) OF 'T1' (TABLE) (Cost=43 Card=1)
Statistics
----------------------------------------------------------
30 recursive calls
12118 db block gets
213 consistent gets
142 physical reads
3975328 redo size
441 bytes sent via SQL*Net to client
537 bytes received via SQL*Net from client
4 SQL*Net roundtrips to/from client
2 sorts (memory)
0 sorts (disk)
10918 rows processed
Ось моя детальна відповідь на різницю між DELETE та TRUNCATE у SQL Server
• Видалити дані : Перше, що спочатку обидва можна використовувати для видалення рядків із таблиці.
Але DELETE може бути використаний для видалення рядків не тільки з таблиці, але й з VIEW або результату OPENROWSET або OPENQUERY відповідно до можливостей постачальника.
• З пункту : З DELETE ви також можете видалити рядки з однієї таблиці / view / rowset_function_limited на основі рядків з іншої таблиці, використовуючи інший пункт FROM. У цьому пункті ВІД можна також записати нормальні умови JOIN. Насправді ви можете створити операцію DELETE з оператора SELECT, який не містить функцій сукупності, замінивши SELECT на DELETE та видаливши імена стовпців.
З TRUNCATE ви не можете цього зробити.
• ДЕ : У TRUNCATE не можуть бути умови, де УСЕ, але DELETE може. Це означає, що за допомогою TRUNCATE ви не можете видалити конкретний рядок або конкретну групу рядків. TRUNCATE TABLE аналогічний оператору DELETE, не має пункту WHERE.
• Продуктивність : TRUNCATE TABLE швидше і використовує менше ресурсів системи та журналу транзакцій. І однією з причин є блокування, які використовуються будь-якими твердженнями. Оператор DELETE виконується за допомогою блокування рядків, кожен рядок у таблиці заблокований для видалення. TRUNCATE TABLE завжди блокує таблицю та сторінку, але не кожен рядок.
• Журнал транзакцій : оператор DELETE вилучає рядки по одному та робить окремі записи в журналі транзакцій для кожного рядка.
TRUNCATE TABLE видаляє дані, розміщуючи сторінки даних, які використовуються для зберігання даних таблиці, і записує лише розсилки сторінок у журнал транзакцій.
• Сторінки : Після виконання оператора DELETE таблиця може містити порожні сторінки. TRUNCATE видаляє дані, розміщуючи сторінки даних, які використовуються для зберігання даних таблиці.
• Тригер : TRUNCATE не активує тригери видалення на столі. Тому ви повинні бути дуже обережними під час використання TRUNCATE. Ніколи не слід використовувати TRUNCATE, якщо в таблиці визначено тригер видалення, щоб зробити якісь автоматичні дії очищення або реєстрації, коли рядки видаляються.
• Стовпець ідентичності : З TRUNCATE, якщо таблиця містить стовпчик ідентичності, лічильник для цього стовпця скидається на значення насіння, визначене для стовпця. Якщо насіння не було визначено, використовується значення за замовчуванням 1. DELETE не скидає лічильник ідентичності. Отож, якщо ви хочете зберегти лічильник посвідчень, замість цього використовуйте DELETE.
• Реплікація : DELETE можна використовувати проти таблиці, що використовується в транзакційній реплікації або об'єднанні реплікації.
Хоча TRUNCATE не можна використовувати проти таблиць, що беруть участь у транзакційній реплікації або об'єднанні реплікації.
• Відкат : DELETE-заяву можна повернути назад.
TRUNCATE також можна повернути назад, якщо він укладений у блок TRANSACTION і сеанс не закритий. Після завершення сеансу ви не зможете відмовити TRUNCATE.
• Обмеження : Оператор DELETE може вийти з ладу, якщо він порушує тригер або намагається видалити рядок, на який посилаються дані, в іншій таблиці з обмеженням FOREIGN KEY. Якщо DELETE видаляє декілька рядків, а будь-який із видалених рядків порушує тригер або обмеження, оператор скасовується, помилка повертається і жодні рядки не видаляються.
І якщо DELETE використовується проти View, цей перегляд повинен бути переглядом оновлених. TRUNCATE не можна використовувати проти таблиці, що використовується в індексованому поданні.
TRUNCATE не можна використовувати проти таблиці, на яку посилається обмеження FOREIGN KEY, за винятком випадків, коли таблиця, що містить зовнішній ключ, на яку посилається сама.
DECLARE @ai as bigint
SET @ai =IDENT_CURRENT('tablename')
TRUNCATE TABLE tablename
DBCC checkident('tablename', RESEED, @ai)
DELETE Заява: Ця команда видаляє лише рядки з таблиці, виходячи з умови, наведеної в пункті де, або видаляє всі рядки з таблиці, якщо жодна умова не вказана. Але це не звільняє простір, що містить стіл.
Синтаксис оператора SQL DELETE:
ВИДАЛИТИ ВІД таблиці_назви [WHERE умова];
Оператор TRUNCATE: Ця команда використовується для видалення всіх рядків із таблиці та звільнення місця, що містить таблицю.
УДАЛИТИ
DELETE is a DML command DELETE you can rollback Delete = Only Delete- so it can be rolled back In DELETE you can write conditions using WHERE clause Syntax – Delete from [Table] where [Condition]
TRUNCATE
TRUNCATE is a DDL command You can't rollback in TRUNCATE, TRUNCATE removes the record permanently Truncate = Delete+Commit -so we can't roll back You can't use conditions(WHERE clause) in TRUNCATE Syntax – Truncate table [Table]
Для більш детальної інформації відвідайте
http://www.zilckh.com/what-is-the-difference-between-truncate-and-delete/
Ще одна відмінність двох операцій полягає в тому, що якщо таблиця містить стовпчик ідентичності, лічильник для цього стовпця скидається 1 (або до значення насіння, визначеного для стовпця) у розділі TRUNCATE. DELETE не впливає на це.
Коротше кажучи, усікання нічого не записує (так це набагато швидше, але його не можна відмінити), тоді як видалення реєструється (і може бути частиною більшої транзакції, буде відкат тощо). Якщо у вас є дані, які ви не бажаєте в таблиці в девізі, зазвичай краще усікати, оскільки ви не ризикуєте заповнити журнал транзакцій
Найважливішою причиною цього є те, коли вам потрібно оновити дані в багатомільйонній таблиці рядків, але не хочете їх перебудовувати. "Видалити *" триватиме назавжди, тоді як ефективність дії Truncate буде незначною.
Неможливо зробити DDL через mblink.
Справа в тому, що усікання нічого не записує в SQL Server. усікання не записує жодної інформації, але вона реєструє сторінку розміщення даних для таблиці, на якій ви запустили TRUNCATE.
і усічена запис може бути відкатаною, якщо ми визначимо транзакцію на початку і зможемо відновити усічену запис після відкату. Але не можна відновити усічені записи з резервної копії журналу транзакцій після вчиненої усіченої транзакції.
Срізати можна також на відкат тут
begin Tran
delete from Employee
select * from Employee
Rollback
select * from Employee
Скорочення та видалення в SQL - це дві команди, які використовуються для видалення або видалення даних із таблиці. Обидві команди Sql, хоч і досить базові за своєю суттю, можуть створити багато проблем, поки ви не ознайомитеся з деталями перед його використанням. Неправильний вибір команди може призвести або до дуже повільного процесу, або навіть до підірвання сегмента журналу, якщо потрібно видалити занадто багато даних і сегмента журналу недостатньо. Ось чому важливо знати, коли використовувати команду для скорочення і видалення в SQL, але перед тим, як використовувати їх, ви повинні знати про відмінності між скороченнями і видаленням, і, виходячи з них, ми повинні мати можливість з'ясувати, коли DELETE є кращим варіантом для видалення дані або TRUNCATE повинні використовуватися для очищення таблиць.
Перевірте, натисніть тут
Ще одна різниця, характерна для сервера microsoft sql, полягає в тому, що delete
ви можете використовувати output
оператор для відстеження, які записи були видалені, наприклад:
delete from [SomeTable]
output deleted.Id, deleted.Name
Ви не можете цього зробити truncate
.