Bạn đã kiểm tra kế hoạch thực hiện sau khi hết thời gian chưa? Kế hoạch có thể thay đổi tùy theo số liệu thống kê. Vì dữ liệu của bạn tăng nhanh, số liệu thống kê sẽ thay đổi và có thể kích hoạt một kế hoạch thực hiện khác.
Vòng lồng nhau là tốt cho một lượng nhỏ dữ liệu, nhưng như bạn thấy, thời gian tăng theo khối lượng. Trình tối ưu hóa truy vấn SQL sau đó có thể chuyển sang kế hoạch băm hoặc hợp nhất phù hợp với khối lượng lớn dữ liệu.
Để xác nhận lý thuyết này một cách nhanh chóng, hãy thử tắt tự động cập nhật thống kê và chạy lại kiểm tra của bạn. Bạn không nên nhìn thấy "vết sưng" sau đó.
EDIT: Vì Falcon đã xác nhận rằng hiệu suất đã thay đổi do số liệu thống kê, chúng tôi có thể thực hiện các bước tiếp theo.
Tôi đoán bạn thực hiện từng bước một, đúng không? Trong trường hợp đó (nếu bạn không thể chèn số lượng lớn), bạn sẽ tốt hơn khi chèn vào một bảng làm việc heap, sau đó trong các khoảng thời gian đều đặn, di chuyển các hàng với số lượng lớn vào bảng đích. Điều này là do đối với mỗi hàng được chèn vào, SQL phải kiểm tra các bản sao khóa, khóa ngoài và các kiểm tra khác cũng như sắp xếp và phân tách tất cả các lần.Nếu bạn có thể đủ khả năng trì hoãn các kiểm tra này một chút sau đó, bạn sẽ nhận được một hiệu suất chèn tuyệt vời tôi nghĩ.
Tôi đã sử dụng phương pháp này để ghi số liệu. Đăng nhập sẽ đi vào một bảng đống đơn giản không có chỉ mục, không có khóa ngoài, không kiểm tra. Cứ mười phút, tôi tạo một bảng mới thuộc loại này, sau đó với hai "sp_rename" trong một giao dịch (hoán đổi nhanh), tôi làm cho toàn bộ bảng có sẵn để xử lý và bảng mới sẽ ghi nhật ký. Sau đó, bạn có sự thoải mái khi thực hiện tất cả việc kiểm tra, phân loại, chia tách chỉ một lần, với số lượng lớn.
Ngoài việc này, tôi không chắc chắn cách cải thiện tình hình của bạn. Bạn chắc chắn cần phải cập nhật số liệu thống kê thường xuyên vì đó là chìa khóa cho hiệu suất tốt nói chung.
Có thể thử sử dụng khóa phân cụm cột duy nhất và thêm chỉ mục duy nhất trên ba cột đó, nhưng tôi nghi ngờ nó sẽ giúp ích nhiều.
Có thể thử đệm chỉ mục - nếu dữ liệu được chèn của bạn không tuần tự. Điều này sẽ loại bỏ quá nhiều phân chia trang và xáo trộn và phân mảnh. Bạn sẽ cần phải duy trì padding thường xuyên mà có thể yêu cầu một off-thời gian.
Có thể cố gắng nâng cấp HW. Bạn sẽ cần phải tìm ra thành phần nào là nút cổ chai. Nó có thể là CPU hoặc đĩa - yêu thích của tôi trong trường hợp này. Bộ nhớ không có khả năng là imho nếu bạn có từng cái một. Nó sẽ được dễ dàng sau đó, nếu nó không phải là CPU (dòng treo trên đầu trang của đồ thị) thì nó rất có thể IO của bạn giữ bạn trở lại. Hãy thử một số bộ điều khiển tốt hơn, bộ nhớ cache tốt hơn và đĩa nhanh hơn ...
đột biến có lẽ sẽ là nhà văn lười biếng SQL –
BTW, chỉ mục nhóm trên 3 bigints là một ý tưởng tồi. –
Tại sao vậy? Bạn sẽ đề xuất điều gì? – Falcon