在开始之前,我在这里阅读了几篇关于过去性能问题的帖子,人们在 ADO 和 SSMS 中执行 SQL 语句/过程。我花了一天的大部分时间试图自己解决这个问题......重新索引,使用sp_recompile
,添加Option(Recompile)
到我的程序中。没有任何效果,所以我正在向社区寻求帮助。
我有一个存储过程,我的一个 Web 应用程序执行该存储过程来运行报告。特别是这个过程主要由动态 SQL 组成,以允许返回不同的报告结果......我网站上的一种动态报告功能。无论如何,一些报告可以运行(使用相同的程序)并且结果几乎立即返回。但是,可以使用其他选项,并且该过程可能需要几分钟才能运行。但是,使用 SSMS 中的相同选项手动运行该过程会立即产生结果。这听起来像是某种类型的计划缓存问题,但在重新编译程序并添加之后WITH(RECOMPILE)
,它在 ADO.NET 中的运行速度仍然非常慢。
所以我开始查看 SQL 配置文件,也许 ADO 正在使用的“SET”命令之一导致了这个问题。但是,在使用完全相同的 SET 命令后,它仍然几乎可以立即使用 SSMS 返回。
我尝试使用DBCC freeproccache
andDBCC freesystemcache
清除任何存储的计划,但这也无济于事。
我尝试的另一件事是获取在过程中生成的动态 SQL 并直接在 SqlCommand 语句中运行它。这里没有参数,只是简单的 SQL。它再次在 SSMS 中立即运行,但在 ADO.NET 中需要永远。
有没有办法(运行 ADO.NET)来查看生成的计划?我可以在 SSMS 中执行此操作,但这对我没有帮助,因为它在 SSMS 中运行良好。
如果有任何帮助,这里是原始 SQL 语句......
SELECT sf.ID [FileID], sb.ID [BillID], sb.Client_BillID, sf.BobID [ClientID], c.Name [ClientName], c.Parent_ID [ParentID], pnt.Name [ParentName], Network_ID, Facility_Name, OON, sb.TaxID, Inpatient, sf.ProcessDate, sb.Reversed, sb.State, sb.Product, sb.FormType, n.Direct
INTO #t1 FROM SubmitterFiles sf WITH(NOLOCK)
INNER JOIN SubmitterBills sb WITH (NOLOCK) ON sf.ID = sb.FileID
LEFT JOIN PPORecords r WITH (NOLOCK) ON sb.RecordID = r.ID
LEFT JOIN PPONetworks n WITH (NOLOCK) ON r.Network_ID = n.ID
LEFT JOIN PPOProviders p WITH (NOLOCK) ON r.Provider_ID = p.ID
INNER JOIN Clients c WITH (NOLOCK) ON sf.BobID = c.ID
LEFT JOIN Clients pnt WITH (NOLOCK) ON c.Parent_ID = pnt.ID
WHERE sf.ProcessDate BETWEEN 'Dec 1 2012 12:00AM' and 'Dec 31 2012 12:00AM'
AND ISNULL(sb.Status,'') NOT IN ('E','V')
AND (c.Parent_ID IN (1989) or c.ID IN (1989))
;
SELECT TOP 100 0 as [placeholder],NULL AS BillID, NULL AS Client_BillID, NULL AS DOS
,NULL AS Network_ID
,NULL AS Client_ID
,NULL AS Client_Name
,NULL As ProcessDate
,NULL As ProcessMonth
,NULL AS SubClientID
,NULL AS SubClientName
,Product
,TaxID
, FacilityName
, LastName
, FirstName
,State
,County
,NULL As ProcCode
,NULL As FormType
,NULL As Inpatient, NULL AS Outpatient
,COUNT(DISTINCT sb.BillID) AS [Total_Bills]
,SUM(sl.Amount) AS [Total_Charges]
,SUM(sl.StateSavings) AS [Total_StateSavings]
,SUM(sl.PPOSavings) AS [Total_PPOSavings]
,COUNT(DISTINCT TaxID) AS [Total_Unique_TaxIds]
,0,0,0,0,0
,COUNT(DISTINCT CASE WHEN sb.OON = 1 THEN sb.BillID ELSE NULL END) AS [Out_Bills]
,SUM(CASE WHEN sb.OON = 1 THEN sl.Amount ELSE 0 END) AS [Out_Charges]
,SUM(CASE WHEN sb.OON = 1 THEN sl.StateSavings ELSE 0 END) AS [Out_StateSavings]
,COUNT(DISTINCT CASE WHEN sb.OON = 1 THEN sb.TaxID ELSE NULL END) AS [Out_Unique_TaxIds]
,0,0,0,0,0
,0,0,0,0,0
FROM SubmitterLines sl WITH (NOLOCK, INDEX(IX_SubmitterLines_BillID))
INNER JOIN #t1 sb WITH(NOLOCK) ON sl.BillID = sb.BillID
INNER JOIN SubmitterBillProviders sbp WITH(NOLOCK) ON sb.BillID = sbp.ID
INNER JOIN SubmitterBillZipCounty sbc WITH(NOLOCK) ON sb.BillID = sbc.ID
WHERE 1 = 1
GROUP BY Product
,TaxID
,FacilityName, LastName, FirstName
,State
,County
ORDER BY [Out_Bills] DESC