Cải thiện tốc độ xóa cho SQL Server


11

Chúng tôi có cơ sở dữ liệu sản xuất khổng lồ, kích thước của nó là khoảng 300GB. Có cách tiếp cận nào để cải thiện hiệu năng của truy vấn xóa không? Hiện tại tốc độ xóa là từ 1-10k mỗi phút, nó rất chậm đối với chúng tôi.


2
1000 hàng mỗi phút âm thanh cực kỳ chậm. Bạn đang gặp sự cố chặn? Hoặc là quá chậm để chọn các hàng quá, điều này sẽ gợi ý nhu cầu về chỉ mục?
James Z

Có lẽ bạn phải tạo chỉ mục để bao gồm các tiêu chí xóa của bạn.
Ginden

6
Không có đủ chi tiết để cung cấp một câu trả lời. Truy vấn nào bạn thực hiện? Bạn có chỉ mục trên các cột tiêu chí liên quan (nếu có) không? Bạn có kích hoạt xóa? ...
Sébastien Sevrin

3
Bạn đang cố gắng xóa một tỷ hàng tại một thời điểm? Có thể là bạn đang chờ autogrow sau autogrow sau autogrow? (Nhiều khả năng đó là hoạt động đăng nhập mà bạn đang chờ đợi, không phải hoạt động xóa thực tế.) Xem bài viết này ...
Aaron Bertrand

3
Cũng thế. Bất kỳ hạn chế khóa ngoại? Vui lòng cung cấp định nghĩa bảng đầy đủ, truy vấn và kế hoạch thực hiện.
Martin Smith

Câu trả lời:


18

Nếu bạn đang cố gắng xóa một số lượng lớn các hàng trong một câu lệnh, thì có khả năng bạn đang chờ hoạt động nhật ký. Vì vậy, bạn có thể:

  1. Đảm bảo nhật ký của bạn có kích thước phù hợp để các sự kiện tăng trưởng không làm bạn chậm lại. Với mặc định, nhật ký của bạn có thể bắt đầu ở mức 1MB với mức tăng trưởng 10%. Các sự kiện tăng trưởng rất tốn kém và nếu bạn đang đăng nhập thậm chí 10 GB xóa, điều này sẽ phá hủy hiệu suất không chỉ bây giờ mà còn trong tương lai (do những gì nó làm với VLF).
  2. Nếu bạn đang xóa toàn bộ bảng, hãy sử dụng TRUNCATEhoặc DROP/ CREATE.
  3. Nếu bạn đang xóa hầu hết các bảng, hãy sử dụng SELECT INTOđể đặt dữ liệu bạn muốn giữ vào một bảng khác, sau TRUNCATEđó di chuyển phần nhỏ trở lại. (Hoặc chỉ cần bỏ bảng cũ, đổi tên bảng mới và áp dụng lại các ràng buộc / quyền, v.v.)
  4. Giảm thiểu tác động của việc đăng nhập ở nơi đầu tiên bằng cách xóa dữ liệu trong các khối thay vì tất cả cùng một lúc. Xem bài viết này . Bạn cũng có thể tạm thời chuyển sang khôi phục đơn giản để bạn chỉ phải CHECKPOINTxóa nhật ký thay vì sao lưu nhật ký, nhưng bạn cần chắc chắn đặt lại và thực hiện sao lưu toàn bộ mới để khởi tạo lại chuỗi nhật ký .

+1, từ tôi cho một bài viết xuất sắc. Điều này đã giúp tôi trong quá khứ để làm cho các nhà phát triển của chúng tôi hiểu hoạt động xóa khi họ tiếp tục tiếp cận chúng tôi vì sự chậm chạp và tăng trưởng trong tệp nhật ký.
KASQLDBA

