Làm thế nào để bạn xóa tất cả các gói truy vấn cũ từ bên trong Microsoft SQL Server?


12

Chúng tôi có một ứng dụng ngoài kệ sử dụng cơ sở dữ liệu Microsoft SQL. Trong ứng dụng này, chúng tôi chọn và chọn các tiêu chí lựa chọn khác nhau cho mỗi báo cáo. Ứng dụng này sau đó chạy các báo cáo này.

Tôi tin rằng chúng tôi có một vấn đề kế hoạch truy vấn. Báo cáo đầu tiên chúng tôi chạy mỗi ngày, chạy rất nhanh 7 phút. Bất kỳ báo cáo nào chúng tôi chạy sau khi báo cáo đầu tiên mất hơn một giờ.

Mỗi đêm, chúng tôi chạy một tác vụ theo lịch trình dừng và khởi động SQL Server Agent và SQL Server. Có khoảng 25 cơ sở dữ liệu khác trong một phiên bản SQL Server này. Không có cơ sở dữ liệu nào khác có vấn đề về hiệu suất, chỉ có một cơ sở ngoài sản phẩm mà tôi đã đề cập trước đó.

Có cách nào để xóa tất cả các gói truy vấn mà SQL Server hiện có trong bộ nhớ không?

Làm thế nào tôi có thể làm điều này mà không ảnh hưởng đến 30 người dùng dựa trên các cơ sở dữ liệu khác trên cùng một máy chủ?


Câu trả lời:


7

Tôi xin lỗi cho câu trả lời trước của tôi.

1) Thêm tùy chọn VỚI RECOMPILE vào câu lệnh CREATE PROCEDURE nếu bạn biết rằng truy vấn của bạn sẽ thay đổi mỗi khi nó được chạy từ thủ tục được lưu trữ. Tùy chọn VỚI RECOMPILE ngăn chặn việc sử dụng lại kế hoạch thực hiện thủ tục được lưu trữ, vì vậy SQL Server không lưu trữ kế hoạch cho quy trình này và quy trình được biên dịch lại trong thời gian chạy. Sử dụng tùy chọn VỚI RECOMPILE có thể tăng hiệu suất nếu truy vấn của bạn sẽ thay đổi mỗi lần chạy từ quy trình được lưu trữ vì trong trường hợp này, kế hoạch thực hiện sai sẽ không được sử dụng.

2) Bạn phải tạo một hướng dẫn kế hoạch sử dụng gợi ý truy vấn USE PLAN cho mọi loại truy vấn (mọi loại yêu cầu thủ tục được lưu trữ) để buộc kế hoạch thực hiện.

Đây là bài viết về kế hoạch thực hiện có thể giúp đỡ.


Tôi đồng ý sử dụng VỚI RECOMPILE, tôi đã thực hiện điều này với các hệ thống tôi đã xây dựng. Tuy nhiên, tôi không có quyền truy cập vào nguồn sql ... nó chạy từ trong một ứng dụng.
Michael Riley - AKA Gunny

@Cape Cod Gunny trong trường hợp này hãy thử DBCC FLUSHPROCINDB: Được sử dụng để xóa bộ đệm thủ tục được lưu trữ cho cơ sở dữ liệu cụ thể trên Máy chủ SQL, không phải toàn bộ Máy chủ SQL. Bạn có thể muốn sử dụng lệnh này trước khi thử nghiệm để đảm bảo rằng các gói thủ tục được lưu trữ trước đó sẽ không ảnh hưởng tiêu cực đến kết quả thử nghiệm. Ví dụ: DECLARE @intDBID INTEGER SET @intDBID = (CHỌN dbid TỪ master.dbo.sysdatabase WHERE name = 'database_name') DBCC FLUSHPROCINDB (@intDBID)
garik

Vấn đề này đã được giải quyết. Hóa ra, một bảng tạm thời được sử dụng để lưu trữ các tiêu chí tìm kiếm đã được tích lũy liên tục dữ liệu. Quá trình này được cho là cắt bớt dữ liệu từ bảng này trước khi thu thập dữ liệu. Cảm ơn cho đoạn trích sql tốt đẹp.
Michael Riley - AKA Gunny

13

Bạn đã hỏi hai câu hỏi ở đây. Trước tiên, bạn muốn biết liệu bạn có thể xóa tất cả các gói được lưu trữ trong bộ nhớ cho một phiên bản của SQL hay không. Điều đó được thực hiện với DBCC FREEPROCCACHE như Matt M đề xuất.

Câu hỏi thứ hai bạn hỏi là "Làm thế nào tôi có thể làm điều này mà không ảnh hưởng đến 30 người dùng dựa trên các cơ sở dữ liệu khác trên cùng một máy chủ?". Câu trả lời ngắn gọn là "bạn không thể". Nếu bạn loại bỏ tất cả các gói hơn những người dùng khác đang dựa vào các gói trong bộ nhớ sẽ có khả năng bị ảnh hưởng.

Cách giải quyết cho việc này đòi hỏi một số can thiệp thủ công. Bạn có thể sử dụng DBCC FREEPROCCACHE để xóa các gói cụ thể cung cấp cho bạn có plan_handle.

Từ những gì bạn đang mô tả ở trên có vẻ như là một vấn đề kế hoạch, nhưng tôi không chắc chắn rằng loại bỏ kế hoạch là câu trả lời. Tôi sẽ chỉ cho bạn theo hướng đánh hơi thông số trước khi nghĩ về việc loại bỏ các kế hoạch:

http://bloss.msdn.com/b/conor_castyham_msft/archive/2010/08/11/conor-vs-mvdehaving-parameterized-queries-optizes-for-hints.aspx

Bạn sẽ có thể tối ưu hóa các truy vấn thay vì đánh lừa với DBCC FREEPROCCACHE trên cơ sở theo lịch trình. Tôi cũng khuyên bạn nên dành thời gian phân tích các sự kiện chờ đợi cho ví dụ của bạn.


DBCC FREEPROCCACHE đã không giải quyết vấn đề. Tôi làm đơn vị hoạt động và các sự kiện. Có 0 I / O vật lý. Nó dường như được treo trên ứng dụng này: Nhà cung cấp dữ liệu khách hàng .Net Sql. Loại chờ là CXPACKET.
Michael Riley - AKA Gunny

CXPACKET ngụ ý truy vấn của bạn đang đi song song. Bạn có thể xác định có bao nhiêu luồng đang chạy cho truy vấn và kiểm tra sự chờ đợi của chúng không? Bạn có thể muốn sử dụng công cụ miễn phí WhoIsActive Adam Machanic của sqlblog.com/files/folders/release/entry29675.aspx .
SQLRockstar

7

DBCC FREEPROCCACHE

Sử dụng lệnh này, bạn có thể xóa toàn bộ bộ đệm thủ tục xuống một lệnh duy nhất. Chắc chắn đọc tài liệu trước khi sử dụng lệnh này. Đọc phần Nhận xét một vài lần.

Xóa bộ đệm thủ tục sẽ khiến bộ đệm thủ tục được lưu trữ được biên dịch lại khi sử dụng tiếp theo. Điều này có thể ảnh hưởng đến hiệu suất. Sử dụng cẩn thận!

Matt


Tôi đã thử sử dụng DBCC FREEPROCCACHE và nó không giải quyết được vấn đề. Tôi cố gắng giết chết quá trình sau 1 giờ.
Michael Riley - AKA Gunny
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.