sql хранимой процедуры Exection Timeout Expired. - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть несколько хранимых процедур на нашем сервере SQL Server 2008, которые выполняются одна за другой, им грозит ошибка SQL (истекло время ожидания выполнения. Период ожидания истек до завершения операции или сервер не отвечает) напоследний, который обновляет или вставляет таблицу с 1 миллионами записей, в то время как он работает с небольшими файлами, но при обновлении или вставке этого количества записей он останавливается и выдает эту ошибку. Как я могу настроить хранимую процедуру, я попытался очистить сервер с помощью sp_updatestatesно не повезло, я был бы признателен за любую помощь, спасибо, вот мой код хранимой процедуры:

    USE [DBTest]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


ALTER PROCEDURE [dbo].[SP_UpdateData]

    @ItemsExt dbo.TT_ItemsExt READONLY
AS
BEGIN

    SET NOCOUNT ON;


    Declare 
        @ItemID nvarchar(36)
    ,@DescE nvarchar(50)
    ,etc 
    ,etc
    --------------------------------------- 

    DECLARE Item_cursor CURSOR FOR 
    SELECT 
        ItemID
    ,DescE
    ,etc
    ,etc
    FROM @ItemsExt

    OPEN Item_cursor
    FETCH NEXT FROM Item_cursor INTO
        @ItemID
    ,@DescE
    ,etc
    ,etc

    WHILE @@FETCH_STATUS = 0
    BEGIN


        If exists (select * from Items WHERE ItemID = @ItemID)
        Begin 

            Update dbo.Items SET
            DescEng = @DescE
            ,etc = @etc
            WHERE ItemID = @ItemID
        End
        ElSE
        Begin

            Declare @ItemNumber nvarChar(36)
            SET @ItemNumber = REPLACE((REPLACE(RIGHT(@ItemID, LEN(@ItemID) - 1))

            insert into dbo.Items 
             (ItemID    ,  etc)

            VALUES (@ItemID, etc)
        End

        --ItemsReplacment Table
        If exists (select * from dbo.ItemsReplacement WHERE ItemID = @ItemID)
        Begin 

            Update dbo.ItemsReplacement SET

            ItemAlter= @AlternativeItem
            ,etc
            WHERE ItemID = @ItemID
        End
        ElSE
        Begin

            Insert Into dbo.ItemsReplacement Values (
            @ItemID
            ,etc
            ,etc)
        End

        FETCH NEXT FROM Item_cursor INTO
        @ItemID
        ,@DescE
        ,etc
        ,etc
    END 
    CLOSE Item_cursor;
    DEALLOCATE Item_cursor;

END

ps: тайм-аут выполнения равен 0, что означает бесконечность.

1 Ответ

0 голосов
/ 20 ноября 2018

Вот лучший подход к этим обновлениям и вставкам:

ALTER PROCEDURE [dbo].[SP_UpdateData]

@ItemsExt dbo.TT_ItemsExt READONLY
AS
BEGIN

UPDATE IT
  SET
    DescEng = ITE.DescE,
    etc = ITE.etc
  FROM 
    dbo.Items IT
    INNER JOIN ItemsExt ITE ON (IT.ItemID = ITE.ItemID);

INSERT INTO 
    dbo.Items
  (
    ItemID,
    etc
  ) 
  SELECT
      ITE.ItemID, 
      ITE.etc
    FROM 
      dbo.ItemsExt ITE;
    WHERE
      NOT EXISTS (SELECT 1 FROM dbo.Items WHERE ItemID = ITE.ItemID);

UPDATE ITR
  SET
    ItemAlt = 0, --AlternativeItem?
    etc = ITE.etc
  FROM  
    dbo.ItemsReplacement ITR
    INNER JOIN ItemsExt ITE ON (ITR.ItemID = ITE.ItemID);

INSERT INTO 
    dbo.ItemsReplacement
  (
    ItemID,
    etc
  )
  SELECT
      ITE.ItemID, 
      ITE.etc
    FROM 
      dbo.ItemsExt ITE;
    WHERE
      NOT EXISTS (SELECT 1 FROM dbo.ItemsReplacement WHERE ItemID = ITE.ItemID);  

END

Таким образом вы избегаете ненужных циклов курсора и позволяете базе данных творить чудеса при планировании выполнения.

ИКстати: не должно ли быть каких-либо «ограничений» на эти обновления и вставки?Планируете ли вы запустить все эти таблицы для всех исполнений?

!!В исходном коде вы использовали @AlternativeItem, который я нигде не смог найти.Использовал 0 в моем ответе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...