c#客户端调用sql server 存储过程速度慢的问题

1 : c#代码是

 

 

                        SqlConnection connNew = null;

                        connNew = new SqlConnection(@"Data Source="XXX");
                        connNew.Open();

                        SqlCommand commNew = connNew.CreateCommand();
                        commNew.CommandText = "sp_catcher_MeraRptCAV_Insert_detail";
                        commNew.CommandType = System.Data.CommandType.StoredProcedure;
                        commNew.CommandTimeout = 300;

                        commNew.Parameters.Add(new SqlParameter()
                        {
                            ParameterName = "@TVP",
                            SqlDbType = SqlDbType.Structured,
                            Value = GetDataTableParamNew(CANewReport)
                        });

                        //File.AppendAllText(strCurrentPath + @"\test.txt", "Now about to insert report " + reportID + " records into db " + "\r\n");
                        try
                        {
                            commNew.CommandTimeout = 300;
                            commNew.ExecuteNonQuery();

                        }

                        catch (Exception ex)
                        {

                            //Logger.Error("Execute Procedure ‘sp_merarpt_create‘ Failed, Error Message : ‘" + ex.Message + "‘.");
                        }
                        finally
                        {
                            commNew.Dispose();
                            if (commNew != null)
                            {
                                connNew.Close();
                                connNew.Dispose();
                            }
                        }

 

2 : 被调用的存储过程 , 原来的代码是 :

USE [Smartbilling_AI]
GO
/****** Object:  StoredProcedure [dbo].[sp_catcher_MeraRptCAV_Insert_detail]    Script Date: 10/29/2014 09:28:39 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_catcher_MeraRptCAV_Insert_detail]
(
	@TVP dbo.MeraRpt_CAV_AI READONLY
)
AS
BEGIN
declare @reportid as int

	SET NOCOUNT ON;

        INSERT INTO MeraRpt_Detail_ByPrefix
        (
		[reportID]
		,[Customer]
		,[Prefix]
		,[Route]
		,[ASRSuccessCalls]
		,[ACDSuccessCalls]
		,[TotalCalls]
		,[TotalMins]
		,[ASR]
		,[ACD]
		,[Fee]
		,[Cost]
		,[Profit]
	)
	SELECT [reportID]
		,[Customer]
		,[Area]
		,[Vendor]
		
		,[ASRsuccessCalls]
		,[ACDsuccessCalls]
		,[totalCalls]
		,[totalMins]
		
		,[ASR]
		,[ACD]
		,[Fee]
		,[Cost]
		,[profix]
		
	FROM @TVP tvp


	select @reportid = max(reportid) from merarpt

	

	--refresh area report
	--exec MeraRpt_Refresh_Area 
	--exec MeraRpt_Refresh_cr

	--Update Report By Prefix
	
	BEGIN TRY
		exec [sp_i_Refresh_Cust_Prefix] @reportid
	END TRY
	BEGIN CATCH
		insert capturelog 
		(content) values (‘[sp_i_Refresh_Cust_Prefix] Warning Code:‘ + cast (@@error as nvarchar) + ‘ Warning Lines: ‘ + Cast (ERROR_LINE() as nvarchar) + ‘ Warning Msg: ‘+ERROR_MESSAGE())
	END CATCH
	

	--Update Report By Prefix Hourly
	BEGIN TRY
		exec [sp_i_Refresh_Cust_Prefix_hour] @reportid
	END TRY
	BEGIN CATCH
		insert capturelog 
		(content) values (‘[sp_i_Refresh_Cust_Prefix_hour] Warning Code:‘ + cast (@@error as nvarchar) + ‘ Warning Lines: ‘ + Cast (ERROR_LINE() as nvarchar) + ‘ Warning Msg: ‘+ERROR_MESSAGE())
	END CATCH

	----Update Report By Area
	BEGIN TRY
		exec [sp_i_Refresh_Cust_Area] @reportid
	END TRY
	BEGIN CATCH
		insert capturelog 
		(content) values (‘[sp_i_Refresh_Cust_Area] Warning Code:‘ + cast (@@error as nvarchar) + ‘ Warning Lines: ‘ + Cast (ERROR_LINE() as nvarchar) + ‘ Warning Msg: ‘+ERROR_MESSAGE())
	END CATCH

	----Update Report By Area Hourly
	BEGIN TRY
		exec [sp_i_Refresh_Cust_Area_Hour] @reportid
	END TRY
	BEGIN CATCH
		insert capturelog 
		(content) values (‘[sp_i_Refresh_Cust_Area_Hour] Warning Code:‘ + cast (@@error as nvarchar) + ‘ Warning Lines: ‘ + Cast (ERROR_LINE() as nvarchar) + ‘ Warning Msg: ‘+ERROR_MESSAGE())
	END CATCH

	----Update Report By Area Route
	BEGIN TRY
		exec [sp_i_Refresh_Cust_Area_Route] @reportid
	END TRY
	BEGIN CATCH
		insert capturelog 
		(content) values (‘[sp_i_Refresh_Cust_Area_Route] Warning Code:‘ + cast (@@error as nvarchar) + ‘ Warning Lines: ‘ + Cast (ERROR_LINE() as nvarchar) + ‘ Warning Msg: ‘+ERROR_MESSAGE())
	END CATCH


    --以下是 vendor 部分 

	BEGIN TRY
		exec [sp_i_Refresh_Vendor_Prefix] @reportid 
	END TRY
	BEGIN CATCH
		insert capturelog 
		(content) values (‘[sp_i_Refresh_Vendor_Prefix] Warning Code:‘ + cast (@@error as nvarchar) + ‘ Warning Lines: ‘ + Cast (ERROR_LINE() as nvarchar) + ‘ Warning Msg: ‘+ERROR_MESSAGE())
	END CATCH


	BEGIN TRY
		exec [sp_i_Refresh_Vendor_Prefix_hour] @reportid
	END TRY
	BEGIN CATCH
		insert capturelog 
		(content) values (‘[sp_i_Refresh_Vendor_Prefix_hour] Warning Code:‘ + cast (@@error as nvarchar) + ‘ Warning Lines: ‘ + Cast (ERROR_LINE() as nvarchar) + ‘ Warning Msg: ‘+ERROR_MESSAGE())
	END CATCH


	BEGIN TRY
		exec [sp_i_Refresh_Vendor_Area] @reportid   
	END TRY
	BEGIN CATCH
		insert capturelog 
		(content) values (‘[sp_i_Refresh_Vendor_Area] Warning Code:‘ + cast (@@error as nvarchar) + ‘ Warning Lines: ‘ + Cast (ERROR_LINE() as nvarchar) + ‘ Warning Msg: ‘+ERROR_MESSAGE())
	END CATCH

	BEGIN TRY
		exec [sp_i_Refresh_Vendor_Area_hour] @reportid
	END TRY
	BEGIN CATCH
		insert capturelog 
		(content) values (‘[sp_i_Refresh_Vendor_Area_hour] Warning Code:‘ + cast (@@error as nvarchar) + ‘ Warning Lines: ‘ + Cast (ERROR_LINE() as nvarchar) + ‘ Warning Msg: ‘+ERROR_MESSAGE())
	END CATCH
	
	
	BEGIN TRY
		exec [sp_i_Refresh_Vendor_Area_Route] @reportid
	END TRY
	BEGIN CATCH
		insert capturelog 
		(content) values (‘[sp_i_Refresh_Vendor_Area_Route] Warning Code:‘ + cast (@@error as nvarchar) + ‘ Warning Lines: ‘ + Cast (ERROR_LINE() as nvarchar) + ‘ Warning Msg: ‘+ERROR_MESSAGE())
	END CATCH
	
    
	update merarpt set FinishProcessedTime = getdate() where reportid = @reportid
END

 注意里面有若干处 调用其它存储过程 , just like

 

	BEGIN TRY
		exec [sp_i_Refresh_Vendor_Prefix] @reportid 
	END TRY
	BEGIN CATCH
		insert capturelog 
		(content) values (‘[sp_i_Refresh_Vendor_Prefix] Warning Code:‘ + cast (@@error as nvarchar) + ‘ Warning Lines: ‘ + Cast (ERROR_LINE() as nvarchar) + ‘ Warning Msg: ‘+ERROR_MESSAGE())
	END CATCH

 

3 : 然后c#程序运行的很慢,但奇怪的是, 如果在sql server management studio 里单独运行这个存储过程, 速度又很快 ,

 

4 : 找不到问题的原因 , 后来是把 所有在存储过程被调用的存储过程的代码都取出来, 直接写在 主存储过程里, 而不再间接调用, 这样问题得到了解决,但是,其中原因何在, 还不清楚, 暂时记在这里。

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。