Tối ưu hóa hiệu suất chèn bảng máy chủ


8

Cài đặt

Trong một nhà kho dữ liệu, tôi đang tham gia một bảng thực tế đến 20 chiều. Bảng thực tế có 32 triệu hàng và 30 cột. Đây là một bảng phân tầng tạm thời vì vậy tôi không phải đối phó với những người dùng khác đang đọc hoặc viết lên bàn. Tôi chọn 10 cột từ bảng cơ sở và 20 cột từ các kích thước tương ứng. Các bảng kích thước nhỏ (từ 3 đến 15.000 hàng). Các trường trên đó được nối là cả số nguyên và nvarchar. Tôi sử dụng câu lệnh CHỌN ... VÀO. Không có chỉ mục trên các bảng.

Tốc độ thực hiện của truy vấn này quá chậm không hữu ích.

Giải pháp đã thử

Vì truy vấn mất quá nhiều thời gian để xử lý, tôi đã thử các giải pháp sau:

  1. Chia 20 tham gia thành 4 tham gia trên 5 bảng. Hiệu suất truy vấn vẫn còn thấp.
  2. Đặt các chỉ mục trên các cột khóa ngoại. Không giảm thời gian đáng kể.
  3. Hãy chắc chắn rằng các trường của điều kiện nối là số nguyên. Tôi nhận thấy hiệu suất tăng 25%. Không hoàn toàn những gì tôi đang tìm kiếm.
  4. Sử dụng một câu lệnh chèn vào thay vì chọn vào. Hiệu suất tệ hơn vì tăng trưởng tệp nhật ký mặc dù cơ sở dữ liệu ở chế độ khôi phục đơn giản.

Những phát hiện này đã đưa tôi đến bao gồm cả kế hoạch thực hiện thực tế cho thấy 89% chi phí nằm trong phần chèn bảng . Các chi phí khác là quét bảng 8% trên bảng thực tế và 2% cho khớp băm cho các phép nối bên trong.

Câu hỏi

  1. Các lý do có thể của chèn bảng chậm là gì?
  2. Các cách để xác định nút cổ chai này mà không có kế hoạch thực hiện là gì?
  3. Tôi có thể làm gì để giảm chi phí chèn bảng?

CHỌN VÀO là về phương pháp chèn DML nhanh nhất hiện có. Thông lượng nào bạn nhận được trong hàng / giây và MB / giây? Có lẽ nó chỉ đơn giản là gần mức tối đa dự kiến. Phiên bản máy chủ này là gì?
usr

Tỷ lệ phần trăm trong kế hoạch thực tế là ước tính, không phải là tỷ lệ phần trăm thực tế. Sử dụng "thống kê io" có thể tiết lộ một cái gì đó quan trọng.
James Z

Câu trả lời:


12

Các lý do có thể của chèn bảng chậm là gì? Các cách để xác định nút cổ chai này mà không có kế hoạch thực hiện là gì?

Đọc Cách phân tích hiệu suất của SQL Server , đặc biệt là phần Phân tích thời gian chờ thực hiện truy vấn riêng lẻ .

Tôi có thể làm gì để giảm chi phí chèn bảng?

Điều đó sẽ phụ thuộc phần lớn vào kết quả phân tích hiệu suất. Đầu tiên và quan trọng nhất, đảm bảo phần CHỌN càng nhanh càng tốt. Giả sử rằng vấn đề là chèn một luồng được ghi đầy đủ, một số giải pháp là:


Đồng thời kiểm tra sự phân mảnh bên trong và bên ngoài nếu nhiều hàng trải rộng được xóa đầu tiên khỏi bảng.
Ian Ringrose

1

Dưới đây là kinh nghiệm của tôi và có thể giúp đỡ bất cứ ai khác ngoài đó.

Chúng tôi đã cố gắng chuyển một số dữ liệu từ cơ sở dữ liệu này sang cơ sở dữ liệu khác cũng thực hiện một số biến đổi theo cách này. Kiểm tra sự biến đổi, chúng tôi đã thực hiện rất nhiều thao tác chèn, sửa chữa mọi thứ trên đường đi sau đó xóa để kiểm tra lại thao tác chèn. Tuy nhiên, sau một số lần chèn và cắt ngắn, các truy vấn của chúng tôi bắt đầu chạy chậm và một lần chèn đơn giản bắt đầu mất tới 9 phút trong khi trước đó nó đã chạy được khoảng 3 phút.

  1. Vâng, chúng tôi bắt đầu xem xét tối ưu hóa CHỌN đầu tiên. Thay vì truy vấn con, chúng tôi đã sử dụng #tempTables. Trong khi điều này đã tăng tốc mọi thứ một chút, nó vẫn không thỏa mãn.
  2. Điều làm cho tất cả sự khác biệt là và xây dựng lại chỉ mục và cập nhật thống kê trên cơ sở dữ liệu đích và điều đó đã đưa phần chèn vào khoảng 2 phút.

Vì vậy, hãy thử hai chiến lược này và xem cách này phù hợp với bạn.

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.