2009-08-22 24 views
5

Chúng tôi đang sử dụng một bảng duy nhất để Kiểm tra trong SQL Server 2008 DB.INSERT nhanh bằng SQL không có CẬP NHẬT

Kiến trúc bảng đơn hoạt động độc đáo, rất đơn giản để truy vấn, chứa các thay đổi lược đồ.

Nhưng đó là nút cổ chai lớn cho toàn bộ DB. Tất cả INSERTS và UPDATES phải đi qua bảng kiểm toán.

Chúng tôi đã sử dụng NOLOCK HINT cho câu lệnh SELECT.

Vì không có CẬP NHẬT cho bảng này, có bất kỳ đề xuất nào để cải thiện thông lượng của câu lệnh INSERT không?

Trả lời

4

Đảm bảo bạn có chỉ mục nhóm chính INT (hoặc BIGINT) chính xác trên bảng! Và tốt hơn là không có chỉ số nào khác (nếu có thể) - những chỉ số này sẽ làm chậm quá trình chèn.

Đó là một quan niệm sai lầm phổ biến vì bảng chỉ cần INSERT và hầu như không có bất kỳ lần đọc nào, bạn nên "lưu" chính mình sự cố của khóa chính, được nhóm.

Như Nữ thần của SQL Server Indexing, Kimberly Tripp, giải thích trong bài đăng blog tuyệt vời cô The Clustered Index Debate continues:

Phụ trang nhanh hơn trong một nhóm bảng (nhưng chỉ trong "đúng" bảng nhóm) hơn so với một heap . Vấn đề chính ở đây là tìm kiếm trong IAM/PFS để xác định vị trí chèn trong một heap là chậm hơn trong bảng được nhóm (vị trí chèn được biết, được xác định bằng khóa cụm). Chèn sẽ nhanh hơn khi được đưa vào một bảng nơi đặt hàng được xác định (CL) và nơi đơn đặt hàng đó ngày càng tăng.

Vì vậy, một đúng clustered index có thể tăng tốc độ chèn của bạn, và ngay tại đây có nghĩa là tĩnh (không bao giờ thay đổi), độc đáo, càng nhỏ càng tốt (INT hoặc bigint) và tốt nhất ngày càng tăng (không chia tách trang và do đó không có hình phạt hiệu suất).

Ngoài ra nếu bảng của bạn chỉ nhận được chèn và không có cập nhật/xóa, bạn nên đảm bảo sử dụng 100% FILLFACTOR trên chỉ mục nhóm để điền đầy đủ các trang máy chủ SQL đó.

Marc

+0

Tôi đang làm việc cùng các dòng này. Tôi có một KEY CHÍNH XÁC ĐÁNG TIN CẬY ĐƯỢC CHỨNG NHẬN để INSERT thực sự là PHỤ LỤC ở trang cuối cùng. 100% FILL FACTOR LÀ MỘT NICE touch. Tôi đang nghĩ đến việc bảo trì hàng tháng, di chuyển các bản ghi đến bảng lịch sử "vĩnh viễn", để bảng chính không bao giờ phát triển lớn. – pkario

+0

Vâng, nếu bạn có một chỉ số ngày càng tăng, ngay cả kích thước của bảng thực sự không phải là một vấn đề lớn (ngoại trừ lựa chọn, rõ ràng) –

2

Các khuyến nghị duy nhất tôi có thể làm là:

  • đảm bảo bạn đang viết các giá trị không theo chuỗi càng nhiều càng tốt
  • đóng gói viết của bạn để kiểm toán thông qua các thủ tục lưu trữ
  • lấy bất kỳ dữ liệu khác từ cuộc gọi thủ tục được lưu trữ hoặc,
  • xem xét sử dụng Chế độ xem chỉ riêng cho mục đích này trong sproc kiểm tra của bạn. Đảm bảo các kết nối của nó càng nhỏ càng tốt. Chế độ xem này sẽ dành cho tra cứu PK cho các thông báo kiểm tra, v.v. khi cố định vị trí FK cho dữ liệu chuỗi của bạn.
  • không phải là đề xuất, nhưng thực tế: ít chỉ mục hơn có nghĩa là chèn nhanh hơn + lựa chọn chậm hơn.
  • xem xét lưu trữ các hàng kiểm tra 'cũ' sang một bảng khác. Giữ bảng kiểm toán càng nhỏ càng tốt. Di chuyển các hàng kiểm tra cũ hơn sang một bảng khác. Để báo cáo/truy vấn, hãy tạo chế độ xem sẽ join hoặc union kiểm tra 'sống' và 'cũ hơn'.
0

Nếu bạn chỉ phụ thêm vào các bảng kiểm toán và chạy các báo cáo rằng sẽ luôn luôn kết thúc thực hiện quét bảng, hãy xem xét loại bỏ bất kỳ chỉ số trên bàn.

Các vấn đề liên quan