XÓA so với TRUNCATE


35

Tôi đang cố gắng để hiểu rõ hơn về sự khác biệt giữa các lệnh DELETETRUNCATElệnh. Sự hiểu biết của tôi về nội bộ đi theo hướng nào đó:

DELETE-> công cụ cơ sở dữ liệu tìm và xóa hàng khỏi các trang dữ liệu có liên quan và tất cả các trang chỉ mục nơi hàng được nhập. Vì vậy, càng nhiều chỉ mục thì càng mất nhiều thời gian.

TRUNCATE -> chỉ cần xóa tất cả các trang dữ liệu của bảng vì đây là một tùy chọn hiệu quả hơn để xóa nội dung của bảng.

Giả sử như trên là đúng (vui lòng sửa lại cho tôi nếu không):

  1. Làm thế nào để các chế độ phục hồi khác nhau ảnh hưởng đến từng tuyên bố? Nếu có bất kỳ ảnh hưởng nào
  2. Khi xóa, tất cả các chỉ mục được quét hay chỉ những nơi có hàng? Tôi sẽ giả sử tất cả các chỉ mục được quét (và không tìm kiếm?)
  3. Các lệnh được nhân rộng như thế nào? Là lệnh SQL được gửi và xử lý trên mỗi thuê bao? Hay là MSSQL thông minh hơn một chút?

2
Có một số thông tin liên quan trên DELETETRUNCATEtrong các câu trả lời cho câu hỏi này về tiện ích của TRUNCATE-ing ngay trước khi a DROP. Bạn cũng có thể tự mình tìm kiếm trong nhật ký để nghiên cứu tác động của cả hai lệnh bằng cách sử dụng kỹ thuật được mô tả trong câu trả lời này .
Nick Chammas

1
Câu trả lời này cho thấy các phần bên trong của các hoạt động XÓA và TRUNCATE. Ngoài ra câu hỏi cho thấy một tình huống cụ thể trong đó TRUNCATE hoạt động tốt hơn.
孔夫子

5
@idstam TRUNCATEcó thể được cuộn lại. Nick bao gồm điều đó trong câu trả lời của mình cho câu hỏi mà anh ấy liên kết .
Mark Storey-Smith

Cắt ngắn yêu cầu quyền "thay đổi bảng" (theo nghĩa là cắt ngắn được cắm thay thế để xóa).
crokusek

Câu trả lời:


58

XÓA -> công cụ cơ sở dữ liệu tìm và xóa hàng khỏi các trang dữ liệu có liên quan và tất cả các trang chỉ mục nơi hàng được nhập. Vì vậy, càng nhiều chỉ mục thì càng mất nhiều thời gian.

Vâng, mặc dù có hai lựa chọn ở đây. Các hàng có thể bị xóa khỏi các chỉ mục không được sắp xếp theo từng hàng bởi cùng một toán tử thực hiện xóa bảng cơ sở. Đây được gọi là gói cập nhật hẹp (hoặc mỗi hàng):

Xóa mỗi hàng

Hoặc, việc xóa chỉ mục không được bao gồm có thể được thực hiện bởi các toán tử riêng biệt, mỗi lần một chỉ mục không bao gồm. Trong trường hợp này (được gọi là kế hoạch cập nhật rộng hoặc theo chỉ mục), toàn bộ hành động được lưu trữ trong một bàn làm việc (bộ đệm háo hức) trước khi được phát lại một lần cho mỗi chỉ mục, thường được sắp xếp rõ ràng bởi các khóa của chỉ mục không được bao gồm cụ thể để khuyến khích tuần tự mô hình truy cập.

Mỗi lần xóa chỉ số

TRUNCATE -> chỉ cần xóa tất cả các trang dữ liệu của bảng, vì đây là một tùy chọn hiệu quả hơn để xóa nội dung của bảng.

