6

Tôi có cơ sở dữ liệu nhiều người thuê trong SQL Server 2012, trong đó mỗi hàng của người thuê được xác định bởi cột tenant_id (còn gọi là phương pháp Shared Database, Shared Schema). Một số người thuê nhà, đặc biệt là những người mới hơn, có rất ít hàng, trong khi những người khác có nhiều.Cơ sở dữ liệu SQL Server nhiều người thuê và tham số sniffing

tối ưu truy vấn SQL Server thường xây dựng một kế hoạch truy vấn dựa trên các thông số được cung cấp trong quá trình thực hiện đầu tiên, sau đó tái sử dụng kế hoạch này cho tất cả các truy vấn tương lai thậm chí nếu các thông số khác nhau được cung cấp. Điều này được gọi là parameter sniffing. Vấn đề chúng tôi có với cơ sở dữ liệu của chúng tôi là SQL Server đôi khi xây dựng các kế hoạch này dựa trên các tham số trỏ đến một đối tượng thuê nhỏ hơn, hoạt động tốt cho người thuê đó, nhưng sau đó khi nó áp dụng lại kế hoạch được lưu vào một người thuê lớn hơn, nó không thành công thảm họa (thường là thời gian ra, trên thực tế). Thông thường chúng ta tìm hiểu về tình trạng này chỉ khi một trong những người thuê lớn hơn của chúng tôi liên hệ với chúng tôi về việc gặp lỗi hết thời gian, sau đó chúng tôi phải truy cập vào hệ thống và tự xóa tất cả các kế hoạch truy vấn để sửa nó.

Có một gợi ý truy vấn bạn có thể sử dụng để ngăn SQL Server lưu trữ kế hoạch truy vấn (OPTIMIZE FOR UNKNOWN) nhưng điều này dẫn đến một số phí bổ sung do kế hoạch truy vấn đang được tạo lại mỗi lần truy vấn được gọi. Một vấn đề nữa là chúng tôi đang sử dụng Khung thực thể không cung cấp khả năng xác định gợi ý OPTIMIZE FOR UNKNOWN về các truy vấn.

Vậy câu hỏi được - thực hành tốt nhất cho cơ sở dữ liệu đa người thuê nhà có liên quan đến tham số sniffing với là gì? Có cách nào để vô hiệu hóa tham số sniffing toàn bộ cơ sở dữ liệu mà không cần phải xác định nó trên mỗi truy vấn? Nếu vậy, đó là ngay cả cách tiếp cận tốt nhất? Tôi có nên phân vùng dữ liệu theo cách khác không? Có cách tiếp cận nào khác mà tôi không nghĩ tới không?

+0

AFAIK, bạn cần phải sử dụng Quy trình được lưu trữ để khắc phục sự cố này. Trừ khi có một số tính năng của EF có thể giúp bạn giải quyết vấn đề này. – RBarryYoung

+0

'OPTIMIZE FOR UNKNOWN' không có hành vi bạn mô tả. Bạn đang bối rối với 'OPTION (RECOMPILE)'. Nếu bạn đang sử dụng Enterprise Edition, bạn có thể xem hướng dẫn kế hoạch để cung cấp gợi ý. Hoặc có một dấu vết cờ (4136) để [vô hiệu hóa tham số sniffing hoàn toàn] (http://support.microsoft.com/kb/980653) nhưng điều đó áp dụng cho ** dụ ** không cơ sở dữ liệu. –

Trả lời

3

Tôi đã có vấn đề tương tự, và đã giải quyết nó thành công bằng cách thông qua các thông số của tôi trong như thế này:

CREATE PROCEDURE [dbo].[InsertAPCheck] 
@APBatchID int = Null, 
@BankAccountID int = Null 
AS 
    /* copy parameters to temporary variables */ 
    SELECT @xAPBatchId = APBatchId, @xBankAccountID = @BankAccountID 
. 
. 
/* now run the meat of your logic using the temp variables */ 
SELECT * FROM myTable where [email protected] 

nói cách khác, tạo ra một biến địa phương trên cơ sở 1-1 cho mỗi tham số được thông qua vào và sau đó chỉ tham chiếu những biến mới trong logic của SP. Tôi có lẽ bỏ lỡ một số tối ưu hóa mà SQL Server có thể làm cho tôi, nhưng quan trọng nhất là tôi bỏ lỡ hiệu suất thực sự kinh khủng mà tôi nhận được khi đá đánh dấu paramer eter in

Trong trường hợp của bạn, có lẽ bạn có thể thử làm điều này chỉ cho id nhiều người thuê (mà tôi giả định là một tham số cho tất cả các SP?), và để cho máy chủ SQL tối ưu hóa phần còn lại của các tham số nếu nó có thể.

+0

Đây thực chất là những gì OPTIMIZE FOR UNKNOWN gợi ý truy vấn nào. Rất tiếc, tôi không thể sử dụng phương pháp tiếp cận với Entity Framework vì tôi không thể sửa đổi truy vấn đang được tạo. – Mike

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