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
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.
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
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.
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.
Dữ liệu bộ nhớ cache máy chủ SQL được đọc từ đĩa. Đọc liên tiếp sẽ làm ít IO hơn. Đây là trợ giúp lớn vì đĩa IO thường là nút cổ chai.
- 1. Câu hỏi về hiệu suất cho phụ thuộc bộ nhớ cache SQL
- 2. Câu hỏi về bộ nhớ cache PHP vs biên dịch
- 3. SQL Server sys.databases log_reuse_wait câu hỏi
- 4. cấp phát bộ nhớ động câu hỏi
- 5. C++ chỉnh bộ nhớ câu hỏi
- 6. Phỏng vấn câu hỏi: thừa và bộ nhớ đệm
- 7. Câu hỏi về cách tính năng bộ nhớ cache của AppFabric có thể được sử dụng
- 8. Basic C++ nhớ câu hỏi
- 9. SQL server tham gia vs câu hỏi hiệu suất subquery
- 10. Câu hỏi SQL Wildcard
- 11. Visual Studio không nhớ cache bộ nhớ cache của Microsoft Symbol Server?
- 12. Kết quả chức năng lưu trong bộ nhớ cache trong SQL Server 2000
- 13. SQL Server 2008 chiếm nhiều bộ nhớ?
- 14. câu hỏi phân bổ bộ nhớ liên quan đến vector
- 15. Tôi nên sử dụng Redis làm bộ nhớ cache cho SQL Server như thế nào?
- 16. Câu hỏi SQL INNER JOIN
- 17. Câu hỏi thiết kế Sql
- 18. Câu hỏi tối đa SQL
- 19. Bộ nhớ cache, tắt bộ nhớ đệm
- 20. Các câu hỏi về Linux Kiểu thẻ nhớ
- 21. Gỡ bỏ bộ nhớ cache khỏi bộ nhớ cache L1 khi xóa L2
- 22. CakePHP 2.1: Bộ nhớ cache của trình duyệt vs Xem bộ nhớ cache
- 23. Android: Chiến lược bộ nhớ cache hình ảnh và bộ nhớ cache kích thước
- 24. Lệnh xóa bộ nhớ cache NFS?
- 25. Xóa bộ nhớ cache ActiveRecord
- 26. Xóa bộ nhớ cache NSURLConnection
- 27. Buộc xóa bộ nhớ cache
- 28. Symfony2 tắt bộ nhớ cache?
- 29. Mod_pagespeed xoá bộ nhớ cache?
- 30. Bộ nhớ cache dành riêng
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