2012-01-27 45 views
0

基本上我們的客戶已經懲罰與這導致下面的錯誤記錄的一個嚴重的量我們的報道。基本上查詢不夠好,儘管生成了報告,但大約需要25分鐘,在此期間,由於超時,下圖顯示給客戶端。我一直在嘗試優化查詢,但坦率地說它仍然採取了太久的10分鐘,我覺得作爲客戶正在使用左右甚至更大的數據集都會出現同樣的問題。等待報表生成時,瀏覽器中發生超時,如何強制等待?

反正我可以確保不發生下面的錯誤?如果我使用Visual Studio報告服務生成報告,則可能需要10-15分鐘,但至少會生成報告,如何強制瀏覽器等待報告生成?

的客戶端將在這個匆忙與此解決方案,以便至少他們將獲得他們所需要的東西。

timeout error displayed

我已經改成了一個存儲過程,所有的額外外連接替換函數調用,我認爲可能已經放緩的原因。爲了加快速度,希望增加一個額外的索引,但目前還沒有運氣。

SQL事件探查器顯示索引查找,這需要很多時間地獄,但我看不出如何改善這一點。

這對於已運行的原始查詢執行計劃,變化已經導致顯著差異,我們還在試圖找出。

http://dl.dropbox.com/u/21484692/showplan.SQLPlan

這裏是SQL:

