首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL Server中存储过程中的大量插入

SQL Server中存储过程中的大量插入
EN

Stack Overflow用户
提问于 2013-05-07 19:24:19
回答 3查看 480关注 0票数 2

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

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

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

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

有时我想知道,在许多网站上,我读到SQL Server可以执行大约1000-2000qps,那么为什么我的存储过程花费了这么长的时间。

EN

回答 3

Stack Overflow用户

发布于 2013-05-07 19:32:18

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

票数 0
EN

Stack Overflow用户

发布于 2013-05-07 19:37:44

一些可能会让事情变慢的原因:

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

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

票数 0
EN

Stack Overflow用户

发布于 2013-05-07 20:25:27

请检查此示例SP

您需要为每一行创建与以下格式相同的XML,并将其提供给SQL。

根据您的要求进行一些修改可能会解决您的问题。

代码语言:javascript
运行
复制
/**************************************************************

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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16417784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档