Tôi có cơ sở dữ liệu SQL Server 2005 và tôi đã thử đặt chỉ mục trên các trường thích hợp để tăng tốc độ DELETE
bản ghi từ bảng với hàng triệu hàng (big_table
chỉ có 3 cột) , nhưng giờ là thời gian thực hiện DELETE
thậm chí còn dài hơn! (Ví dụ: 1 giờ so với 13 phút)SQL Server DELETE chậm hơn với chỉ mục
Tôi có mối quan hệ giữa các bảng và cột mà tôi lọc DELETE
của mình ở trong bảng khác. Ví dụ
DELETE FROM big_table
WHERE big_table.id_product IN (
SELECT small_table.id_product FROM small_table
WHERE small_table.id_category = 1)
Btw, tôi cũng đã cố gắng:
DELETE FROM big_table
WHERE EXISTS
(SELECT 1 FROM small_table
WHERE small_table.id_product = big_table.id_product
AND small_table.id_category = 1)
và trong khi nó có vẻ chạy nhanh hơn một chút so với lần đầu tiên, nó vẫn còn chậm hơn rất nhiều với các chỉ số so với khi không.
Tôi tạo ra chỉ số trên các lĩnh vực:
big_table.id_product
small_table.id_product
small_table.id_category
tập tin .LDF tôi phát triển rất nhiều trong DELETE
.
Tại sao các truy vấn của tôi chậm hơn khi tôi có chỉ mục trên bảng? Tôi nghĩ rằng chúng được cho là chạy nhanh hơn.
CẬP NHẬT
Được rồi, được sự đồng thuận có vẻ là chỉ số sẽ chậm lại một khổng lồ DELETE
bởi vì chỉ số này phải được cập nhật. Mặc dù, tôi vẫn không hiểu tại sao nó không thể DELETE
tất cả các hàng cùng một lúc và chỉ cập nhật chỉ mục một lần ở cuối.
Tôi đã theo ấn tượng từ một số đọc của tôi rằng các chỉ mục sẽ tăng tốc độ DELETE
bằng cách thực hiện tìm kiếm các trường trong mệnh đề WHERE
nhanh hơn.
"Chỉ số làm việc cũng như khi tìm kiếm một bản ghi trong lệnh DELETE và UPDATE như họ làm cho câu lệnh SELECT."
Nhưng sau đó trong bài báo, nó nói rằng quá nhiều chỉ mục có thể làm tổn thương hiệu suất.
Câu trả lời cho Bobs câu hỏi:
- 55 triệu hàng trong bảng
- 42 triệu hàng bị xóa
- tương tự
SELECT
tuyên bố sẽ không chạy (Exception của loại 'System.OutOfMemoryException' đã được ném)
tôi đã cố gắng 2 truy vấn sau đây:
SELECT * FROM big_table
WHERE big_table.id_product IN (
SELECT small_table.id_product FROM small_table
WHERE small_table.id_category = 1)
SELECT * FROM big_table
INNER JOIN small_table
ON small_table.id_product = big_table.id_product
WHERE small_table.id_category = 1
Cả thất bại sau khi chạy 25 phút với thông điệp này lỗi từ SQL Server 2005:
An error occurred while executing batch. Error message is: Exception of type 'System.OutOfMemoryException' was thrown.
Máy chủ cơ sở dữ liệu là một máy Xeon lõi kép cũ hơn với RAM 7,5 GB. Đó là cơ sở dữ liệu thử nghiệm đồ chơi của tôi :) vì vậy nó không chạy bất cứ thứ gì khác.
Tôi có cần phải làm gì đó đặc biệt với chỉ mục của mình sau khi tôi CREATE
để chúng hoạt động bình thường không?
có bao nhiêu hàng trong bảng? Có bao nhiêu hàng đang bị xóa? Câu lệnh SELECT tương tự sẽ mất bao lâu? Việc biết câu lệnh SELECT nhanh đến mức nào có thể cung cấp một số thông tin chi tiết về cách các chỉ mục ảnh hưởng đến DELETE như thế nào. – bobs
55 mil hàng, 42 đã xóa, không hoàn thành, xem ở trên để biết thêm chi tiết – JohnB
Mất nhiều thời gian hơn vì khi bạn thực hiện xóa, các chỉ mục tham chiếu đến bảng của bạn cũng phải được cập nhật. – WOPR