Різниця між таблицею скидання та таблицею усічень?


80

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


2
Ви можете отримати відповідь на stackoverflow.com/questions/2012974/…
php

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

Відповіді:


102

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

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

Якщо ви дійсно хочете видалити визначення таблиць , а також дані, просто опустіть таблиці.

Для отримання додаткової інформації дивіться цю статтю MSDN


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


87

DROP TABLE видаляє таблицю.

TRUNCATE TABLE спорожнює його, але залишає свою структуру для майбутніх даних.


4
Чоловіче, тут набагато більше, ніж це ти знаєш;)
Девід Олдрідж

21
Це ключова різниця.
ceejayoz

26

DROP і TRUNC роблять різні речі:

ТРАНСКУЛЬТНА ТАБЛИЦЯ

Видаляє всі рядки з таблиці без реєстрації видалення окремих рядків. TRUNCATE TABLE подібний до виразу DELETE без речення WHERE; однак TRUNCATE TABLE швидший і використовує менше системних і транзакційних ресурсів.

ТАБЛИЦЯ КРАПЛЕННЯ

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

Що стосується швидкості, різниця повинна бути невеликою. І в будь-якому випадку, якщо вам зовсім не потрібна структура таблиці, звичайно використовуйте DROP.


20

Я думаю, ви маєте на увазі різницю між ВИДАЛИТИ ТАБЛИЦЮ та ВІДРУЗИТИ СТОЛ.

ТАБЛИЦЯ КРАПЛЕННЯ

видалити таблицю з бази даних.

ВИДАЛИТИ ТАБЛИЦЮ

без умови видалити всі рядки. Якщо є тригер та посилання, це буде оброблятися для кожного рядка. Також індекс буде модифікований, якщо він є.

ТРАНСКУЛЬТНА ТАБЛИЦЯ

встановіть кількість рядків на нуль і без реєстрації кожного рядка. Що це набагато швидше, ніж інші обидва.


4
set the row count zeroвін фактично встановлює значення ідентичності назад до початкового значення насіння ідентичності.
Філіп Де Вос,

11

