2

我是一个开发团队的一员,我有一个包含大约 40 个插入查询的存储过程 (SQL Server 2008)。这些查询在每次插入操作中插入至少 100 条记录。

这会影响应用程序的性能,尽管我已将 NO count 设置为 null 并将代码包装在Beginand中End transaction。但是,性能仍然没有达到标准,因此大约需要 2-3 分钟,而我们的性能要求大约是 10-11 秒。

我可以理解需要减少这么多插入,但是此时更改数据库结构的成本非常高。

有什么方法可以在 10-11 秒内执行这些插入查询?

有时我想知道,在我读过的许多站点中,SQL Server 可以执行大约 1000-2000qps,那么为什么我的存储过程需要这么长时间。

4

3 回答 3

0

请检查此示例 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
于 2013-05-07T12:25:26.553 回答
0

如果您在此表上有索引,则执行大量插入操作的成本可能很高。因此,我将从检查表索引开始。

于 2013-05-07T11:32:17.590 回答
0

一些可能会减慢速度的原因:

  1. 表上存在 INSERT TRIGGER
  2. 许多必须检查的强制约束(通常是外键)
  3. 当在表中间插入一行时,聚集索引中的页面拆分
  4. 更新所有相关的非聚集索引
  5. 阻止桌子上的其他活动

看看你的结构,告诉我们什么可以改变,什么不能改变。没有任何代码,我们无法减少插入的数量,我们只能告诉你什么可能会减慢速度。

于 2013-05-07T11:37:43.687 回答