Sự khác biệt giữa DELETE và TRUNCATE trong Oracle Database
Trong Oracle, có hai câu lệnh để xóa dữ liệu trong bảng: DELETE và TRUNCATE. Mặc dù cả hai câu lệnh này đều có chức năng giống nhau nhưng lại có sự khác biệt đáng kể trong cách hoạt động của chúng. Trong bài viết này, chúng ta sẽ đi tìm hiểu sự khác biệt giữa hai câu lệnh này để có thể sử dụng chúng một cách hiệu quả và an toàn hơn.
Câu lệnh DELETE
Câu lệnh DELETE được sử dụng để xóa các bản ghi dữ liệu từ bảng. Khi thực thi lệnh DELETE, các bản ghi được xóa một cách tuần tự và từng bản ghi sẽ được ghi vào log của hệ thống. Vì vậy, khi sử dụng câu lệnh DELETE, nó sẽ làm giảm hiệu suất của hệ thống nếu có nhiều bản ghi cần xóa. Câu lệnh DELETE cũng có thể được sử dụng để xóa một phạm vi bản ghi cụ thể bằng cách sử dụng điều kiện WHERE trong câu lệnh.
DELETE FROM employees WHERE employee_id = 100;
Câu lệnh trên sẽ xóa bản ghi của nhân viên có ID là 100 trong bảng employees.
Câu lệnh TRUNCATE
Câu lệnh TRUNCATE được sử dụng để xóa tất cả các bản ghi trong bảng và giải phóng không gian đang được sử dụng bởi bảng. Khi sử dụng câu lệnh TRUNCATE, tất cả các bản ghi sẽ bị xóa một cách nhanh chóng mà không cần ghi log vào hệ thống. Do đó, hiệu suất của hệ thống sẽ không bị ảnh hưởng bởi việc xóa các bản ghi lớn. Một điểm cần lưu ý khi sử dụng câu lệnh TRUNCATE là nó sẽ xóa tất cả các bản ghi trong bảng và không có cơ chế để phục hồi dữ liệu đã xóa
TRUNCATE TABLE employees;
Câu lệnh trên sẽ xóa tất cả các bản ghi trong bảng employees và giải phóng không gian đang được sử dụng bởi bảng.
Sự khác biệt giữa DELETE và TRUNCATE
Hiệu suất
Câu lệnh TRUNCATE có hiệu suất cao hơn so với DELETE khi xóa một lượng lớn bản ghi.
DELETE và TRUNCATE khác nhau về tốc độ xử lý
Như đã đề cập ở trên, TRUNCATE thực hiện nhanh hơn DELETE. Lý do cho điều này là vì TRUNCATE thực hiện các hoạt động cơ bản hơn. Khi sử dụng TRUNCATE, Oracle không thực hiện việc xóa dữ liệu hàng loạt, thay vào đó, nó chỉ xóa đi các liên kết đến dữ liệu. Điều này giúp cho việc xóa dữ liệu trở nên nhanh chóng hơn và đồng thời cũng giải phóng tài nguyên được sử dụng trước đó.
Về phía DELETE, việc xóa dữ liệu sẽ diễn ra theo kiểu dòng từng dòng. Do đó, việc xóa dữ liệu với DELETE sẽ mất nhiều thời gian hơn so với TRUNCATE.
Tuy nhiên, điều này không phải là luôn đúng. Nếu bảng có quá nhiều ràng buộc (constraints), triggers hay các chỉ mục (index), TRUNCATE sẽ chậm hơn DELETE. Điều này là do TRUNCATE phải thực hiện nhiều thao tác phức tạp hơn để xóa dữ liệu, bao gồm việc xóa các ràng buộc, trigger hay chỉ mục.
Do đó, khi sử dụng TRUNCATE, bạn nên kiểm tra kỹ các ràng buộc, trigger hay chỉ mục để đảm bảo TRUNCATE hoạt động nhanh chóng và hiệu quả.
DELETE và TRUNCATE khác nhau về khả năng phục hồi dữ liệu
Nếu sử dụng DELETE, dữ liệu sẽ được xóa dần dần, từng dòng một. Điều này có nghĩa là, trong quá trình xóa dữ liệu, bạn vẫn có thể phục hồi được dữ liệu bị xóa nếu bạn phát hiện ra sai sót.
Tuy nhiên, với TRUNCATE, việc phục hồi dữ liệu trở nên khó khăn hơn. Khi TRUNCATE được thực hiện, dữ liệu sẽ bị xóa hoàn toàn và không thể phục hồi được.
Vì vậy, nếu bạn cần phục hồi dữ liệu sau khi xóa, bạn nên sử dụng DELETE. Tuy nhiên, hãy lưu ý rằng, việc sử dụng DELETE để xóa nhiều dữ liệu sẽ mất nhiều thời gian hơn so với TRUNCATE.
DELETE và TRUNCATE khác nhau về tác động đến các chỉ mục (index)
DELETE và TRUNCATE khác nhau về tác động đến các chỉ mục (index). Khi sử dụng DELETE, bản ghi sẽ bị xóa nhưng chỉ mất đi khỏi bảng và không mất khỏi chỉ mục liên quan. Do đó, chỉ mục phải được cập nhật để chỉ ra rằng bản ghi không còn tồn tại. Quá trình cập nhật chỉ mục này sẽ làm chậm tốc độ xóa và gây ra tình trạng mất hiệu suất.
Ngược lại, TRUNCATE sẽ xóa toàn bộ dữ liệu của bảng cùng với các chỉ mục liên quan. TRUNCATE không xóa từng bản ghi như DELETE mà xóa toàn bộ dữ liệu ở mức block và segment. Quá trình này nhanh hơn so với DELETE, vì nó không cần phải cập nhật chỉ mục. Tuy nhiên, điều này cũng có thể dẫn đến mất mát dữ liệu nếu không được thực hiện đúng cách.
Một điểm cần lưu ý khác giữa DELETE và TRUNCATE đó là TRUNCATE không thể được sử dụng trên các bảng có ràng buộc khóa ngoại. Bởi vì TRUNCATE xóa toàn bộ dữ liệu, nó sẽ xóa tất cả các dữ liệu liên quan đến bảng đó. Điều này có thể dẫn đến mất mát dữ liệu và rủi ro về tính toàn vẹn của cơ sở dữ liệu.
Có thể kết luận rằng, nếu muốn xóa một số bản ghi nhất định, DELETE sẽ là sự lựa chọn phù hợp hơn. Tuy nhiên, nếu muốn xóa toàn bộ dữ liệu của bảng, TRUNCATE sẽ nhanh hơn và hiệu quả hơn. Trước khi sử dụng bất kỳ lệnh xóa nào, đảm bảo rằng bạn đã sao lưu toàn bộ dữ liệu của bảng và đã nắm vững quá trình xóa để tránh mất mát dữ liệu và ảnh hưởng đến hiệu suất của cơ sở dữ liệu.
KẾT LUẬN
Như vậy, qua bài viết trên, chúng ta đã được tìm hiểu về sự khác biệt giữa DELETE và TRUNCATE trong Oracle. Tuy cùng có chức năng xóa dữ liệu, nhưng hai câu lệnh này lại có nhiều điểm khác biệt quan trọng trong quá trình thực hiện và tác động đến cấu trúc dữ liệu của bảng.
Khi sử dụng DELETE, dữ liệu bị xóa dần theo từng hàng, việc này không chỉ ảnh hưởng đến hiệu suất xử lý mà còn có thể làm giảm tốc độ truy vấn sau này. TRUNCATE sử dụng cơ chế giải phóng không gian bộ nhớ lớn hơn, làm cho nó trở thành một lựa chọn tốt hơn trong nhiều trường hợp.
Tóm lại, sử dụng DELETE hay TRUNCATE phụ thuộc vào yêu cầu của từng tình huống và mục đích sử dụng dữ liệu. Việc hiểu rõ sự khác biệt giữa hai câu lệnh này sẽ giúp chúng ta có được quyết định đúng đắn và tối ưu cho các tác vụ xử lý dữ liệu trong Oracle.
Tìm hiểu thêm về 2 chế độ dedicated server và shared server configuration trong oracle database.
All rights reserved