2015-10-14 58 views
2

我正試圖調整一些查詢的性能。通常情況下,我會在查詢執行之間執行下面的語句,以確保我開始新鮮,與正在高速緩存中沒有數據頁:如何清除SQL Server RDS實例上的SQL Server數據緩存?

DBCC DROPCLEANBUFFERS 

不幸的是,RDS不給我們任何人訪問的「系統管理員「的角色,所以我不能執行該語句。我收到以下錯誤信息:

User 'myuser' does not have permission to run DBCC DROPCLEANBUFFERS. 

有另一種方式,迫使我的查詢運行,就好像它們正在運行的第一次,而無需使用任何緩存的數據?

編輯:我應該清楚,我沒有使用存儲過程,我只是在SSMS中執行臨時查詢來測試解決問題的方法。我不認爲這與重新編譯存儲過程有關。

回答

0

當程序第一次編譯或重新編譯時,該過程的查詢計劃針對數據庫及其對象的當前狀態進行了優化。如果數據庫對其數據或結構進行重大更改,則重新編譯過程更新並優化過程針對這些更改的查詢計劃。這可以提高過程的處理性能。

有時需要強制執行程序重新編譯,有時候會自動執行程序重新編譯。每當SQL Server重新啓動時都會發生自動重新編譯。如果該過程引用的基礎表經歷了物理設計更改,也會發生這種情況。

強制重新編譯過程的另一個原因是爲了抵消過程編譯的「參數嗅探」行爲。當SQL Server執行過程時,過程在編譯時使用的任何參數值都包含在生成查詢計劃的一部分中。如果這些值代表隨後調用該過程的典型值,那麼每次編譯和執行時,該過程都會從查詢計劃中受益。如果該過程上的參數值經常是非典型的,則強制重新編譯該過程,並根據不同的參數值創建新計劃可以提高性能。

SQL Server具有語句級重新編譯過程的功能。當SQL Server重新編譯存儲過程時,只編譯導致重新編譯的語句,而不是完整的過程。

如果某個過程中的某些查詢經常使用非典型值或臨時值,那麼可以通過在這些查詢中使用RECOMPILE查詢提示來改善過程性能。由於只有使用查詢提示的查詢將被重新編譯而不是完整的過程,因此SQL Server的語句級重新編譯行爲將被模仿。但是,除了使用過程的當前參數值之外,編譯語句時,RECOMPILE查詢提示還會使用存儲過程內部任何局部變量的值。

CREATE PROCEDURE dbo.uspProcedure @Param1 varchar(30) 
WITH RECOMPILE 
AS 
    SET NOCOUNT ON; 
    SELECT 1 

Doc 您還可以使用select語句只使用

CREATE PROCEDURE dbo.uspProcedure @Param1 varchar(30) 
    AS 
     SET NOCOUNT ON; 
     SELECT 1 FROM tblName OPTION (RECOMPILE); 
+0

我不使用存儲過程。我相當確信我的問題是SQL Server緩存數據,而不是我的代碼。 – KOTJMF

+0

@KOTJMF沒問題,你可以使用'SELECT'語句,我在我的回答中提到 – wiretext

+0

謙虛請求** downvoter **請留下評論,以便我可以改進我的答案或瞭解最新錯誤 – wiretext