2012-01-24 29 views
5

Tôi có một vài câu hỏi liên quan đến hiệu suất của Microsoft SQL Server 2008, chủ yếu là về các kế hoạch thực hiện.Lập kế hoạch thực thi SQL caching

Theo, để MSDN, thủ tục lưu trữ có hiệu suất tốt hơn so với các truy vấn SQL trực tiếp, bởi vì:

Cơ sở dữ liệu có thể chuẩn bị, tối ưu hóa, và bộ nhớ cache kế hoạch thực hiện để các kế hoạch thực hiện có thể được tái sử dụng tại một sau đó.

Câu hỏi đầu tiên của tôi là lý do tại sao điều này xảy ra. Trước đây tôi đã đọc rằng khi sử dụng các truy vấn tham số (các câu lệnh đã chuẩn bị), kế hoạch thực hiện được lưu trữ trong các lần thực thi tiếp theo với các giá trị tiềm năng khác nhau (ngữ cảnh thực thi). Một thủ tục lưu sẵn có hiệu quả hơn không? Nếu vậy, kế hoạch thực hiện của một thủ tục lưu trữ chỉ được tạo lại theo yêu cầu, hoặc là nó ít có khả năng bị xóa khỏi bộ đệm ẩn? Là truy vấn được tham số được coi là ad-hoc query, có nghĩa là kế hoạch thực thi có nhiều khả năng bị xóa khỏi bộ nhớ cache?

Ngoài ra, vì tôi vẫn là một người mới trong lĩnh vực này, tôi tự hỏi nếu có một số lệnh chỉ hoạt động trong T-SQL. Tôi có một truy vấn mất ~ 12 giây để hoàn thành trong lần chạy đầu tiên và sau đó ~ 3 giây sau đó, trong cả Microsoft SQL Management Studio và ADO.NET. Truy vấn được cho là không hiệu quả như một phần của bản trình bày của tôi. Vấn đề là trong truy vấn của tôi, tôi sử dụng cả hai CHECKPOINTDBCC DROPCLEANBUFFERS theo this article và cũng OPTION (RECOMPILE). Tuy nhiên, ít nhất hai đầu tiên dường như không tạo ra sự khác biệt, vì truy vấn sẽ vẫn mất 3 giây. Tôi đoán là do bộ đệm dữ liệu không bị xóa. Bất kỳ ý tưởng nào tại sao bộ nhớ cache dường như không bị xóa hoặc bất kỳ ý tưởng nào về lý do truy vấn của tôi nhanh hơn đáng kể sau lần thực thi đầu tiên?

Đó là những câu hỏi tôi có thể nghĩ đến bây giờ.

+2

Câu hỏi hay - tôi sẽ chia bài đăng này thành một vài bài đăng, có thể một bài đăng cho câu hỏi về truy vấn được lưu trữ-proc và truy vấn tham số, một bài đăng cho nhiều lần truy vấn, v.v. –

+0

Có lẽ bạn đã đúng; tâm trí của tôi đã suy nghĩ không để spam. :-) – Andy0708

+0

Ý tưởng stackoverflow là để giữ cho câu hỏi tập trung để lần lượt các câu trả lời có thể được tập trung là tốt - vì vậy đừng lo lắng về việc tải trang web với một loạt các câu hỏi –

Trả lời

3

"Quy trình lưu sẵn có hiệu quả hơn không?": Về bản chất là không. Nó tiết kiệm rất ít. Từ quan điểm hiệu suất, bạn có thể sử dụng khá nhiều chữ SQL trong ứng dụng của mình (trừ khi chúng là HUGE). SQL Server sẽ khớp với chuỗi bạn gửi đến một gói được lưu vào bộ nhớ cache tốt.

"Tôi có một truy vấn mất ~ 12 giây để hoàn thành trong lần chạy đầu tiên và sau đó ~ 3 giây sau" Xem xét rằng bạn đã xóa tất cả bộ nhớ cache, đây có thể là vấn đề thống kê. SQL Server tự động tạo các số liệu thống kê trong lần đầu tiên bạn truy cập một cột. Tôi đoán đây là những gì đã xảy ra một lần với bạn. Hãy thử chạy sp_updatestats (trước khi bạn xóa cache).

+0

bạn biết nếu các kế hoạch thực thi cho các thủ tục được lưu trữ và các truy vấn được tham số hóa được "xử lý" theo cùng một cách trong bộ nhớ cache? Ý tôi là nếu một người có nhiều khả năng bị đỏ mặt hơn người kia. Xóa số liệu thống kê dường như không có nhiều ảnh hưởng. – Andy0708

+0

Tôi không nghĩ rằng chúng có các đặc tính xả khác nhau.Flushing xảy ra chỉ khi bộ nhớ là ngắn vì vậy điều này có thể không quan trọng với bạn cả. – usr

+0

Giữ tất cả các mã trong sprocs vì lý do hiệu suất thực sự là loại lỗi thời. – usr

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