Cảnh báo của Dịch vụ: Hoạt động gây ra I / O còn lại so với tra cứu chính


9

Tôi đã thấy cảnh báo này trong các kế hoạch thực hiện SQL Server 2017:

Cảnh báo: Hoạt động gây ra dư IO [sic]. Số lượng hàng thực tế được đọc là (3,321,318), nhưng số lượng hàng được trả về là 40.

Đây là đoạn trích từ SQLSentry PlanExplorer:

Nhập mô tả hình ảnh ở đây

Để cải thiện mã, tôi đã thêm một chỉ mục không được nhóm, để SQL Server có thể đến các hàng có liên quan. Nó hoạt động tốt, nhưng thông thường sẽ có quá nhiều cột (lớn) để đưa vào chỉ mục. Nó trông như thế này:

Nhập mô tả hình ảnh ở đây

Nếu tôi chỉ thêm chỉ mục, không bao gồm các cột, nó sẽ trông như thế này, nếu tôi buộc sử dụng chỉ mục:

Nhập mô tả hình ảnh ở đây

Rõ ràng, SQL Server nghĩ rằng việc tra cứu khóa đắt hơn nhiều so với I / O còn lại. Tôi có một thiết lập thử nghiệm mà không có nhiều dữ liệu thử nghiệm (nhưng), nhưng khi mã đi vào sản xuất, nó cần phải hoạt động với nhiều dữ liệu hơn, vì vậy tôi khá chắc chắn rằng cần một số chỉ mục NonClustered.

Các tra cứu quan trọng có thực sự tốn kém không , khi bạn chạy trên SSD, tôi phải tạo các chỉ mục đầy đủ chất béo (với rất nhiều cột bao gồm)?


Kế hoạch thực hiện: https://www.brentozar.com/pastetheplan/?id=SJtiRte2X Đây là một phần của thủ tục lưu trữ dài. Hãy tìm IX_BatchNo_DeviceNo_CreatedUTC.


Câu hỏi cho bạn - Dựa trên đoạn cuối cùng của bạn, tại sao chi phí tra cứu sẽ ít hơn dựa trên phần cứng? (Giả sử phần cứng tương tự mà chỉ mục không được nhóm sẽ chạy trên) Tôi không rõ về điều đó.
George.Palacios

4
ước tính là 76,9% chi phí của kế hoạch đó . Điều đó không có nghĩa là nó đắt tiền. Hãy xem chi phí I / O là 0,06 so với kế hoạch ban đầu của bạn với chi phí I / O trên 10. Tôi nghĩ bạn sẽ tốt hơn, nhưng bạn nên thử nghiệm với các kế hoạch thực tế dựa trên đủ dữ liệu thực sự mô phỏng việc sản xuất sẽ như thế nào ( và nếu truy vấn chạy đủ lâu để chúng tôi thu thập dữ liệu từ đó sys.dm_exec_query_profiles, chúng tôi sẽ tính lại chi phí đó từ chi phí thực tế so với ước tính). Ngừng sử dụng% chi phí ước tính như một số chỉ số tuyệt đối về chi phí - nó tương đối và thường ra ngoài ăn trưa.
Aaron Bertrand

@AaronBertrand; chi phí ước tính của các tra cứu chính là 31.0. Bạn đang nói với tôi rằng SQL Server không biết chi phí của IO dư?
Henrik Staun Poulsen

Bạn thấy 31.0 ở đâu? Và bạn có nghĩa là 31,0 hoặc 31,0%?
Aaron Bertrand

1
Không, tôi đang nói rằng các chi phí bạn thấy là chi phí ước tính và, như Paul giải thích bên dưới, không nhất thiết phản ánh hiệu suất thời gian chạy.
Aaron Bertrand

Câu trả lời:


16

Mô hình chi phí được sử dụng bởi trình tối ưu hóa chính xác là: một mô hình . Nó tạo ra kết quả chung tốt trên một loạt các khối lượng công việc, trên một loạt các thiết kế cơ sở dữ liệu, trên một loạt các phần cứng.

Nói chung, bạn không nên cho rằng ước tính chi phí cá nhân sẽ tương quan mạnh mẽ với hiệu suất thời gian chạy trên một cấu hình phần cứng cụ thể. Điểm của chi phí là cho phép trình tối ưu hóa đưa ra lựa chọn có giáo dục giữa các lựa chọn vật lý ứng cử viên cho cùng một hoạt động logic.

Khi bạn thực sự hiểu chi tiết, một chuyên gia cơ sở dữ liệu lành nghề (có thời gian rảnh rỗi để điều chỉnh một truy vấn quan trọng) thường có thể làm tốt hơn. Ở mức độ đó, bạn có thể nghĩ về lựa chọn kế hoạch của trình tối ưu hóa là điểm khởi đầu tốt. Trong hầu hết các trường hợp, điểm bắt đầu đó cũng sẽ là điểm kết thúc, vì giải pháp tìm thấy là đủ tốt .

Theo kinh nghiệm của tôi (và ý kiến), trình tối ưu hóa truy vấn SQL Server có chi phí tra cứu cao hơn tôi mong muốn. Điều này phần lớn là nôn nao từ những ngày mà I / O vật lý ngẫu nhiên đắt hơn nhiều so với truy cập tuần tự so với thường thấy hiện nay.

Tuy nhiên, tra cứu có thể đắt tiền ngay cả trên SSD, hoặc cuối cùng ngay cả khi đọc độc quyền từ bộ nhớ. Đi qua các cấu trúc cây b không phải là miễn phí. Rõ ràng là chi phí gắn kết khi bạn làm nhiều hơn trong số họ.

Các cột được bao gồm rất tốt cho khối lượng công việc OLTP nặng đọc, trong đó sự cân bằng giữa việc sử dụng không gian chỉ mục và chi phí cập nhật so với hiệu suất đọc thời gian chạy có ý nghĩa. Ngoài ra còn có một sự đánh đổi để xem xét xung quanh sự ổn định của kế hoạch . Một chỉ số bao phủ đầy đủ sẽ tránh được câu hỏi khi nào chính xác mô hình chi phí của trình tối ưu hóa có thể chuyển đổi từ phương án này sang phương án khác.

Chỉ bạn mới có thể quyết định xem sự đánh đổi có đáng không trong trường hợp của bạn. Kiểm tra cả hai lựa chọn thay thế trên một mẫu dữ liệu đại diện và đưa ra lựa chọn sáng suốt.

Trong một câu hỏi bình luận bạn đã thêm:

Bạn đang nói với tôi rằng SQL Server không biết chi phí của IO dư?

Không, trình tối ưu hóa xem xét chi phí của I / O còn lại. Thật vậy, theo như trình tối ưu hóa có liên quan, các biến vị ngữ không SARG được đánh giá trong một Bộ lọc riêng. Bộ lọc này được đẩy vào tìm kiếm hoặc quét dưới dạng dư trong quá trình viết lại sau tối ưu hóa .


Cảm ơn bạn rất nhiều vì câu trả lời của bạn. Tôi sẽ cố gắng làm theo lời khuyên của bạn về dữ liệu thử nghiệm, vì vậy tôi có thể tìm ra chỉ số nào tôi thực sự cần. Thật tốt khi biết rằng bạn nghĩ rằng việc tra cứu nên chi phí ít hơn trên SSD. Nó điềm lành cho vNext.
Henrik Staun Poulsen
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.