7

Tôi đã nhận thấy một sự thay đổi hiệu suất thú vị xảy ra khoảng 1,5 triệu giá trị đã nhập. Ai đó có thể cho tôi một lời giải thích tốt tại sao điều này đang xảy ra?Sql Server 2008 R2 DC Chèn hiệu suất thay đổi

Bảng rất đơn giản. Nó bao gồm (bigint, bigint, bigint, bool, varbinary (max)) Tôi có một chỉ số pk clusered trên ba bigints đầu tiên. Tôi chỉ chèn boolean "true" làm dữ liệu varbinary (max).

Từ thời điểm đó, hiệu suất có vẻ khá ổn định.

Chú thích: Y (Thời gian bằng ms) | X (Chèn 10K)

enter image description here

Tôi cũng curios về hằng số tương đối nhỏ (đôi khi rất lớn) gai Tôi có trên đồ thị.

Kế hoạch thực thi thực tế từ trước khi tăng đột biến.

Actual Execution Plan from before spikes

Chú thích:
Bảng I đang chèn vào: TSMDataTable
1. bigint DataNodeID - fk
2. bigint TS - timestapm chính
3. bigint CTS - sửa đổi timestamp
4 Bit: ICT - giữ bản ghi giá trị được chèn cuối cùng (tăng hiệu suất đọc)
5. Dữ liệu: Dữ liệu
Giá trị Bool Thời gian hiện tại sta mpl giữ

Enviorment
Đó là địa phương.
Nó không chia sẻ bất kỳ tài nguyên nào.
Đây là cơ sở dữ liệu kích thước cố định (đủ để nó không mở rộng).
(Máy tính, 4 lõi, 8GB, 7200rps, Win 7).
(Sql Server 2008 R2 DC, Bộ xử lý sở thích (lõi 1,2), 3GB,)

+1

đột biến có lẽ sẽ là nhà văn lười biếng SQL –

+0

BTW, chỉ mục nhóm trên 3 bigints là một ý tưởng tồi. –

+1

Tại sao vậy? Bạn sẽ đề xuất điều gì? – Falcon

Trả lời

1

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 ...

+0

Tôi sẽ xem xét và cho bạn biết những gì tôi đã tìm thấy. – Falcon

+1

Tôi đã thử nghiệm nó, và sau khi tắt các số liệu thống kê, tôi không thấy "vết sưng". Thông qua các kết quả kiểm tra rất nhất quán, và tôi đã nhận thấy đáng kể - 10% - tăng hiệu suất. – Falcon

+1

Rất tốt Falcon :) hạnh phúc. Bây giờ bạn biết những gì đang xảy ra và bạn có thể sửa lỗi đó;) Tôi sẽ cố gắng đưa ra một số gợi ý chỉnh sửa câu trả lời của tôi. – Rbjz

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