Copy Trigger значительно замедляет работу базы данных - PullRequest
0 голосов
/ 15 июля 2009

Наша оригинальная база данных назвала имена первых, средних, последних для имен людей. Теперь мы создали поля с именами имя, отчество и фамилия. Пока мы проходим этот переход, я создал триггер для копирования данных с первого на имя, от среднего до среднего и от последнего к фамилии в любое время, когда предыдущие поля получают обновление или вставку. Проблема заключается в том, что когда мы пакетно загружаем файлы в нашу базу данных, все замедляется и может вызывать тайм-аут других событий.

Ниже мой код:

USE [Database]
GO
/****** Object:  Trigger [dbo].[CopyFirstName]    Script Date: 07/15/2009 08:35:37 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER [dbo].[CopyFirstName]

   ON  [dbo].[Patients]
   AFTER  INSERT,UPDATE
AS 
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

     IF UPDATE([First]) BEGIN
        SET NOCOUNT ON;
declare @ChangedField nvarchar(50);

  select @ChangedField = [First] from inserted 
  update dbo.Patients set FirstName  = @ChangedField where [First]  = @ChangedField


END
end

Можно ли это улучшить или сделать другим способом?

Ответы [ 2 ]

5 голосов
/ 15 июля 2009

Некоторые мысли:

  • Если у вас есть один триггер для первого, среднего и последнего, то, я думаю, у вас есть 3 триггера, 3 сканирования «вставленной» таблицы и 3 обновления

  • Ваш текущий код не поддерживает многострочные обновления или вставки

  • Используя "...where [First] = @ChangedField", вы, возможно, будете обновлять несколько строк. Допустим, вы ввели «Джон» или «Ганс». Хотя Джон или Ганс верны, вы все равно обновляете каждую строку с Джоном или Гансом И игнорируя другие вставленные строки (см. Предыдущий пункт)

Параметры:

  • Объединить в один триггер
  • Обновлять только измененные строки
  • Добавить фильтр для старых / новых различий в столбцах
  • Сокращение работы (например, объединение одного оператора для всех столбцов)

Пример того, что вы могли бы сделать:

ALTER TRIGGER [dbo].[CopyNames]
   ON  [dbo].[Patients]
   AFTER  INSERT,UPDATE
AS 
BEGIN
SET NOCOUNT ON;

IF NOT EXISTS (SELECT * FROM INSERTED)
    RETURN;

IF UPDATE(First) OR UPDATE(Middle) OR UPDATE (Last)
  update
      P
  set
      FirstName  = INS.First,
      Middlename  = INS.Middle,
      LastName  = INS.Last
  FROM
      dbo.Patients P
      JOIN
      INSERTED INS ON P.KeyColumn = INS.KeyColumn
/* optional, try it and see
  WHERE
      P.FirstName <> INS.First OR
      P.Middlename <> INS.Middle OR
      P.LastName <> INS.Last
*/


END
0 голосов
/ 15 июля 2009

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

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