USE [Apollo_Interface_Staging] 
GO 
/****** Object: StoredProcedure [dbo].[spRptGMPP_UploadResults] Script Date: 01/27/2012 11:09:13 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[spRptGMPP_UploadResults] 
-- Add the parameters for the stored procedure here 
@StartDate DATETIME, 
@EndDate DATETIME, 
@UploadStatus VARCHAR(15) 

AS 
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

DECLARE @TrueEndDate DATETIME 
SELECT @TrueEndDate = (select DATEADD(ms,-3,DATEADD(dd, DATEDIFF(dd,0,@EndDate), 1))) 

SELECT 
VIN1 
,TR_DATE 
,CASE WHEN REC_STAT = 'A' THEN 'Add' WHEN REC_STAT = 'D' THEN 'Delete' WHEN REC_STAT = 'C' THEN 'Change' ELSE REC_STAT END as REC_STAT 
, FRAN_CDE 
, WARR_ODD 
, WARR_MTH 
, cast(rds_fee as money)/100 * CASE WHEN REC_STAT = 'D' THEN -1 ELSE 1 END as Fee 
,PROV 

,ROUND((gst.Percentage)/100 * cast(rds_fee as money)/100 * CASE WHEN REC_STAT = 'D' THEN -1 ELSE 1 END,2) as GST 
,CASE WHEN prov NOT IN ('ON','BC') THEN 
    ROUND((hst.Percentage)/100 * cast(rds_fee as money)/100 *CASE WHEN REC_STAT = 'D' THEN -1 ELSE 1 END,2) 
    ELSE 0 
    END as HST 
,CASE WHEN prov = 'ON' THEN 
    ROUND((hst.Percentage)/100 * cast(rds_fee as money)/100 *CASE WHEN REC_STAT = 'D' THEN -1 ELSE 1 END,2) 
    ELSE 0 
    END as HST_ON 
,CASE WHEN prov = 'BC' THEN 
    ROUND((hst.Percentage)/100 * cast(rds_fee as money)/100 *CASE WHEN REC_STAT = 'D' THEN -1 ELSE 1 END,2) 
    ELSE 0 
    END as HST_BC 
,ROUND((hst.Percentage)/100 * cast(rds_fee as money)/100 *CASE WHEN REC_STAT = 'D' THEN -1 ELSE 1 END,2) as HST 
,ROUND((1 + (gst.Percentage)/100) 
        * (qst.Percentage)/100 * cast(rds_fee as money)/100, 2) *CASE WHEN REC_STAT = 'D' THEN -1 ELSE 1 END as QST 
,_UploadStatus as UploadStatus 
,CAST(YEAR(_UploadDate) as varchar)+ '/' + RIGHT('0' + cast(MONTH(_UploadDate)as varchar) ,2)+ '/' + RIGHT('0' + DAY(_UploadDate),2) as UploadDate 
,_UploadDescription as UploadDescription 
,'' as VehicleMake--,Apollo.dbo.GetGMManufacturerFromVIN(VIN1) AS VehicleMake 
,'' as VehicleYear--,Apollo.dbo.GetVehYear(VIN1) AS VehicleYear 
,ID 
,ISNULL(mem.MembershipID,'') as MembershipID 
,ISNULL(mem.MembershipTermID,'') as MembershipTermID 
,ISNULL(p.Name,'') as [Plan] 
,CASE mem.ActionTaken 
    WHEN 0 THEN 'None' 
    WHEN 1 THEN 'Upgraded' 
    WHEN 2 THEN 'Reverse Upgrade' 
    WHEN 3 THEN 'Created' 
    WHEN 4 THEN 'Cancelled' 
    WHEN 5 THEN 'Status Changed' 
    WHEN 6 THEN 'Static Update' 
    ELSE '' 
END as Action 
,ISNULL((SELECT SUM(mtd.Amount) FROM Apollo.dbo.MemberTransactionDetail mtd WITH(NOLOCK) WHERE mtd.MemberTransactionID = mem.TransactionID),0) as TransactionAmount 
,ISNULL((select SUM(pe.InitialValue) from apollo_drm..[transaction] trx WITH(NOLOCK) inner join apollo_drm..paymentelement pe WITH(NOLOCK) ON pe.transactionid = trx.transactionid where trx.externalref = mem.TransactionID AND trx.ExternalRef > 0),0) as DRMTransactionAmount 
,gm.STAMP as DateTimeStamp 
FROM 
Apollo_Interface_Staging.dbo.gmpp_archive gm WITH(NOLOCK) 
LEFT OUTER JOIN Apollo_Interface_Staging.dbo.GMPP_Effected_Memberships mem WITH(NOLOCK) ON mem.GMPP_ImportID = gm.ID 
LEFT OUTER JOIN Apollo..MembershipTerm mt WITH(NOLOCK) ON mt.MembershipTermID = mem.MembershipTermID 
LEFT OUTER JOIN Apollo..[PlanVersion] pv WITH(NOLOCK) ON pv.PlanVersionID = mt.PlanVersionID 
LEFT OUTER JOIN Apollo..[Plan] p WITH(NOLOCK) ON p.PlanID = pv.PlanID 

LEFT OUTER JOIN APollo..PRovinceOrSTateTax gst WITH(NOLOCK) ON gst.PRovinceOrStateTaxID = (
    SELECT TOP 1 tmp.PRovinceOrStateTaxID 
    FROM Apollo.dbo.ProvinceOrStateTax tmp 
    WHERE tmp.TaxTypeProgKey = 'GST' 
       AND tmp.ProvinceOrStateProgKey = prov 
       AND tmp.StartDate <= GETDATE() 
    ORDER BY 
      tmp.StartDate DESC 
)        
LEFT OUTER JOIN APollo..PRovinceOrSTateTax hst WITH(NOLOCK) ON hst.PRovinceOrStateTaxID = (
    SELECT TOP 1 tmp.PRovinceOrStateTaxID 
    FROM Apollo.dbo.ProvinceOrStateTax tmp 
    WHERE tmp.TaxTypeProgKey = 'HST' 
       AND tmp.ProvinceOrStateProgKey = prov 
       AND tmp.StartDate <= GETDATE() 
    ORDER BY 
      tmp.StartDate DESC 
)                        
LEFT OUTER JOIN APollo..PRovinceOrSTateTax qst WITH(NOLOCK) ON qst.PRovinceOrStateTaxID = (
    SELECT TOP 1 tmp.PRovinceOrStateTaxID 
    FROM Apollo.dbo.ProvinceOrStateTax tmp 
    WHERE tmp.TaxTypeProgKey = 'QST' 
       AND tmp.ProvinceOrStateProgKey = prov 
       AND tmp.StartDate <= GETDATE() 
    ORDER BY 
      tmp.StartDate DESC 
)  

WHERE 
STAMP BETWEEN @StartDate AND @TrueEndDate 
AND 
(
    @UploadStatus = 'ALL' 
     OR 
    _UploadStatus = @UploadStatus 
) 
END 

在試圖解決的方面,我嘗試過的參數嗅探路線,直接把日期,存儲過程,而不是讓用戶選擇他們,它在3分鐘左右就切斷了,但這對我們來說顯然不是一個真正的解決方案,即使如此,它仍然非常緩慢。

回答

1

等待報告不應該長期吃這個藥。 是否有可能你做了不正確的事情或沒有正確的索引。 你可以發佈你的訪問數據集的SQL嗎?

您擁有的另一個選項是創建一個RS訂閱,將報表導出爲pdf格式,並將其每隔30分鐘導出到客戶端共享目錄。這樣客戶端甚至不必等待報告 - 他們可以期望報告在網絡共享文件夾中準備就緒。您可以直接在報告服務中調整時間,以便您可以每隔10分鐘/ 20分鐘等等生成此報告。

+0

已添加SQL等以獲取更多信息。我想從這裏運行的出口報告是一個選項,我也曾考慮過,但認爲這可能是解決瀏覽器超時問題的一種方法。這不可能嗎? – shicky 2012-01-27 16:18:31

+0

@shicky我們可能能夠修復一些很多代碼的sql。你可以發佈一些執行計劃嗎?我認爲成本是由於BETWEEN和OR條件造成的。 – JonH 2012-01-27 17:50:30

+0

爲原始查詢的執行計劃設置鏈接。試圖走下參數嗅探的路線,但沒有多少運氣。在我不使用參數的情況下切換到存儲過程的變化徹底改變了有趣的執行計劃。你認爲這種情況有什麼不對?我不確定會有什麼替代方案? 當您運行該查詢需要多長時間時,現在調查報告服務之外的SSRS中的分組是否可能是問題 – shicky 2012-01-27 18:42:05