Каково различие между УСЕЧЕННЫМ, и УДАЛИТЕ в SQL

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

259
задан aioobe 3 June 2019 в 06:39
поделиться

14 ответов

Вот список различий. Я выделил Oracle-specific features, и надо надеяться сообщество может добавить в конкретных различиях других поставщиков также. Различия, которые характерны для большинства поставщиков, могут пойти непосредственно ниже заголовков с различиями, выделенными ниже.

<час>

Общий обзор

, Если Вы хотите быстро удалить все строки от таблицы, и Вы действительно уверены, что хотите сделать это, и у Вас нет внешних ключей против таблиц, тогда УСЕЧЕННОЕ, вероятно, будет быстрее, чем УДАЛЕНИЕ.

Различные системные конкретные вопросы нужно рассмотреть, как детализировано ниже.

<час>

тип

Оператора Удаляет, DML, Усеченный DDL (, Что такое DDL и DML? )

<час>

Фиксация и Откат

Переменная поставщиком

Усеченный SQL*Server

может откатываться.

Усеченный PostgreSQL

может откатываться.

Oracle

, поскольку УСЕЧЕННЫМ является DDL, это включает две фиксации, один прежде и один после выполнения оператора. Усеченный не может поэтому откатываться, и отказ в усеченном процессе выпустит фиксацию так или иначе.

Однако посмотрите Ретроспективный кадр ниже.

<час>

восстановление Пространства

Удаляет, не восстанавливает пространство, Усеченный восстанавливает пространство

Oracle

, Если Вы используете пункт УСТРОЙСТВА ХРАНЕНИЯ ДАННЫХ ПОВТОРНОГО ИСПОЛЬЗОВАНИЯ тогда, сегменты данных не освобождены, который может быть незначительно более эффективным, если таблица должна быть перезагружена с данными. Метка паводка сбрасывается.

<час>

объем строки

Удаляет, может использоваться для удаления всех строк или только подмножества строк. Усеченный удаляет все строки.

Oracle

, Когда таблица делится, отдельные разделы, может быть усеченным в изоляции, таким образом частичное удаление данных всей таблицы возможно.

<час>

Типы объектов

Удаляют, может быть применен к таблицам и таблицам в кластере. Усеченный применяется только к таблицам или всему кластеру. (Может быть конкретная Oracle)

<час>

Идентификационные данные Объекта данных

, Oracle

Удаляет, не влияет на идентификатор объекта данных, но усеченный присваивает новый идентификатор объекта данных если никогда не было вставки против таблицы начиная с ее создания Даже единственная вставка, которая откатывается, заставит новый идентификатор объекта данных быть присвоенным после усечения.

<час>

Ретроспективный кадр (Oracle)

, который удаляют работы Ретроспективного кадра через, но усеченное предотвращает ретроспективный кадр к состояниям до операции.

Однако от 11gR2 функция FLASHBACK ARCHIVE позволяет это, кроме Использования Express Edition

РЕТРОСПЕКТИВНОГО КАДРА в <час> Oracle http://docs.oracle.com/cd/E11882_01/appdev.112/e41502/adfns_flashback.htm#ADFNS638

Полномочия

Переменная

, Oracle

Удаляет, может быть предоставлен на таблице другому пользователю, или роль, но усеченный не может быть, не используя ОТБРАСЫВАНИЕ НИКАКОЕ предоставление ТАБЛИЦЫ.

<час>

Восстановление/Отмена

Удаляет, генерирует небольшое количество восстановления и большую сумму отмены. Усеченный генерирует незначительную сумму каждого.

<час>

Индексы

Oracle

А усеченная операция представляет неприменимые индексы, применимые снова. Удалите не делает.

<час>

Внешние ключи

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

<час>

Таблица, Блокирующая

, Усеченный Oracle

требует эксклюзивной блокировки таблицы, удалите, требует общей блокировки таблицы. Следовательно отключение блокировок таблицы является способом предотвратить усеченные операции на таблице.

<час>

Триггеры

триггеры DML не стреляют в усеченное.

триггеры Oracle

DDL доступны.

<час>

Удаленное Выполнение

Усеченный Oracle

не может быть выпущен по ссылке базы данных.

<час>

Столбцы Идентификационных данных

SQL*Server

Усеченный сброс последовательность для типов столбца ИДЕНТИФИКАЦИОННЫХ ДАННЫХ, удалите, не делает.

