2013-05-07 40 views
2

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

这会影响应用程序的性能,但我已将NO计数设置为空并在BeginEnd transaction中包装代码。但是,仍然表现尚未达到标准,因此它需要大约2-3分钟,而我们的性能要求是在10-11秒左右。

我可以理解这些需要减少的插入,但是,此时更改数据库结构相当昂贵。

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

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

+0

是100条记录只在一张桌子上插入..每次..? – 2013-05-07 12:14:11

+0

是的,但有时每个插入超过100个 – 2013-05-07 12:20:49

+0

没有深入的存储过程或表结构,我觉得这是非常严重的结构。 40插入查询,它真的很糟糕。向创造它的人致敬。对不起,如果是你。 – 2013-05-07 12:50:19

回答

0

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

0

,可以减缓下来一些原因:

  1. 表的INSERT触发器
  2. 很多有进行检查(通常为外键)在聚集
  3. 页面拆分强制约束的存在性当一行插入中间的索引 的表
  4. 更新所有相关的非聚簇索引
  5. 阻止其他活动对ta ble

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

+0

没有触发, – 2013-05-07 11:48:49

+0

我没有操纵表ANNY指数, 他们是因为它是当他们与表中创建。 – 2013-05-07 11:49:29

+0

好的,这有点更清楚了,你可以发布你的存储过程,所以我们可以帮助你更好吗? – 2013-05-07 14:46:44

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 
+0

这能如何帮助我提高性能,因为这样可以保持原样插入查询的数量。 – 2013-05-08 03:39:02

+0

让的说1000记录在你的XML ......在这里,你需要解析XML和创建临时表与1000条系统能够正常记录,而不是创建1000插入查询你需要写一个只为临时表,该表是描述例以上插入查询.. 。你不需要创建1000次与sql连接...希望这件事帮助你... – 2013-05-08 08:59:00

相关问题