Vâng. TRUNCATE TABLEhiệu quả hơn vì một số lý do:

  1. Ít khóa hơn có thể cần thiết. Cắt ngắn thường chỉ yêu cầu một khóa sửa đổi lược đồ duy nhất ở cấp độ bảng (và các khóa độc quyền trên mỗi phạm vi được phân bổ). Xóa có thể có được các khóa ở mức độ chi tiết (hàng hoặc trang) thấp hơn cũng như các khóa độc quyền trên bất kỳ trang nào được phân bổ.
  2. Chỉ cắt ngắn đảm bảo rằng tất cả các trang được phân bổ từ bảng heap. Việc xóa có thể để lại các trang trống trong một đống ngay cả khi một gợi ý khóa bảng độc quyền được chỉ định (ví dụ: nếu mức cách ly phiên bản hàng được bật cho cơ sở dữ liệu).
  3. Cắt bớt luôn được ghi lại tối thiểu (bất kể mô hình phục hồi đang sử dụng). Chỉ các hoạt động phân bổ trang được ghi lại trong nhật ký giao dịch.
  4. Cắt ngắn có thể sử dụng thả hoãn lại nếu đối tượng có kích thước 128 hoặc lớn hơn. Trì hoãn có nghĩa là công việc phân bổ thực tế được thực hiện không đồng bộ bởi một luồng máy chủ nền.

Làm thế nào để các chế độ phục hồi khác nhau ảnh hưởng đến từng tuyên bố? Có bất kỳ tác dụng nào không?

Xóa luôn được ghi lại đầy đủ (mỗi hàng bị xóa được ghi lại trong nhật ký giao dịch). Có một số khác biệt nhỏ trong nội dung của các bản ghi nhật ký nếu mô hình khôi phục khác FULL, nhưng đây vẫn là ghi nhật ký đầy đủ về mặt kỹ thuật.

Khi xóa, tất cả các chỉ mục được quét hay chỉ những nơi có hàng? Tôi sẽ giả sử tất cả các chỉ mục được quét (và không tìm kiếm?)

Xóa một hàng trong một chỉ mục (sử dụng các gói cập nhật hẹp hoặc rộng được hiển thị trước đó) luôn là quyền truy cập theo khóa (tìm kiếm). Quét toàn bộ chỉ mục cho mỗi hàng bị xóa sẽ không hiệu quả khủng khiếp. Hãy xem lại kế hoạch cập nhật theo chỉ số được hiển thị trước đó:

Kế hoạch rộng 2

Các kế hoạch thực hiện là các đường ống theo nhu cầu: các toán tử mẹ (bên trái) điều khiển các toán tử con thực hiện công việc bằng cách yêu cầu một hàng tại một thời điểm từ chúng. Các toán tử Sắp xếp đang chặn (chúng phải tiêu thụ toàn bộ đầu vào của chúng trước khi tạo hàng được sắp xếp đầu tiên), nhưng chúng vẫn bị điều khiển bởi cha mẹ của chúng (Xóa Chỉ mục) yêu cầu hàng đầu tiên đó. Xóa Chỉ mục kéo một hàng tại một thời điểm từ Sắp xếp hoàn thành, cập nhật chỉ mục không bao gồm mục tiêu cho mỗi hàng.

Trong một kế hoạch cập nhật rộng, bạn sẽ thường thấy các cột được thêm vào luồng hàng bởi toán tử cập nhật bảng cơ sở. Trong trường hợp này, Xóa chỉ mục cụm đã thêm các cột khóa chỉ mục không bao gồm vào luồng. Dữ liệu này được yêu cầu bởi công cụ lưu trữ để xác định vị trí hàng cần xóa khỏi chỉ mục không được bao gồm:

Chi tiết danh sách đầu ra

Các lệnh được nhân rộng như thế nào? Là lệnh SQL được gửi và xử lý trên mỗi thuê bao? Hay là SQL Server thông minh hơn thế một chút?

Cắt ngắn không được phép trên một bảng được xuất bản bằng cách sử dụng sao chép giao dịch hoặc hợp nhất. Việc xóa được sao chép như thế nào tùy thuộc vào loại sao chép và cách cấu hình. Ví dụ, sao chép ảnh chụp nhanh chỉ sao chép chế độ xem theo thời gian của bảng bằng các phương thức hàng loạt - các thay đổi gia tăng không được theo dõi hoặc áp dụng. Sao chép giao dịch hoạt động bằng cách đọc hồ sơ nhật ký và tạo các giao dịch phù hợp để áp dụng các thay đổi tại các thuê bao. Hợp nhất sao chép theo dõi các thay đổi bằng cách sử dụng kích hoạt và bảng siêu dữ liệu.

Đọc liên quan: Tối ưu hóa các truy vấn T-SQL thay đổi dữ liệu

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.