2013-05-07 3 views
2

Я являюсь частью одной команды разработчиков, где у меня есть хранимая процедура (SQL Server 2008), которая содержит около 40 запросов вставки. Эти запросы вставляются по меньшей мере в 100-х записей, вставляются в каждую операцию вставки.Многие вставки в хранимой процедуре в SQL Server

Это влияет на производительность приложения, хотя я установил значение NO для нулевого и завернутого кода в Begin и End transaction. Но, по-прежнему производительность не до отметки, как таковая занимает около 2-3 минут, в то время как наши требования к производительности составляет около 10-11 секунд.

Я могу понять, что эти многие вставки нуждаются в сокращении, но изменение структуры базы данных в этот момент довольно дорого.

Есть ли способ, которым мы можем выполнить эти запросы вставки в течение 10-11 секунд?

Иногда я задаюсь вопросом, что на многих сайтах я прочитал, что SQL Server может выполнять aroud 1000-2000qps, а затем почему моя хранимая процедура занимает так много времени.

+0

есть 100 регистрация insert только один таблица .. каждый раз ..? –

+0

Да, но иногда более 100 на каждую вставку –

+0

Не углубляясь в сохраненную структуру proc или таблицы, я чувствую, что это действительно структурировано плохо. 40 вставить запросы, это действительно плохо. Приветствуйте человека, который его создал. Извините, если это вы. –

ответ

0

Если у вас есть индексы на этой таблице, может оказаться дорогостоящим сделать много вставок. Поэтому я начал бы изучать индексы таблиц.

0

Некоторые причины, которые могут замедлить ход событий:

  1. Существование INSERT Триггеры на столе
  2. Много насильственными ограничений, которые должны быть проверены (как правило, внешние ключи)
  3. страницу расколы в кластерный индекс, когда строка вставлена ​​в середину таблицы
  4. Обновление всех связанных некластеризованных индексов
  5. Блокировка от другой деятельности на ta ble

Посмотрите на свою структуру и сообщите нам, что можно изменить, а что нет. Без какого-либо кода мы не можем уменьшить количество вставок, мы можем только сказать вам, что может замедлить работу.

+0

нет триггеров, –

+0

и я не манипулировал индексом anny таблиц, они такие, какие были, когда они были созданы с помощью таблицы. –

+0

Хорошо, это немного более ясно, можете ли вы опубликовать свою хранимую процедуру, чтобы мы могли помочь вам лучше? –

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

Как это может помочь мне улучшить производительность, так как это будет содержать количество запросов на вставку, которые требуются, как есть. –

+0

скажем 1000 записей в вашем XML ... здесь вам нужно разобрать XMl и создать таблицу Temp с помощью tahat 1000 записей вместо создания 1000 запросов на вставку, вам нужно написать только один запрос на вставку для этой таблицы Temp, которая описывается выше. Пример. . Вам не нужно создавать 1000-минутное соединение с sql ... надеюсь, что это поможет вам ... –

Смежные вопросы