2010-01-04 40 views
9

Khi tôi chạy một quy trình được lưu trữ nhất định lần đầu tiên cần khoảng 2 phút để hoàn tất. Khi tôi chạy nó lần thứ hai nó kết thúc trong khoảng 15 giây. Tôi giả định rằng điều này là bởi vì tất cả mọi thứ được lưu trữ sau khi chạy đầu tiên. Tôi có thể "làm ấm bộ đệm ẩn" trước khi tôi chạy quy trình này lần đầu tiên không? Thông tin được lưu trong bộ nhớ cache chỉ được sử dụng khi tôi gọi cùng một thủ tục đã lưu với các tham số giống nhau hay nó sẽ được sử dụng nếu tôi gọi cùng một thủ tục được lưu trữ với các tham số khác nhau?Câu hỏi bộ nhớ cache SQL Server

Trả lời

9

Khi bạn định dạng truy vấn của mình, dữ liệu được đọc vào bộ nhớ theo khối. Những khối này vẫn còn trong bộ nhớ nhưng chúng trở nên "già". Điều này có nghĩa là các khối được gắn thẻ với quyền truy cập cuối cùng và khi Sql Server yêu cầu một khối khác cho truy vấn mới và bộ nhớ cache đầy, khối được sử dụng gần đây nhất (cũ nhất) bị loại khỏi bộ nhớ. (Trong hầu hết các trường hợp - các khối quét toàn bộ bảng được ngay lập tức ở độ tuổi để ngăn chặn việc quét toàn bộ bộ nhớ tràn bộ nhớ và làm tắc nghẽn máy chủ).Điều gì đang xảy ra ở đây là các khối dữ liệu trong bộ nhớ từ truy vấn đầu tiên chưa được loại bỏ khỏi bộ nhớ nhưng có thể được sử dụng cho truy vấn thứ hai của bạn, nghĩa là tránh truy cập đĩa và hiệu suất được cải thiện.

Vì vậy, câu hỏi của bạn thực sự hỏi là "tôi có thể lấy các khối dữ liệu tôi cần vào bộ nhớ mà không đọc chúng vào bộ nhớ (thực sự đang thực hiện truy vấn) không?". Câu trả lời là không, trừ khi bạn muốn cache toàn bộ các bảng và để chúng nằm trong bộ nhớ vĩnh viễn, từ thời gian truy vấn (và do đó kích thước dữ liệu) mà bạn mô tả, có lẽ không phải là một ý tưởng tốt.

Đặt cược tốt nhất để cải thiện hiệu suất là xem xét các kế hoạch thực hiện truy vấn của bạn và xem liệu việc thay đổi các chỉ mục của bạn có thể mang lại kết quả tốt hơn hay không. Có hai lĩnh vực chính mà có thể cải thiện hiệu suất ở đây:

  • tạo ra một chỉ số hợp truy vấn có thể sử dụng một trong để tránh các truy vấn không hiệu quả và bảng quyét toàn bộ
  • thêm cột hơn một chỉ số để tránh đọc đĩa thứ hai. Ví dụ, bạn có một truy vấn trả về cột A và B với mệnh đề where trên A và C và bạn có chỉ mục trên cột A. Truy vấn của bạn sẽ sử dụng chỉ mục cho cột A yêu cầu một đĩa đọc nhưng sau đó yêu cầu đĩa thứ hai nhấn để lấy các cột B và C. Nếu chỉ mục có tất cả các cột A, B và C trong đó thì lần truy cập đĩa thứ hai để có được dữ liệu có thể tránh được.
-1

Kế hoạch thực hiện (thông tin được lưu trong bộ nhớ cache cho quy trình của bạn) được sử dụng lại mọi lúc, ngay cả với các thông số khác nhau. Nó là một trong những lợi ích của việc sử dụng procs được lưu trữ.

Lần đầu tiên một thủ tục được lưu trữ được thực hiện, SQL Server tạo ra một kế hoạch thực hiện và đặt nó trong bộ nhớ cache thủ tục.

Một số thay đổi nhất định đối với cơ sở dữ liệu có thể kích hoạt cập nhật tự động kế hoạch thực hiện (và bạn cũng có thể yêu cầu biên dịch lại một cách rõ ràng).

Kế hoạch thực hiện được giảm từ bộ nhớ cache thủ tục dựa trên "tuổi" của chúng. (từ MSDN: Các đối tượng không thường xuyên được tham chiếu sớm đủ điều kiện để deallocation, nhưng không thực sự deallocated trừ khi bộ nhớ là cần thiết cho các đối tượng khác.)

Tôi không nghĩ rằng có bất kỳ cách nào để "làm ấm bộ nhớ cache", ngoại trừ để thực hiện proc được lưu trữ một lần. Điều này sẽ đảm bảo rằng có một kế hoạch thực hiện trong bộ nhớ cache và bất kỳ cuộc gọi tiếp theo nào sẽ sử dụng lại nó.

thông tin chi tiết có sẵn trong tài liệu MSDN: http://msdn.microsoft.com/en-us/library/ms181055(SQL.90).aspx

+4

phản ứng của bạn, mặc dù tôi không thể nhìn thấy bất cứ điều gì sai với nó, bỏ lỡ điểm. Quá trình biên dịch truy vấn không mất 1m45, vì vậy đây không phải là vấn đề của OP. Các vấn đề về bộ nhớ đệm OP phải làm với bộ nhớ cache của trang dữ liệu, không phải là bộ nhớ cache của kế hoạch thực thi. – erikkallen

3

Tôi không nghĩ rằng việc tạo ra kế hoạch thực hiện sẽ có giá hơn 1 giây.

Tôi tin rằng sự khác biệt giữa lần chạy đầu tiên và lần thứ hai là do bộ nhớ đệm dữ liệu trong bộ nhớ.

Dữ liệu trong bộ nhớ cache có thể được tái sử dụng bởi bất kỳ truy vấn nào khác (quy trình được lưu trữ hoặc chọn đơn giản).

Bạn có thể 'làm ấm' bộ nhớ cache bằng cách đọc dữ liệu thông qua bất kỳ lựa chọn nào đọc cùng một dữ liệu. Nhưng điều đó thậm chí sẽ tốn khoảng 90 giây.

2

Bạn có thể kiểm tra kế hoạch thực hiện để tìm hiểu bảng nào và lập chỉ mục truy vấn của bạn sử dụng. Sau đó bạn có thể thực hiện một số SQL để lấy dữ liệu vào bộ nhớ cache, tùy thuộc vào những gì bạn thấy.

  • Nếu bạn thấy chỉ mục nhóm được tìm kiếm, bạn chỉ cần thực hiện SELECT * FROM my_big_table để buộc tất cả các trang dữ liệu của bảng vào bộ nhớ cache.
  • Nếu bạn thấy chỉ mục không được nhóm, bạn có thể thử SELECT first_column_in_index FROM my_big_table.

Để bắt buộc chỉ mục cụ thể, bạn cũng có thể sử dụng gợi ý bảng WITH(INDEX(index)) trong truy vấn bộ nhớ cache của bạn.

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