Tại sao cắt ngắn DDL?


15

Tôi có một câu hỏi phỏng vấn, được hỏi trong cuộc phỏng vấn của tôi. Tôi đã trả lời câu hỏi, nhưng người phỏng vấn không quá thuyết phục với câu trả lời của tôi. Vì vậy, bất cứ ai xin vui lòng sửa cho tôi với sự hiểu biết của tôi?

H: Tại sao Truncate là DDL Ở đâu khi Xóa là DML? Cả hai đều làm gần như cùng một công việc (loại bỏ các hàng)

Ans. Khi chúng tôi đang sử dụng Truncate, chúng tôi sẽ phân bổ lại toàn bộ không gian được phân bổ bởi dữ liệu mà không lưu vào không gian bảng hoàn tác. Nhưng, trong trường hợp Xóa, chúng tôi sẽ đưa tất cả dữ liệu vào không gian bảng và sau đó chúng tôi sẽ xóa tất cả dữ liệu.

Xin vui lòng, nếu bất cứ ai biết câu trả lời tốt nhất cho các bên trên, xin vui lòng giải thích.


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Paul White phục hồi Monica

Câu trả lời:


14

Sự khác biệt giữa DML và DDL không rõ ràng như tên của chúng, vì vậy đôi khi mọi thứ trở nên hơi lầy lội.

Oracle phân loạiTRUNCATE rõ ràng là DDL trong Hướng dẫn về khái niệm, nhưng DELETElà DML.

Những điểm chính đưa TRUNCATEvào trại DDL trên Oracle, như tôi hiểu, là:

  • TRUNCATEcó thể thay đổi các tham số lưu trữ ( NEXTtham số) và đó là một phần của định nghĩa đối tượng - đó là trong trại DDL.
  • TRUNCATEthực hiện một ẩn commitvà không thể được khôi phục (flashback sang một bên) - hầu hết (tất cả?) các hoạt động DDL trong Oracle làm điều này, không có DML nào.

Thực tế là TRUNCATEkhông ON DELETEkích hoạt các trình kích hoạt cũng làm cho nó khác biệt với các hoạt động DML thông thường (nhưng một số hoạt động DML đường dẫn trực tiếp cũng bỏ qua các trình kích hoạt, vì vậy đó không phải là một chỉ báo rõ ràng).

Cùng một tài liệu lưu ý DELETEtạo ra UNDO, nhưng TRUNCATEkhông, vì vậy tuyên bố của bạn là chính xác trong khía cạnh này. (Lưu ý rằng TRUNCATEkhông tạo ra một số REDOsao cho cắt ngắn có thể được thực hiện lại trong trường hợp khôi phục / phục hồi.) Nhưng một số NOLOGGINGhoạt động cũng có thể sản xuất giảm UNDO (không chắc chắn về không có gì cả), do đó không phải là một dấu hiệu rõ ràng hoặc là theo ý kiến của tôi.

Vì vậy, tôi tổng hợp nó thành:

  • truncatekhông phải là "giao dịch" theo nghĩa là nó cam kết và không thể khôi phục và có thể sửa đổi các thuộc tính lưu trữ đối tượng. Vì vậy, nó không phải là DML thông thường - Oracle phân loại nó là DDL.
  • delete là một tuyên bố DML thông thường.

Khi bạn tạo một bảng, bạn có thể chỉ định những thứ như không gian bảng đi vào, kích thước ban đầu, kích thước phạm vi tiếp theo, v.v ... Đó là các thuộc tính lưu trữ. Có, chúng là một phần của siêu dữ liệu của bảng (hoặc chỉ mục hoặc phân vùng).
Mat

Lưu ý rằng tiêu chuẩn SQL liệt kê TRUNCATE trong chương "Thao tác dữ liệu" cùng với CHERTN, XÓA và CẬP NHẬT.
a_horse_with_no_name

2

Tôi nghĩ rằng truncatecũng tương tự như drop, alter, createnhư tất cả họ đều làm việc trên một bảng tức là tất cả họ đều lệnh cấp bảng. Trong khi 'xóa' cũng tương tự như insert, select, updatenhư tất cả các công việc trên một hàng tức là tất cả họ đều lệnh cấp hàng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.