Жодна з цих відповідей не вказує на важливу різницю щодо цих двох операцій. Скидання таблиці - це операція, яку можна повернути назад. Однак усікання не може бути повернуто назад ['ТРАНСКАТСЬКУ ТАБЛИЦЮ також можна повернути назад] Таким чином, скидання дуже великої таблиці може бути дуже дорогим, якщо є багато рядків, оскільки всі вони повинні бути записані у тимчасовий простір, якщо ви вирішите повернути його назад.

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

Важливо зауважити, що усекання просто видаляє дані, залишаючи таблицю, тоді як drop фактично видалить дані та саму таблицю. (припускаючи, що зовнішні ключі не виключають таку дію)


2
Це не повністю правильно, TRUNCATE можна відкотити у сенсі BEGIN TRANSACTION, TRUNCATE TABLE, ROLLBACK, лише не в сенсі "відновлення журналів транзакцій". У ньому реєструється вивільнення сторінок.
Mark Sowul

1
-1 DROP- це в основному просто TRUNCATEнаступне видалення метаданих таблиці з системних таблиць. Подивіться це питання тут
Martin Smith

5

Таблиця DROP

DROP TABLE [table_name];

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

ВИДАЛИТИ таблицю

DELETE FROM [table_name]
WHERE [condition];

DELETE FROM [table_name];

Команда DELETE - це команда DML. Він може бути використаний для видалення всіх рядків або деяких рядків із таблиці на основі умови, зазначеної в реченні WHERE. Він виконується за допомогою блокування рядка, кожен рядок у таблиці заблокований для видалення. Він підтримує журнал транзакцій, тому він повільніший за TRUNCATE. Операції DELETE можна відкотити.

ТРАНСКАТ Таблиця

TRUNCATE TABLE [table_name];

Команда TRUNCATE видаляє всі рядки з таблиці. Він не реєструє видалення кожного рядка, натомість реєструє вивільнення сторінок даних таблиці, що робить це швидшим, ніж DELETE. Він виконується за допомогою блокування таблиці, а вся таблиця блокується для видалення всіх записів. Це команда DDL. Операції TRUNCATE не можна відкотити.


Це неправильно. Truncate and Drop можна відкотити назад. СТВОРИТИ ТАБЛИЦУ dbo.TestTruncate (ID INT) ВСТАВИТИ В dbo.TestTruncate (ID) ЦЕННОСТІ (1) ВСТАВИТЬ В dbo.TestTruncate (ID) ЦЕННОСТІ (2) ВСТАВИТЬ В dbo.TestTruncate (ID) ЦІННОСТІ (3) НАЧАТИ ДАННУ ТРАНЗУВАТИ .TESTTruncate DROP TABLE dbo.TestTruncate ROLLBACK SELECT * FROM dbo.TestTruncate DROP TABLE dbo.TestTruncate
InbetweenWeekends

4

TRUNCATE TABLE зберігає всі ваші старі індексації та все інше. DROP TABLE, очевидно, позбувся б таблиці і вимагав би її відтворення пізніше.


3

Drop повністю позбавляється таблиці, також видаляючи визначення. Truncate спорожнює таблицю, але не позбавляється від визначення.


3

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

Якщо він вам більше не потрібен, киньте його, щоб він не захаращував вашу схему.


3

ВИДАЛИТИ TableA замість TRUNCATE TableA? Поширеною помилкою є те, що вони роблять те саме. Не так. Насправді між ними є багато відмінностей.

DELETE - це записана операція на основі кожного рядка. Це означає, що видалення кожного рядка реєструється та фізично видаляється.

Ви можете ВИДАЛИТИ будь-який рядок, який не буде порушувати обмеження, залишаючи на місці зовнішній ключ або будь-який інший контракт.

TRUNCATE - це також зареєстрована операція, але іншим способом. TRUNCATE реєструє вивільнення сторінок даних, на яких існують дані. Вивільнення сторінок даних означає, що ваші рядки даних все ще насправді існують на сторінках даних, але екстенти були позначені як порожні для повторного використання. Ось що робить TRUNCATE швидшою операцією для виконання через DELETE.

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

TRUNCATE скине будь-які стовпці ідентичності до початкового значення за замовчуванням.


Msgstr "Видалення кожного рядка реєструється та фізично видаляється" . Ви впевнені, що це правильно? У блозі MSDN сказано, що їх не відразу очищають. Так працює і Postgres.
Бред Кох,

2

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


Зрізання відбувається швидше, оскільки транзакція не реєструється (я вважаю), тому ви не зможете відкотитись із усіченого фрагмента, як це можна зробити при видаленні.
Steven Murawski

2

У мене є виправлення для одного із наведених вище тверджень ... "усікання не може бути відкатане"

Усічку можна відкотити назад. Є деякі випадки, коли ви не можете зробити таблицю зрізання або скидання, наприклад, коли у вас є посилання на зовнішній ключ. Для такого завдання, як щомісячна звітність, я, мабуть, просто опустив би таблицю, коли мені це більше не було потрібно. Якби я робив цю зведену звітність частіше, то я б, напевно, тримав таблицю і використовував усіку.

Сподіваюся, це допоможе, ось ще декілька відомостей, які вам можуть стати в нагоді ...

Детальніше див. У наступній статті: http://sqlblog.com/blogs/denis_gobo/archive/2007/06/13/1458.aspx

Також, щоб отримати докладнішу інформацію про видалення та скорочення, див. Цю статтю: http://www.sql-server-performance.com/faq/delete_truncate_difference_p1.aspx

Дякую! Джефф


2

TRUNCATE TABLE функціонально ідентичний оператору DELETE без пропозиції WHERE: обидва видаляють усі рядки таблиці. Але TRUNCATE TABLE швидший і використовує менше системних та транзакційних ресурсів, ніж DELETE.

Оператор DELETE видаляє рядки по одному і записує запис у журналі транзакцій для кожного видаленого рядка. TRUNCATE TABLE видаляє дані шляхом вивільнення сторінок даних, що використовуються для зберігання даних таблиці, і лише звільнення сторінок записуються в журнал транзакцій.

TRUNCATE TABLE видаляє всі рядки з таблиці, але структура таблиці та її стовпці, обмеження, індекси тощо залишаються. Лічильник, який використовується ідентифікатором для нових рядків, скидається до початкового для стовпця. Якщо ви хочете зберегти лічильник посвідчень, використовуйте замість цього ВИДАЛИТИ. Якщо ви хочете видалити визначення таблиці та її дані, використовуйте оператор DROP TABLE.

Ви не можете використовувати TRUNCATE TABLE в таблиці, на яку посилається обмеження FOREIGN KEY; натомість використовуйте оператор DELETE без речення WHERE. Оскільки TRUNCATE TABLE не реєструється, він не може активувати тригер.

TRUNCATE TABLE не можна використовувати на таблицях, що беруть участь в індексованому поданні.

З http://msdn.microsoft.com/en-us/library/aa260621(SQL.80).aspx


2

У стандарті SQL таблиця DROP видаляє таблицю, а схема таблиці - TRUNCATE видаляє всі рядки.


1

Відповіді тут відповідають запитанню, але я збираюся відповісти на питання, яке ви не задавали. "Чи слід використовувати усікання чи видалення?" Якщо ви видаляєте всі рядки з таблиці, вам, як правило, потрібно скоротити, оскільки це набагато швидше. Чому це набагато швидше? Принаймні у випадку з Oracle, він скидає позначку високої води . В основному це розмежування даних і дозволяє базі даних повторно використовувати їх для чогось іншого.


1

ВИДАЛИТИ ВІД TRUNCATE

  1. Оператор DELETEвидаляє рядки по одному і записує запис у журналі транзакцій для кожного видаленого рядка. TRUNCATE TABLEвидаляє дані шляхом звільнення сторінок даних, що використовуються для зберігання даних таблиці, і записує лише звільнення сторінок у журналі транзакцій
  2. Ми можемо використовувати WHEREречення in, DELETEале TRUNCATEви не можете його використовувати
  3. Коли DELETEоператор виконується за допомогою блокування рядка, кожен рядок у таблиці блокується для видалення. TRUNCATE TABLEзавжди блокує таблицю та сторінку, але не кожен рядок
  4. Після виконання DELETEоператора таблиця все ще може містити порожні сторінки. Якщо в операції видалення не використовується блокування таблиці, таблиця (купа) міститиме багато порожніх сторінок. Для індексів операція видалення може залишати порожні сторінки позаду, хоча ці
    сторінки буде швидко вивільнено за допомогою фонового очищення
  5. TRUNCATE TABLE видаляє всі рядки з таблиці, але структура таблиці та її стовпці, обмеження, індекси тощо залишаються
  6. DELETEтвердження не RESEEDстовпець ідентифікаторів , але TRUNCATEпро стовпціRESEEDSIDENTITY
  7. Ви не можете використовувати TRUNCATE TABLEтаблиці, які:
    1. На них посилається FOREIGN KEYобмеження. (Ви можете усічити таблицю, яка має зовнішній ключ, який посилається на себе.)
    2. Беріть участь в індексованому поданні.
    3. Опубліковуються за допомогою транзакційної реплікації або реплікації злиття
  8. TRUNCATE TABLE не може активувати тригер, оскільки операція не реєструє окремі видалення рядків

1

Перекиньте всю таблицю та всю її структуру

truncate видалити всі рядки з таблиці, воно відрізняється від видалення тим, що воно також видаляє індекси рядків


1

Видалити заяву

Delete Statement видалення рядків таблиці та повернення кількості рядків видаляється з таблиці. У цьому операторі ми використовуємо пропозицію where для видалення даних з таблиці

  • Оператор "Видалити" повільніший за оператор "Зрізати", оскільки він видаляє записи по одному

Заява про усічення

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

  • Це швидше, ніж оператор "Видалити", оскільки він видалив усі записи з таблиці
  • Оператор усічення не повертає число рядків, видалених з таблиці

Виписка

Оператор Drop видалив усі записи, а також структуру таблиці


0

ВИДАЛИТИ

Команда DELETE використовується для видалення рядків із таблиці. Застереження WHERE можна використовувати лише для видалення деяких рядків. Якщо умова WHERE не вказана, усі рядки буде видалено. Після виконання операції ВИДАЛЕННЯ вам потрібно УВІДМИТИ або ЗВЕРНІТЬ транзакцію, щоб зробити зміну постійною або скасувати її.

ОБРОБИТИ

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

З: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.