Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server在ADO.NET与SSMS中的性能_Sql Server_Sql Server 2008_Ado.net - Fatal编程技术网

Sql server SQL Server在ADO.NET与SSMS中的性能

Sql server SQL Server在ADO.NET与SSMS中的性能,sql-server,sql-server-2008,ado.net,Sql Server,Sql Server 2008,Ado.net,在开始之前,我在这里读了几篇关于过去性能问题的文章,这些问题是人们在ADO和SSMS中执行SQL语句/过程时遇到的。我花了一天的大部分时间试图自己解决这个问题……使用sp\u recompile重新编制索引,将选项(recompile)添加到我的过程中。什么都没用,所以我向社区求助 我有一个存储过程,我的一个web应用程序执行该存储过程来运行报告。这个过程特别是由动态SQL组成,允许返回不同的报告结果…在我的网站上有一种动态报告功能。无论如何,可以运行一些报告(使用相同的过程),结果几乎立即返回

在开始之前,我在这里读了几篇关于过去性能问题的文章,这些问题是人们在ADO和SSMS中执行SQL语句/过程时遇到的。我花了一天的大部分时间试图自己解决这个问题……使用
sp\u recompile
重新编制索引,将
选项(recompile)
添加到我的过程中。什么都没用,所以我向社区求助

我有一个存储过程,我的一个web应用程序执行该存储过程来运行报告。这个过程特别是由动态SQL组成,允许返回不同的报告结果…在我的网站上有一种动态报告功能。无论如何,可以运行一些报告(使用相同的过程),结果几乎立即返回。但是,可以使用其他选项,该过程可能需要几分钟才能运行。但是,在SSMS中使用这些相同的选项手动运行该过程会立即产生结果。这听起来像是某种类型的计划缓存问题,但在重新编译过程并使用(重新编译)添加
后,它在ADO.NET中的运行速度仍然非常慢

所以我开始研究SQL概要文件,可能是ADO使用的一个“SET”命令导致了这个问题。然而,在使用相同的精确SET命令后,它仍然会使用SSMS几乎立即返回

我尝试使用
DBCC freeproccache
DBCC 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

你见过这么多的线吗


Showplan XML事件类是否可以按照公认答案中的建议工作?

这是昨晚让我睡不着觉的问题之一,因此我开始重新检查所有内容。我终于意识到,在SSMS中,我的默认行数设置为1000。然而,当我在SQL Profiler中运行一个跟踪时,另一个集并没有出现这种情况,这是一种什么样的错误。将ROWCOUNT设置回0允许我在SSMS中重新生成此值,从而允许我查看执行计划并修复导致查询运行缓慢的问题


最后,这不是ADO问题——这是我在SSMS中设置的一个设置,用于限制我通常希望返回的行数。由于我的查询的一部分构建了一个较大结果集的临时表,该临时表只填充了1000行。

在title
ADO
中,在tags
ADO.NET
中。请更正。我强烈建议您在存储过程中放弃动态SQL,否则执行计划对任务来说总是次优的。与SQL不能很好地计划执行标量函数的方式类似,动态SQL总是令人惊讶,系统将很难优化其执行。我知道这不会是最优的,但是这似乎不是当前问题的原因。提取SQL并执行仍然会重现问题。您是否尝试添加查询提示
选项(针对未知优化)
?@YS.-我只是尝试了一下,但没有任何区别。下面为未来读者提供的相关说明:显然,Microsoft正在SQL Server的未来版本中对此进行一些更改:使用SET ROWCOUNT不会影响SQL Server下一版本中的DELETE、INSERT和UPDATE语句。在新的开发工作中避免将SET ROWCOUNT与DELETE、INSERT和UPDATE语句一起使用,并计划修改当前使用它的应用程序。”