Database
 sql >> база данни >  >> RDS >> Database

Митове за ефективността:съкращаването не може да бъде върнато

Гост автор:Дерик Хамър (@SQLHammer)


Разликите между TRUNCATE TABLE и DELETE често се разбират погрешно. Опитвам се да опровергая мита, че TRUNCATE TABLE не може да се върне назад:

„TRUNCATE TABLE не е регистриран и следователно не може да бъде връщан назад. Трябва да използвате DELETE, ако сте в транзакция.

Четене на ръководството

Статията на Books Online за TRUNCATE TABLE е доста описателна:

„Премахва всички редове от таблица или определени дялове на таблица, без да регистрира отделните изтривания на редове. TRUNCATE TABLE е подобен на оператора DELETE без клауза WHERE; обаче TRUNCATE TABLE е по-бърз и използва по-малко ресурси на системата и регистрационните файлове на транзакциите."

Фактът, че TRUNCATE TABLE използва по-малко Ресурсите на дневника на транзакциите предполагат, че той записва до известна степен в регистъра на транзакциите. Нека да разберем колко и да проучим способността му да бъде връщан назад.

Докажи го

В по-ранна публикация Пол Рандъл разглежда това в детайли, но реших, че би било полезно да предоставя много прости повторения, за да опровергае и двата елемента на този мит.

Може ли да се върне TRUNCATE TABLE?

Доказателството, че TRUNCATE TABLE може да се върне назад, е достатъчно лесно. Просто ще сложа TRUNCATE TABLE в транзакция и ще я върна обратно.

USE demo;
BEGIN TRANSACTION;
  SELECT COUNT(*) [StartingTableRowCount] FROM [dbo].[Test];
  TRUNCATE TABLE [dbo].[Test];
  SELECT COUNT(*) [TableRowCountAfterTruncate] FROM [dbo].[Test];
ROLLBACK TRANSACTION;
SELECT COUNT(*) [TableRowCountAfterRollback] FROM [dbo].[Test];

В таблицата има 100 000 реда и тя се връща до 100 000 реда след връщане назад:

TRUNCATE TABLE записва ли в дневника?

Чрез изпълнение на CHECKPOINT получаваме чиста отправна точка. След това можем да проверим регистрационните записи преди и след TRUNCATE TABLE.

USE demo;
CHECKPOINT;
 
  SELECT COUNT(*) [StartingLogRowCount]
  FROM sys.fn_dblog (NULL, NULL);
 
  TRUNCATE TABLE [dbo].[Test];
 
  SELECT COUNT(*) [LogRowCountAfterTruncate]
  FROM sys.fn_dblog (NULL, NULL);

Нашата команда TRUNCATE TABLE генерира 237 дневника (поне първоначално). Това е, което ни позволява да извършим връщане назад и как SQL Server регистрира промяната за начало.

Какво ще кажете за DELETE?

Ако и DELETE, и TRUNCATE TABLE записват в дневника и могат да бъдат върнати назад, какво ги прави различни?

Както бе споменато в препратката за BOL по-горе, TRUNCATE TABLE отнема по-малко ресурси на системата и регистрационните файлове на транзакциите. Вече забелязахме, че за командата TRUNCATE TABLE са записани 237 дневника. Сега нека разгледаме ИЗТРИВАНЕ.

USE demo;
CHECKPOINT;
 
  SELECT COUNT(*) [StartingLogRowCount]
  FROM sys.fn_dblog (NULL, NULL);
 
  DELETE FROM [dbo].[Test];
 
  SELECT COUNT(*) [LogRowCountAfterDelete]
  FROM sys.fn_dblog (NULL, NULL);

С над 440 000 регистрационни записи, написани за DELETE, командата TRUNCATE очевидно е много по-ефективна.

Заключение

TRUNCATE TABLE е регистрирана команда и може да бъде върната назад, с огромно предимство в производителността пред еквивалентно DELETE. DELETE става важен, когато искате да изтриете по-малко редове, отколкото съществуват в таблицата (тъй като TRUNCATE TABLE не приема клауза WHERE). За някои идеи как да направите DELETE по-ефективни, вижте публикацията на Aaron Bertrand „Разбийте големи операции за изтриване на парчета.

За автора

Дерик е специалист по данни и току-що създаден MVP на платформата за данни на Microsoft, фокусиран върху SQL Server. Страстта му се фокусира около високата наличност, възстановяването при бедствия, непрекъснатата интеграция и автоматизираната поддръжка. Опитът му обхваща дългосрочно администриране на бази данни, консултации и предприемачески начинания, работещи във финансовата и здравната индустрия. Понастоящем той е старши администратор на база данни, отговарящ за екипа за операции с бази данни в Световната централа на Subway Franchise. Когато не е на час или не води блог в SQLHammer.com, Дерик посвещава времето си на #sqlfamily като лидер на главите за потребителската група на FairfieldPASS SQL Server в Стамфорд, Коннектикут.
  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ETL срещу ELT:Ние смятаме, вие преценете

  2. Потенциални подобрения на ASPState

  3. T-SQL грешки, клопки и най-добри практики – подзаявки

  4. Разбийте големите операции за изтриване на парчета

  5. Използване на съветника за откриване на метаданни