2013-05-07 66 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

相關問題