请参阅下面的示例存储过程代码,它不是完整的代码库,因为它很大。
我正在将几个 xml 数据片段从我的 C# 应用程序传递到存储过程,并且传递它们需要很长时间。
在存储过程中,我从每个 xml 参数中提取数据并将该数据插入到多个表中,然后加入许多物理表并将结果存储到临时表中。最后从最终临时表返回数据。
我的问题是为什么将多个巨大的 xml 数据片段传递给存储过程需要很长时间。
如何诊断这个问题以知道哪个需要很长时间以及在哪里滞后?我需要诊断是 C# 需要很长时间来调用我的存储过程,还是该过程需要很长时间?
告诉我将多个巨大的 XML 数据片段传递给存储过程的最佳方法。我正在从后台工作人员do_work
事件中调用我的存储过程 - 这是长时间运行的原因吗?
谢谢
CREATE PROCEDURE [dbo].[USP_InsertDataFromXML]
(@Ticker VARCHAR(50),
@PCName VARCHAR(50),
@LiconfigXML XML,
@10QKXML XML,
@CustomFormula XML,
@Comments XML,
@ToggleData XML,
@BrokerHistoryOptionXML XML,
@BrokerGridXML XML,
@PrevEarningXML XML,
@BrokerBogey NVARCHAR(MAX),
@PeriodListXML XML,
@existHist VARCHAR(10),
@existHistFY VARCHAR(10),
@lblEarning VARCHAR(10))
AS
BEGIN
SET @t1 = GETDATE();
DELETE FROM [tblTenQKBogey] WHERE PCName = @PCName
IF (@10QKXML IS NOT NULL)
BEGIN
INSERT INTO [tblTenQKBogey] (Section, LineItem, XFundCode, PCName)
SELECT
TenQK.detail.value('(Section/text())[1]','VARCHAR(MAX)') AS Section,
TenQK.detail.value('(LineItem/text())[1]','VARCHAR(MAX)') AS LineItem,
TenQK.detail.value('(xFundCode/text())[1]','VARCHAR(MAX)') AS xFundCode,
@PCName AS PCName
FROM
@10QKXML.nodes('/Bogeylist/BrokerData') AS TenQK(detail)
END
SET @t2 = GETDATE();
SELECT @timetaken = CAST(DATEDIFF(millisecond, @t1, @t2) AS VARCHAR(20))
SELECT @DataCount = COUNT(*) FROM [tblTenQKBogey]
INSERT INTO tblQcLog (Action, Info, TimeTaken, PCName, TableDataCount, Ticker)
VALUES ('INSERT INTO [tblTenQKBogey] table',
'dumping data from xml',
@timetaken, @PCName, @DataCount, @Ticker)
END
END