![](/img/trans.png)
[英]SQL Server Stored Procedure for Fruit Checks with several joins - timing out
[英]Stored procedure timing out on particular connection pool
我有一個存儲過程,從我們的網站(通過網站連接池)調用時偶爾會超時。 一旦超時,它總是被鎖定到超時,直到使用管理Studio會話中的drop / create或sp_recompile重新編譯過程。
雖然超時,但使用Management Studio對同一過程使用相同的參數沒有超時。
通過Management Studio執行“更改過程”並且(相當徹底地)更改過程的內部執行並沒有清除超時 - 直到運行完整的sp_recompile才會清除。
存儲過程以OPTION (RECOMPILE)
結束
該過程調用兩個函數,這些函數在產品的其余部分中無處不在地使用。 使用這些功能的其他程序(以類似的方式)都可以工作,即使在有關程序超時的期間也是如此。
如果任何人可以提供任何關於可能導致這一時間的進一步建議,將不勝感激。
存儲過程如下:
ALTER PROCEDURE [dbo].[sp_g_VentureDealsCountSizeByYear] (
@DateFrom AS DATETIME = NULL
,@DateTo AS DATETIME = NULL
,@ProductRegion AS INT = NULL
,@PortFirmID AS INT = NULL
,@InvFirmID AS INT = NULL
,@SpecFndID AS INT = NULL
) AS BEGIN
-- Returns the stats used for Market Overview
DECLARE @IDs AS IDLIST
INSERT INTO @IDs
SELECT IDs
FROM dbo.fn_VentureDealIDs(@DateFrom,@DateTo,@ProductRegion,@PortFirmID,@InvFirmID,@SpecFndID)
CREATE TABLE #DealSizes (VentureID INT, DealYear INT, DealQuarter INT, DealSize_USD DECIMAL(18,2))
INSERT INTO #DealSizes
SELECT vDSQ.VentureID, vDSQ.DealYear, vDSQ.DealQuarter, vDSQ.DealSize_USD
FROM dbo.fn_VentureDealsSizeAndQuarter(@IDs) vDSQ
SELECT
yrs.Years Heading
,COUNT(vDSQ.VentureID) AS Num_Deals
,SUM(vDSQ.DealSize_USD) AS DealSize_USD
FROM tblYears yrs
LEFT OUTER JOIN #DealSizes vDSQ ON vDSQ.DealYear = yrs.Years
WHERE (
((@DateFrom IS NULL) AND (yrs.Years >= (SELECT MIN(DealYear) FROM #DealSizes))) -- If no minimum year has been passed through, take all years from the first year found to the present.
OR
((@DateFrom IS NOT NULL) AND (yrs.Years >= DATEPART(YEAR,@DateFrom))) -- If a minimum year has been passed through, take all years from that specified to the present.
) AND (
((@DateTo IS NULL) AND (yrs.Years <= (SELECT MAX(DealYear) FROM #DealSizes))) -- If no maximum year has been passed through, take all years up to the last year found.
OR
((@DateTo IS NOT NULL) AND (yrs.Years <= DATEPART(YEAR,@DateTo))) -- If a maximum year has been passed through, take all years up to that year.
)
GROUP BY yrs.Years
ORDER BY Heading DESC
OPTION (RECOMPILE)
END
如果你想在每次執行時重新編譯SP,你應該用重新編譯聲明它; 您的語法重新編譯最后一個選擇:
ALTER PROCEDURE [dbo].[sp_g_VentureDealsCountSizeByYear] (
@DateFrom AS DATETIME = NULL
,@DateTo AS DATETIME = NULL
,@ProductRegion AS INT = NULL
,@PortFirmID AS INT = NULL
,@InvFirmID AS INT = NULL
,@SpecFndID AS INT = NULL
) WITH RECOMPILE
我不知道你的程序的哪個部分會導致問題。 您可以嘗試注釋掉select部分以查看是否從表函數創建臨時表會產生性能問題; 如果沒有,那么查詢本身就是一個問題。 您可以按如下方式重寫過濾器:
WHERE (@DateFrom IS NULL OR yrs.Years >= DATEPART(YEAR,@DateFrom))
AND (@DateTo IS NULL OR yrs.Years <= DATEPART(YEAR,@DateTo))
或者,或許更好,聲明startYear和endYear變量,相應地設置它們並改變這樣的地方:
declare @startYear int
set @startYear = isnull (year(@DateFrom), (SELECT MIN(DealYear) FROM #DealSizes))
declare @endYear int
set @endYear = isnull (year(@DateTo), (SELECT MAX(DealYear) FROM #DealSizes))
...
where yrs.Year between @startYear and @endYear
如果WITH RECOMPILE沒有解決問題,並且刪除最后一個查詢也沒有幫助,那么您需要檢查用於收集數據的表函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.