Ngoài ra, nếu có bất kỳ chỉ mục không cần thiết, thả chúng sẽ tăng tốc độ xóa. Một lần nữa nếu xóa tất cả hoặc gần như tất cả dữ liệu, bỏ tất cả các chỉ mục trước và tạo lại chúng sau đó có thể có tác động tốt.
Tony Hinkle

3
@Tony bỏ chỉ mục cũng phải được ghi lại (cũng như tạo ra nó), vì vậy nó có thể chỉ là vấn đề khi bạn muốn trả chi phí đó. Nếu không thử nghiệm, tôi không tin rằng có một lợi thế rất lớn cho kịch bản xóa (như sẽ có để chèn / cập nhật), trừ khi bạn có các chỉ mục mà bạn sẽ không giữ lại sau đó.
Aaron Bertrand

Việc vô hiệu hóa tạm thời các ràng buộc FK có thể cải thiện truy vấn không?
Lev Z

3

Có một số gợi ý, nhưng bạn đang sử dụng phiên bản nào? Có phải là phiên bản doanh nghiệp? Dù sao:

  1. Nếu bạn có thể, hãy chuyển nhật ký giao dịch sang đĩa nhanh hơn
  2. Phân tích ở đâu . Nó sẽ sử dụng một chỉ mục để xác định hồ sơ để xóa? Nếu không, bạn có thể thêm một chỉ mục?
  3. Bạn có bất kỳ chỉ số trên bảng mà bạn có thể thả? Nếu có, thả chúng.
  4. Bạn có khóa ngoại so với bảng này không? Đây thực sự có thể làm chậm xóa của bạn.
  5. Nếu bạn có phiên bản doanh nghiệp và nút cổ chai là đĩa IO, nén ở cấp hàng, có thể cung cấp cho bạn một chút trợ giúp (hoặc không, tùy thuộc vào dữ liệu của bạn)
  6. Bạn có thể phân vùng bảng? Chỉ mục cục bộ và thả phân vùng có thể nhanh hơn.
  7. Điều tra nơi tắc nghẽn thông qua giám sát hoạt động.

Thêm chi tiết, khi bạn làm việc với cơ sở dữ liệu lớn, không có một câu trả lời hợp lệ nào.


0

Bạn nên thử xóa từng đoạn một, có thể xóa trong vòng lặp, mỗi lần lặp lại đó là giao dịch riêng và sau đó xóa nhật ký ở cuối mỗi lần lặp.

Ngoài ra, bạn sẽ cần tìm số mà bạn sẽ sử dụng làm giá trị trong khối để xóa các bản ghi. Nó đòi hỏi phải kiểm tra kỹ lưỡng, sẽ tốt hơn nếu bạn có thể kiểm tra giá trị khối trong UAT trước.

Về cách tiến hành, sẽ giới thiệu cho bạn để chia các thao tác xóa lớn thành các khối


0

xóa có thể chậm nếu bảng lớn có khóa ngoại đệ quy.

nếu vậy, hãy tìm thời điểm thích hợp, vô hiệu hóa các dịch vụ phụ thuộc, vô hiệu hóa khóa ngoại đệ quy, thực hiện xóa lớn, sau đó khôi phục lại khóa ngoại.


đây chính xác là trường hợp của tôi Có một chút rủi ro khi vô hiệu hóa chống chỉ định, nhưng xóa đã đi từ 1 hàng / seocnd đến 500 / giây
Jurion

0

Thêm vài điểm nữa ...

  1. Hãy thử kiểm tra xem vị ngữ có chỉ mục trên đó không và cũng xem số liệu thống kê.
  2. Nếu bạn đang xóa số lượng lớn các hàng và bạn cũng không muốn tùy chọn bảng tạm thời. Đi cho tablocktùy chọn.
  3. Xem nếu bạn có bất kỳ kích hoạt, đặc biệt là sau khi xóa kích hoạt.

Để nhận thêm trợ giúp, hãy đăng truy vấn bạn đang sử dụng, thông tin bảng cộng với bất kỳ thông tin chặn nào.

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.