2011-03-22 76 views
0

我們在virt服務器上使用4Gb的Win 2k3虛擬服務器上安裝了SQL和SSRS 2k5。 (運行的virt服務器該服務器具有> 32GB)關於SQL/SSRS 2k5的報告花費> 10分鐘,查詢<3分鐘

當我們運行比較報告,它調用數據庫A.一個存儲過程的PROC從多個表中提取數據,並從數據庫B視圖

如果我運行探查和監控來電,我看到活動

SQL:BatchStarting SELECT DATABASEPROPERTYEX(DB_NAME(), '整理'), COLLATIONPROPERTY(CONVERT(CHAR, DATABASEPROPERTYEX(DB_NAME() '校對')),'LCID')

然後等待幾分鐘直到proc的實際調用出現。

RPC:完成EXEC sp_executesql的 N'exec [procGetLicenseSales_ALS_Voucher] @CurrentLicenseYear, @CurrentStartDate,@CurrentEndDate, '' 釣魚許可 '', @PreviousLicenseYear, @ OpenLicenseAccounts',N'@ CurrentStartDate 日期時間,@ CurrentEndDate 日期時間,@ CurrentLicenseYear INT,@ PreviousLicenseYear INT,@ OpenLicenseAccounts 爲nvarchar(4000)」,@ CurrentStartDate = '2010-11-01 00:00:00:000',@ CurrentEndDate = 「2010-11- 30 00:00:00:000,@ CurrentLicenseYear = 2010,@ PreviousLicenseYear = 2009,@ OpenLicenseAccounts = NULL

然後更多的時間,而且通常報告超時。如果我讓它在設計器中運行,大約需要20分鐘。

本報告雖然很慢但仍不到10分鐘,但幾個月後仍在運行。

如果將查詢(從探查器捕獲)放入SQL Server Management Studio中,則需要2分鐘8秒的時間才能運行。

數據庫B只是有一些變化和數據複製到它(我們只從數據中讀取,所有新數據來自夜間複製)。

東西已經明顯改變了,但是什麼改變打破了報告?我如何測試以找出SSRS部分爲何永久存在且超時,但查詢在大約2分鐘內運行?

添加:請注意,存儲過程返回18行...任何時間。 (我們只有18個產品需要跟蹤。) 報告採用這18行,並將它們分組並進行一些總結。沒有矩陣,只有一個頁面,非常簡單。

+0

1.你知道,如果你正在運行一個報告(在VS中)在本地機器上具有相同的參數,它會將數據緩存在一個.DATA後綴的文件中? 2.你有沒有檢查RSExecutionLog,看看事情真的需要多長時間?這提供了查詢和渲染時間的細節,甚至有一些免費的報告和一個dtsx包,您可以下載以堅持/查看此數據 – 2011-03-23 10:48:36

回答

0

可能是參數嗅探。如果您更改了某些數據或某些表,那麼滿足舊數據模型sp的高速緩存計劃可能無效。

回答這裏非常類似的事: stored procedure performance issue

報價:

F你是確保SQL是完全一樣的,而且PARAMS是相同的,那麼你可以遇到一個參數嗅探問題。

這是一個非常罕見的問題。我只有一次遇到過這種情況,從那以後,我一直在編寫這個問題。

從這裏開始對這個問題的簡要概述:

http://blogs.msdn.com/b/queryoptteam/archive/2006/03/31/565991.aspx

http://elegantcode.com/2008/05/17/sql-parameter-sniffing-and-what-to-do-about-it/

嘗試宣告SP內部的一些局部變量和分配參數的瓦萊斯給他們。使用局部變量代替params。

這是一個功能不是一個錯誤,但它讓你去@「$ @

3

中號肯揚II

數據庫B剛剛複製到它的一些變化和數據(我們只讀取,所有新的數據來自夜間複製)的數據。

確保所有指標倖存的修改數據庫B.如果它們仍然存在,檢查它們是如何形成碎片是和reorganize or rebuild如有必要。

索引可能會對性能產生巨大影響。

只要報告花費的時間遠遠超過您的查詢,可能有很多原因。一些技巧讓SSRS的運行速度可以在這裏找到:

http://www.sqlservercentral.com/Forums/Topic859015-150-1.aspx

編輯: 這裏是從上面的鏈接的相關信息。

AshMc

我記得前一段時間,我們有我們在那裏傳入的參數範圍內SSRS的SQL數據集同樣的問題,它會減慢了這一切相比,在SSMS做(分鐘相比,像你的問題秒)。看來當SSRS傳入參數時,它可能重新計算值並且不存儲一次,就是這樣。

我所做的是在數據集中首先聲明一個新的TSQL參數,並將其設置爲等於SSRS參數,然後像使用SSMS那樣使用新參數。

如:

DECLARE @X as int 
SET @X = @SSRSParameter 

janavarr

感謝AshMc,這個工作對我來說。然而,我現在的問題是,它只能使用單個參數,如果我想傳遞多個參數值,查詢將不會運行。

...

AshMc

我能找到我如何做這個之前。我創建了一個Temp表,其中放置了我們想要過濾的值,然後在主查詢上進行了內聯接。我們僅使用SSRS參數作爲過濾器放置臨時表的內容。

這節省了很多的報告,運行時間做這種方式

DECLARE @ParameterList TABLE (ValueA Varchar(20)) 

INSERT INTO @ParameterList 
select ValueA 
from TableA 
where ValueA = @ValueB 


INNER JOIN @ParameterList 
ON ValueC = ValueA 

希望這有助於

--Dubs

+0

+1,SET @X = @SSRSParameter技巧爲我工作! – Arnoldiusss 2011-08-22 14:21:40