Тайм-аут возникает в браузере при ожидании создания отчета, как заставить его ждать? - PullRequest
0 голосов
/ 27 января 2012

В основном наш клиент наказывал наши отчеты серьезным количеством записей, что привело к ошибке ниже. По сути, запрос недостаточно хорош, и, несмотря на создание отчета, он занимает около 25 минут, в течение которых показанное ниже изображение отображается клиенту из-за истечения времени ожидания. Я пытался оптимизировать запрос, но, честно говоря, он по-прежнему занимает слишком много времени в 10 минут, и я чувствую, что возникнет та же проблема, когда клиент собирается использовать еще большие наборы данных.

Могу ли я в любом случае убедиться, что приведенная ниже ошибка не возникает? Если я создаю отчет с использованием служб отчетов Visual Studio, это может занять 10-15 минут, но, по крайней мере, отчет генерируется, как я могу заставить браузер ждать, пока отчет не будет сгенерирован?

Клиент спешит с этим, чтобы по крайней мере с этим решением они получили то, что ему нужно.

timeout error displayed

Я изменил ее на хранимую процедуру, и все дополнительные внешние объединения должны были заменить вызов функции, который, как я думал, мог быть причиной замедления. Был добавлен дополнительный индекс в надежде ускорить процесс, но пока не повезло.

SQL Profiler показывает поиск по индексу, который занимает чертовски много времени, но я не вижу, как это улучшить.

Это план выполнения исходного запроса, который был выполнен, изменения привели к значительным различиям, которые мы все еще пытаемся выяснить.

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 Ответ

1 голос
/ 27 января 2012

Ожидание отчета никогда не должно занимать так много времени. Возможно ли, что вы делаете что-то неправильно или без надлежащей индексации. Можете ли вы опубликовать свой SQL, который обращается к набору данных?

Другой вариант, который у вас есть, - создать подписку RS, которая экспортирует отчет в формат pdf и создает его в общей папке клиента каждые 30 минут. Таким образом, клиенту даже не нужно ждать отчета - он может ожидать, что отчет будет готов в общей сетевой папке. Вы можете настроить время непосредственно в службах отчетов, чтобы вы могли генерировать этот отчет каждые 10 минут / 20 минут / и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...