Mam pytanie do wywiadu, zadane podczas mojego wywiadu. Odpowiedziałem na pytanie, ale moja osoba udzielająca wywiadu nie była tak przekonana. Więc, proszę, popraw mnie według mojego zrozumienia?
P: Dlaczego obcięcie jest DDL Gdzie jako DML jest DML? Oba wykonują prawie taką samą pracę (usuwanie wierszy)
Odp. Kiedy używamy Truncate, cofamy alokację całej przestrzeni przydzielonej przez dane bez zapisywania w cofniętym obszarze tabel. Ale w przypadku Delete umieszczamy wszystkie dane w cofnięciu obszaru tabel, a następnie usuwamy wszystkie dane.
Proszę, jeśli ktoś zna najlepszą odpowiedź na powyższe, proszę wyjaśnić.
Odpowiedzi:
Rozróżnienie DML i DDL nie jest tak jasne, jak sugerują ich nazwy, więc czasami robi się trochę mętnie.
Oracle wyraźnie klasyfikuje się
TRUNCATE
jako DDL w Przewodniku pojęć, aleDELETE
jako DML.Głównymi punktami, jakie postawiłem
TRUNCATE
w obozie DDL na Oracle, jak rozumiem, są:TRUNCATE
może zmieniać parametry przechowywania (NEXT
parametr), a te są częścią definicji obiektu - to jest obóz DDL.TRUNCATE
ma charakter niejawnycommit
i nie można go przywrócić (odsuń na bok) - większość (wszystkich?) operacji DDL w Oracle to robi, żaden DML tego nie robi.Fakt, że
TRUNCATE
nie uruchamiaON DELETE
wyzwalaczy, odróżnia go również od normalnych operacji DML (ale niektóre bezpośrednie operacje DML również pomijają wyzwalacze, więc nie jest to wyraźny wskaźnik).Ta sama dokumentacja zauważa, że
DELETE
generuje UNDO, aleTRUNCATE
nie robi, więc twoje stwierdzenie jest poprawne pod tym względem. (Zauważ, żeTRUNCATE
to generuje,REDO
aby obcięcie można było odtworzyć w przypadku przywracania / odzyskiwania.) Ale niektóreNOLOGGING
operacje mogą również powodować zmniejszenie UNDO (nie jestem pewien, czy nie ma żadnego), więc moim zdaniem nie jest to również wyraźny wskaźnik.Podsumowałbym to jako:
truncate
nie jest „transakcyjny” w tym sensie, że popełnia i nie można go wycofać, i może modyfikować atrybuty przechowywania obiektów. Więc to nie jest zwykły DML - Oracle klasyfikuje go jako DDL.delete
jest zwykłą instrukcją DML.źródło
Myślę, że
truncate
jest podobna dodrop
,alter
,create
ponieważ wszystkie prace na stole czyli wszystkie są komendy poziomie tabeli. Natomiast „Usuń” jest podobna doinsert
,select
,update
ponieważ wszystkie prace na wierszach, czyli wszystkie są polecenia poziomu wiersza.źródło