我是一个开发团队的成员,在那里我有一个存储过程(SQL Server2008),其中包含大约40个插入查询。在每次插入操作中,这些查询插入至少100条记录。
这影响了应用程序的性能,尽管我在Begin
和End transaction
中没有将null和包装代码设置为计数。但是,性能仍然没有达到标准,因此需要大约2-3分钟,而我们的性能要求大约是10-11秒。
我可以理解这些需要减少的插入,但是,在这个时刻改变数据库结构是相当昂贵的。
有没有什么方法可以让我们在10-11秒内执行这些插入查询?
有时我想知道,在许多网站上,我读到SQL Server可以执行大约1000-2000qps,那么为什么我的存储过程花费了这么长的时间。
发布于 2013-05-07 19:32:18
如果您在这个表上有索引,那么执行大量插入操作的成本可能会很高。因此,我将从检查表索引开始。
发布于 2013-05-07 19:37:44
一些可能会让事情变慢的原因:
看看你的结构,告诉我们什么可以改变,什么不可以改变。如果没有任何代码,我们就不能减少插入的数量,我们只能告诉你什么可能会减慢速度。
发布于 2013-05-07 20:25:27
请检查此示例SP
您需要为每一行创建与以下格式相同的XML,并将其提供给SQL。
根据您的要求进行一些修改可能会解决您的问题。
/**************************************************************
EXEC wa_TempInsert '<SampleXML>
<tblRow><Id>3</Id><Code>11</Code><Description>Leptospiral infect NEC</Description></tblRow>
<tblRow><Id>3</Id><Code>22</Code><Description>Leptospiral infect NEC</Description></tblRow>
<tblRow><Id>3</Id><Code>33</Code><Description>Leptospiral infect NEC</Description></tblRow>
<tblRow><Id>3</Id><Code>44</Code><Description>Leptospiral infect NEC</Description></tblRow>
<tblRow><Id>3</Id><Code>55</Code><Description>Leptospiral infect NEC</Description></tblRow>
</SampleXML>'
*/
CREATE PROCEDURE wa_TempInsert
(
@XML NVARCHAR(MAX)
)
AS
SET NOCOUNT ON
BEGIN
DECLARE @Id INT
DECLARE @MyXML XML
SET @MyXML = @XML
IF OBJECT_ID('tempdb..#TempXMLTable') IS NOT NULL
DROP TABLE #TempICD
SELECT * INTO #TempICD
FROM (
SELECT
Parse.value('(Id)[1]', 'INT') AS 'Id',
Parse.value('(Code)[1]', 'Varchar(100)') AS 'Code',
Parse.value('(Description)[1]', 'varchar(1000)') AS 'Description'
FROM
@MyXML.nodes('/SampleXML/tblRow') AS TempData(Parse)
) AS tbl
INSERT INTO Table (Code,[Description],Id)
SELECT DISTINCT Code,[Description],Id FROM #TempXMLTable
END
END
https://stackoverflow.com/questions/16417784
复制相似问题