<час>

Набор результатов

В большинстве реализаций, DELETE оператор может возвратить клиенту строки, которые были удалены.

, например, в Oracle МН подпрограмма / подпрограмма SQL Вы могли:

DELETE FROM employees_temp
WHERE       employee_id = 299 
RETURNING   first_name,
            last_name
INTO        emp_first_name,
            emp_last_name;
238
ответ дан 14 revs, 4 users 99% 23 November 2019 в 02:39
поделиться

Я прокомментировал бы сообщение matthieu, но у меня еще нет представителя...

MySQL In, автоматический инкрементный счетчик сбрасывается с усеченным, но не с удаляют.

0
ответ дан nathan 23 November 2019 в 02:39
поделиться

Не может сделать DDL по dblink.

0
ответ дан 23 November 2019 в 02:39
поделиться

Большая причина это удобно, когда Вы должны обновить данные в многомиллионной таблице строки, но не хотите восстанавливать их. "Удалите *", взял бы навсегда, тогда как влияние производительности Усеченных будет незначительно.

0
ответ дан Jordan Ogren 23 November 2019 в 02:39
поделиться

Короче говоря, усеченный не регистрируется, что-либо (так намного быстрее, но не может быть отменен), тогда как удаляют, зарегистрирован (и может быть часть большей транзакции, будет откатывать и т.д.). Если у Вас есть данные, которые Вы не хотите в таблице в dev, обычно лучше усечь, поскольку Вы не рискуете заполнять журнал транзакций

0
ответ дан Oskar 23 November 2019 в 02:39
поделиться

Да, УДАЛИТЕ, медленнее, УСЕЧЕННЫЙ быстрее. Почему?

УДАЛЯЮТ, должен считать записи, проверочные ограничения, обновить блок, индексы обновления, и генерировать восстановление/отмену. Все это занимает время.

УСЕЧЕННЫЙ просто корректирует указатель в базе данных для таблицы (Паводок Mark) и пуф! данных не стало.

Это - конкретная Oracle, AFAIK.

6
ответ дан DCookie 23 November 2019 в 02:39
поделиться

Небольшая поправка к исходному ответу - при удалении также создается значительное количество повторов (так как отмена сама защищена повторами). Это видно из вывода autotrace:

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
2
ответ дан CaptainPicard 23 November 2019 в 02:39
поделиться

Самое большое различие - то, что усеченный не зарегистрированная операция, в то время как удаляют.

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

[еще 113] детали здесь

1
ответ дан Learning 23 November 2019 в 02:39
поделиться

"Усеченный не регистрируется, что-либо" корректно. Я пошел бы далее:

Усеченный не выполняется в контексте транзакции.

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

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

12
ответ дан Walter Mitty 23 November 2019 в 02:39
поделиться

С SQL Server или MySQL, если существует PK с автоматическим инкрементом, усеченным, сбросит счетчик.

16
ответ дан Dawid Ferenczy Rogožan 23 November 2019 в 02:39
поделиться

Все хорошие ответы, к которым я должен добавить:

С тех пор TRUNCATE TABLE DDL ( Данные Язык Defination ), не DML ( манипулирование данными Langauge ), команда, эти Delete Triggers не работают.

23
ответ дан Dawid Ferenczy Rogožan 23 November 2019 в 02:39
поделиться

В SQL Server 2005 я полагаю, что можно откатывать усеченное

4
ответ дан 23 November 2019 в 02:39
поделиться

TRUNCATE - это оператор DDL, тогда как DELETE - это оператор DML. Ниже приведены различия между ними:

  1. Поскольку TRUNCATE - это оператор DDL ( язык определения данных ), он не требует фиксации, чтобы сделать изменения постоянными. И это причина того, что строки, удаленные с помощью truncate, нельзя было откатить. С другой стороны, DELETE - это оператор DML ( язык манипулирования данными ), поэтому для его постоянного действия требуется явная фиксация.

  2. TRUNCATE всегда удаляет все строки из table, оставляя таблицу пустой и структуру таблицы нетронутой, тогда как DELETE может удалить условно, если используется предложение where.

7
ответ дан 23 November 2019 в 02:39
поделиться

УСЕЧЕННЫЙ быстро, УДАЛИТЕ, является медленным.

, Хотя, УСЕЧЕННЫЙ не имеет никакой отслеживаемости.

-4
ответ дан databyss 23 November 2019 в 02:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: