У мене є кілька таблиць, які я будую як частину зведеного звіту. Мені вони згодом взагалі не потрібні. Хтось згадав усікати їх, оскільки це було б швидше.
У мене є кілька таблиць, які я будую як частину зведеного звіту. Мені вони згодом взагалі не потрібні. Хтось згадав усікати їх, оскільки це було б швидше.
Відповіді:
Видалення записів з таблиці реєструє кожне видалення та виконує тригери видалення для видалених записів. Truncate - це потужніша команда, яка очищає таблицю без реєстрації кожного рядка. SQL Server забороняє скоротити таблицю із зовнішніми ключами, що посилаються на неї, через необхідність перевірки зовнішніх ключів у кожному рядку.
Truncate, як правило, надшвидкий, ідеально підходить для очищення даних з тимчасової таблиці. Це зберігає структуру таблиці для подальшого використання.
Якщо ви дійсно хочете видалити визначення таблиць , а також дані, просто опустіть таблиці.
Для отримання додаткової інформації дивіться цю статтю MSDN
DROP TABLE видаляє таблицю.
TRUNCATE TABLE спорожнює його, але залишає свою структуру для майбутніх даних.
DROP і TRUNC роблять різні речі:
ТРАНСКУЛЬТНА ТАБЛИЦЯ
Видаляє всі рядки з таблиці без реєстрації видалення окремих рядків. TRUNCATE TABLE подібний до виразу DELETE без речення WHERE; однак TRUNCATE TABLE швидший і використовує менше системних і транзакційних ресурсів.
ТАБЛИЦЯ КРАПЛЕННЯ
Видаляє одне або декілька визначень таблиць та всі дані, індекси, тригери, обмеження та специфікації дозволів для цих таблиць.
Що стосується швидкості, різниця повинна бути невеликою. І в будь-якому випадку, якщо вам зовсім не потрібна структура таблиці, звичайно використовуйте DROP.
Я думаю, ви маєте на увазі різницю між ВИДАЛИТИ ТАБЛИЦЮ та ВІДРУЗИТИ СТОЛ.
ТАБЛИЦЯ КРАПЛЕННЯ
видалити таблицю з бази даних.
ВИДАЛИТИ ТАБЛИЦЮ
без умови видалити всі рядки. Якщо є тригер та посилання, це буде оброблятися для кожного рядка. Також індекс буде модифікований, якщо він є.
ТРАНСКУЛЬТНА ТАБЛИЦЯ
встановіть кількість рядків на нуль і без реєстрації кожного рядка. Що це набагато швидше, ніж інші обидва.
set the row count zero
він фактично встановлює значення ідентичності назад до початкового значення насіння ідентичності.
Жодна з цих відповідей не вказує на важливу різницю щодо цих двох операцій. Скидання таблиці - це операція, яку можна повернути назад. Однак усікання не може бути повернуто назад ['ТРАНСКАТСЬКУ ТАБЛИЦЮ також можна повернути назад] Таким чином, скидання дуже великої таблиці може бути дуже дорогим, якщо є багато рядків, оскільки всі вони повинні бути записані у тимчасовий простір, якщо ви вирішите повернути його назад.
Зазвичай, якщо я хочу позбутися великого столу, я його усічу, а потім кину. Таким чином дані будуть змішуватися без запису, і таблицю можна скинути, і це падіння буде дуже недорогим, оскільки ніяких даних записувати не потрібно.
Важливо зауважити, що усекання просто видаляє дані, залишаючи таблицю, тоді як drop фактично видалить дані та саму таблицю. (припускаючи, що зовнішні ключі не виключають таку дію)
DROP
- це в основному просто TRUNCATE
наступне видалення метаданих таблиці з системних таблиць. Подивіться це питання тут
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 TABLE зберігає всі ваші старі індексації та все інше. DROP TABLE, очевидно, позбувся б таблиці і вимагав би її відтворення пізніше.
ВИДАЛИТИ TableA замість TRUNCATE TableA? Поширеною помилкою є те, що вони роблять те саме. Не так. Насправді між ними є багато відмінностей.
DELETE - це записана операція на основі кожного рядка. Це означає, що видалення кожного рядка реєструється та фізично видаляється.
Ви можете ВИДАЛИТИ будь-який рядок, який не буде порушувати обмеження, залишаючи на місці зовнішній ключ або будь-який інший контракт.
TRUNCATE - це також зареєстрована операція, але іншим способом. TRUNCATE реєструє вивільнення сторінок даних, на яких існують дані. Вивільнення сторінок даних означає, що ваші рядки даних все ще насправді існують на сторінках даних, але екстенти були позначені як порожні для повторного використання. Ось що робить TRUNCATE швидшою операцією для виконання через DELETE.
Ви не можете TRUNCATE таблицю, яка має будь-які обмеження зовнішнього ключа. Вам доведеться видалити контранти, обрізати таблицю та повторно застосувати контранти.
TRUNCATE скине будь-які стовпці ідентичності до початкового значення за замовчуванням.
truncate видаляє всі рядки, але не саму таблицю, це, по суті, еквівалентно видаленню без пропозиції where, але зазвичай швидше.
У мене є виправлення для одного із наведених вище тверджень ... "усікання не може бути відкатане"
Усічку можна відкотити назад. Є деякі випадки, коли ви не можете зробити таблицю зрізання або скидання, наприклад, коли у вас є посилання на зовнішній ключ. Для такого завдання, як щомісячна звітність, я, мабуть, просто опустив би таблицю, коли мені це більше не було потрібно. Якби я робив цю зведену звітність частіше, то я б, напевно, тримав таблицю і використовував усіку.
Сподіваюся, це допоможе, ось ще декілька відомостей, які вам можуть стати в нагоді ...
Детальніше див. У наступній статті: http://sqlblog.com/blogs/denis_gobo/archive/2007/06/13/1458.aspx
Також, щоб отримати докладнішу інформацію про видалення та скорочення, див. Цю статтю: http://www.sql-server-performance.com/faq/delete_truncate_difference_p1.aspx
Дякую! Джефф
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
Відповіді тут відповідають запитанню, але я збираюся відповісти на питання, яке ви не задавали. "Чи слід використовувати усікання чи видалення?" Якщо ви видаляєте всі рядки з таблиці, вам, як правило, потрібно скоротити, оскільки це набагато швидше. Чому це набагато швидше? Принаймні у випадку з Oracle, він скидає позначку високої води . В основному це розмежування даних і дозволяє базі даних повторно використовувати їх для чогось іншого.
DELETE
видаляє рядки по одному і записує запис у журналі транзакцій для кожного видаленого рядка. TRUNCATE TABLE
видаляє дані шляхом звільнення сторінок даних, що використовуються для зберігання даних таблиці, і записує лише звільнення сторінок у журналі транзакційWHERE
речення in, DELETE
але TRUNCATE
ви не можете його використовуватиDELETE
оператор виконується за допомогою блокування рядка, кожен рядок у таблиці блокується для видалення. TRUNCATE TABLE
завжди блокує таблицю та сторінку, але не кожен рядокDELETE
оператора таблиця все ще може містити порожні сторінки. Якщо в операції видалення не використовується блокування таблиці, таблиця (купа) міститиме багато порожніх сторінок. Для індексів операція видалення може залишати порожні сторінки позаду, хоча ці TRUNCATE TABLE
видаляє всі рядки з таблиці, але структура таблиці та її стовпці, обмеження, індекси тощо залишаютьсяDELETE
твердження не RESEED
стовпець ідентифікаторів , але TRUNCATE
про стовпціRESEEDS
IDENTITY
TRUNCATE TABLE
таблиці, які:
FOREIGN KEY
обмеження. (Ви можете усічити таблицю, яка має зовнішній ключ, який посилається на себе.)TRUNCATE TABLE
не може активувати тригер, оскільки операція не реєструє окремі видалення рядківВидалити заяву
Delete Statement видалення рядків таблиці та повернення кількості рядків видаляється з таблиці. У цьому операторі ми використовуємо пропозицію where для видалення даних з таблиці
Заява про усічення
Оператор усічення Видалено або видалено всі рядки з таблиці.
Виписка
Оператор Drop видалив усі записи, а також структуру таблиці
ВИДАЛИТИ
Команда DELETE використовується для видалення рядків із таблиці. Застереження WHERE можна використовувати лише для видалення деяких рядків. Якщо умова WHERE не вказана, усі рядки буде видалено. Після виконання операції ВИДАЛЕННЯ вам потрібно УВІДМИТИ або ЗВЕРНІТЬ транзакцію, щоб зробити зміну постійною або скасувати її.
ОБРОБИТИ
TRUNCATE видаляє всі рядки з таблиці. Операцію неможливо відкотити ... Таким чином, TRUCATE працює швидше і не використовує стільки місця для скасування, як DELETE.
З: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands