Tôi biết đây là một bài viết cũ, nhưng tôi nghĩ đây là một chủ đề rất quan trọng, đặc biệt là ngày nay khi chúng ta có hơn 10 triệu bản ghi và nói về hàng terabyte dữ liệu.
Tôi cũng sẽ cân nhắc với những quan sát sau đây. Tôi có khoảng 45 triệu bản ghi trong bảng của mình ([dữ liệu]) và khoảng 300 bản ghi trong bảng [mèo] của tôi. Tôi có lập chỉ mục mở rộng cho tất cả các truy vấn mà tôi sắp nói đến.
Hãy xem xét Ví dụ 1:
UPDATE d set category = c.categoryname
FROM [data] d
JOIN [cats] c on c.id = d.catid
so với Ví dụ 2:
UPDATE d set category = (SELECT TOP(1) c.categoryname FROM [cats] c where c.id = d.catid)
FROM [data] d
Ví dụ 1 mất khoảng 23 phút để chạy. Ví dụ 2 mất khoảng 5 phút.
Vì vậy, tôi kết luận rằng truy vấn phụ trong trường hợp này nhanh hơn nhiều. Tất nhiên, hãy nhớ rằng tôi đang sử dụng ổ SSD M.2 có khả năng i / o @ 1GB / giây (đó là byte chứ không phải bit), vì vậy các chỉ mục của tôi cũng rất nhanh. Vì vậy, điều này cũng có thể ảnh hưởng đến tốc độ trong trường hợp của bạn
Nếu nó là một lần dọn dẹp dữ liệu, có lẽ tốt nhất là cứ để nó chạy và kết thúc. Tôi sử dụng TOP (10000) và xem mất bao lâu và nhân với số lượng bản ghi trước khi tôi đạt được truy vấn lớn.
Nếu bạn đang tối ưu hóa cơ sở dữ liệu sản xuất, tôi thực sự khuyên bạn nên xử lý trước dữ liệu, tức là sử dụng trình kích hoạt hoặc công việc môi giới để không đồng bộ hóa các bản ghi cập nhật, để truy cập thời gian thực lấy dữ liệu tĩnh.