У меня также были серьезные проблемы с тестированием многопоточного кода. Затем я нашел действительно классное решение в «XUnit Test Patterns» Жерара Мезароса. Шаблон, который он описывает, называется Humble object.
В основном это описывает, как вы можете извлечь логику в отдельный, простой в тестировании компонент, который отделен от среды. После проверки этой логики вы можете проверить сложное поведение (многопоточность, асинхронное выполнение и т. Д.)
Удаление записей от таблицы регистрирует каждое удаление и выполняется, удаляют триггеры для удаленных записей. Усеченный более мощная команда, которая освобождает таблицу, не регистрируя каждую строку. SQL Server препятствует тому, чтобы Вы усекли таблицу с внешними ключами, ссылающимися на него из-за потребности проверить внешние ключи на каждой строке.
Усеченный является обычно сверхбыстрым, идеальным для того, чтобы вычистить данные из временной таблицы. Это действительно сохраняет структуру таблицы для будущего использования.
, Если Вы на самом деле хотите удалить определения таблицы , а также данные, просто отбросьте таблицы.
См. эта статья MSDN для большего количества информации
Ответы здесь соответствуют до вопроса, но я собираюсь ответить на вопрос, который Вы не задавали. "Я должен использовать усеченный или удалить?" При удалении всех строк из таблицы Вы будете обычно хотеть усечь, так как это намного намного быстрее. Почему это намного быстрее? По крайней мере, в случае Oracle, это сбрасывает метка паводка . Это - в основном разыменование данных и позволяет дб снова использовать его для чего-то еще.
В стандарте SQL таблица DROP удаляет таблицу, и схема таблицы - УСЕЧЕННЫЙ удаляет все строки.
УДАЛЯЮТ
, команда DELETE используется для удаления строк из таблицы. Оператор Where может использоваться, чтобы только удалить некоторые строки. Если не, ГДЕ условие определяется, все строки будут удалены. После выполнения УДАЛИТЬ операции необходимо ФИКСИРОВАТЬ или ОТКАТЫВАТЬ транзакцию, чтобы делать изменение постоянным или отменить его.
УСЕЧЕННЫЙ
УСЕЧЕННЫЙ удаляет все строки из таблицы. Операция не может откатываться... По сути, TRUCATE быстрее и не использует столько же пространства отмены сколько УДАЛЕНИЕ.
От: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands
TRUNCATE TABLE функционально идентичен Оператору удаления без оператора Where: оба удаляют все строки в таблице. Но TRUNCATE TABLE быстрее и использует меньше системы и ресурсов журнала транзакций, чем УДАЛЯЮТ.
Оператор удаления удаляет строки по одному и записывает запись в журнале транзакций для каждой удаленной строки. TRUNCATE TABLE удаляет данные путем освобождения страниц данных, используемых, чтобы хранить данные таблицы, и только освобождение страницы зарегистрировано в журнале транзакций.
TRUNCATE TABLE удаляет все строки из таблицы, но структура таблицы и ее столбцы, ограничения, индексы и так далее остаются. Счетчик, используемый идентификационными данными для новых строк, сбрасывается к семени для столбца. Если Вы хотите сохранить счетчик идентификационных данных, использование УДАЛЯЮТ вместо этого. Если Вы хотите удалить определение таблицы и его данные, используйте оператор DROP TABLE.
Вы не можете использовать TRUNCATE TABLE на таблице, на которую ссылается ограничение FOREIGN KEY; вместо этого, используйте Оператор удаления без оператора Where. Поскольку TRUNCATE TABLE не зарегистрирован, он не может активировать триггер.
TRUNCATE TABLE не может использоваться на таблицах, участвующих в индексном представлении.
От http://msdn.microsoft.com/en-us/library/aa260621 (SQL.80) .aspx
У меня есть исправление для одного из операторов выше... "усеченного, не может откатываться"
Усеченный, может откатываться. Существуют некоторые случаи, когда Вы не можете сделать усеченной таблицы или таблицы отбрасывания, такой как тогда, когда у Вас есть ссылка внешнего ключа. Для задачи, такой как ежемесячно создание отчетов, я, вероятно, просто отбросил бы таблицу, как только мне больше не был нужен он. Если бы я делал эту свертку, сообщающую чаще тогда, что я, вероятно, сохранил бы таблицу вместо этого и использование усеченными.
Hope, которой это помогает, вот еще некоторая информация, которую необходимо найти полезным...
дополнительную информацию см. в следующей статье: http://sqlblog.com/blogs/denis_gobo/archive/2007/06/13/1458.aspx
кроме того, для получения дополнительной информации об удаляет по сравнению с усеченным, видит эту статью: http://www.sql-server-performance.com/faq/delete_truncate_difference_p1.aspx
Спасибо! Jeff
усеченный удаляет все строки, но не саму таблицу, это чрезвычайно эквивалентно удалению без где пункт, но обычно быстрее.
Отбрасывание избавляется от таблицы полностью, удаляя определение также. Усеченная порожняя тара таблица, но не избавляется от определения.
Усечение таблицы освобождает таблицу. Отбрасывание таблицы удаляет его полностью. Любой будет быстр, но отбрасывание его, вероятно, будет быстрее (в зависимости от Вашего механизма базы данных).
, Если Вам больше не нужен он, отбросьте его так, это не загромождает Вашу схему.
Ни один из них не отвечает, указывают на важное различие об этих двух операциях. Таблица отбрасывания является операцией, которая может откатываться. <забастовка> Однако усекает, не может откатываться забастовка> ['TRUNCATE TABLE' может откатываться также]. Таким образом отбрасывание очень большой таблицы может быть очень дорогим, если существует много строк, потому что они все должны быть зарегистрированы во временном пространстве в случае, если Вы решаете откатывать его.
Обычно, если я хочу избавиться от большой таблицы, я усеку ее, затем отброшу ее. Таким образом, данные будут отклонены без записи, и таблица может быть отброшена, и то отбрасывание будет очень недорого, потому что никакие данные не должны быть зарегистрированы.
важно указать, хотя это усекает, просто удаляет данные, вставая из-за стола, в то время как отбрасывание, на самом деле, удалит данные и саму таблицу. (принимающий внешние ключи не устраняют такое действие)
TRUNCATE TABLE сохраняет всю Вашу старую индексацию и этажерку. DROP TABLE, очевидно, избавился бы от таблицы и потребовал бы, чтобы Вы воссоздали ее позже.
Я думаю, что Вы подразумеваете, что различие между УДАЛЯЕТ ТАБЛИЦУ и TRUNCATE TABLE.
DROP TABLE
удаляют таблицу из базы данных.
УДАЛЯЮТ ТАБЛИЦУ
без условия, удаляют все строки. Если будет триггер и ссылки тогда, то это обработает для каждой строки. Также индекс будет, изменяют если там один.
TRUNCATE TABLE
установил нуль количества строки и не регистрируя каждую строку. То, что это - многие быстрее как другой оба.
ОТБРАСЫВАНИЕ и TRUNC делают разные вещи:
TRUNCATE TABLE
Удаляет все строки из таблицы, не регистрируя отдельные удаления строки. TRUNCATE TABLE подобен Оператору удаления без оператора Where; однако, TRUNCATE TABLE быстрее и использует меньше системы и ресурсов журнала транзакций.
DROP TABLE
Удаляет одно или несколько определений таблицы и все данные, индексы, триггеры, ограничения и спецификации разрешения для тех таблиц.
, Насколько скорость обеспокоена, что различие должно быть небольшим. И так или иначе если Вам не нужна структура таблицы вообще, конечно, используйте ОТБРАСЫВАНИЕ.
DROP TABLE удаляет таблицу.
TRUNCATE TABLE освобождает его, но оставляет его структуру для будущих данных.
DELETE
удаляет строки по одной и записывает запись в транзакции {{1} } журнал для каждой удаленной строки. TRUNCATE TABLE
удаляет данные путем освобождения страниц данных
, используемых для хранения данных таблицы, и записывает только освобожденные страницы в
журнале транзакций WHERE
в DELETE
, но в TRUNCATE
вы не можете его использовать DELETE
выполняется с использованием блокировки строки, каждая строка в таблица заблокирована
для удаления. TRUNCATE TABLE
всегда блокирует таблицу и страницу, но не каждую строку DELETE
таблица все еще может содержать пустые страницы. Если
удалить операция не использует блокировку таблицы, таблица (куча) будет содержать много пустых страниц
. Для индексов операция удаления может оставить пустые страницы, хотя эти TRUNCATE TABLE
удаляет все строки из таблицы, но таблица структура и ее столбцы,
ограничения, индексы и т. д. остаются Оператор DELETE
не RESEED
столбец идентификаторов, а оператор TRUNCATE
RESEEDS
столбец
IDENTITY
TRUNCATE TABLE
в таблицах, которые:
FOREIGN KEY
. (Вы можете усечь таблицу, имеющую внешний ключ
, который ссылается на себя.) ТАБЛИЦА TRUNCATE
не может активировать триггер, поскольку операция не регистрирует отдельные
удаления строк