Обновить несколько полей в тысячи строк - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть база данных MS SQL Server 2008 R2 с загрузкой 2000 транзакций в секунду. Таблицы:

'lion_Tasks'(uid_obj, order_new, __usn_field_order_new, and more 40 fields) 

и

'lion_Tasks_Changes_Parts'(uid_task_cp, uid_user_cp, __usn_entity_cp and more 20 fields )

Веб-сервер получает 10.000 объектов, в которых только одно поле изменило 'order_new'. Только 3 поля необходимо обновить в базе данных. Эти объекты я передаю в табличный параметр хранимой процедуре:

Я несколько раз пытался переписать эту хранимую процедуру без каких-либо изменений производительности, она все еще отключается 10-20 секунд , текущая версия:

CREATE PROCEDURE dbo.lion_UpdateTasksNewOrder
( @Table TasksNewOrderTableType READONLY) 
WITH RECOMPILE AS
BEGIN

DECLARE @ErrorCode     int
SET @ErrorCode = -1

UPDATE TasksTable
SET     
  order_new = t.ORDER_NEW,   
  __usn_field_order_new = t.USN_ORDER_NEW
FROM dbo.lion_Tasks TasksTable
INNER JOIN @Table t
ON t.UUID_TASK = TasksTable.uid_obj

  IF( @@ERROR != 0 )
  BEGIN
      SET @ErrorCode = -1
      GOTO Cleanup
  END                       

UPDATE TasksTableCP
SET 
  __usn_entity_cp = tcp.USN_ENTITY
FROM dbo.lion_Tasks_Changes_Parts TasksTableCP
INNER JOIN @Table tcp
ON tcp.UUID_TASK = TasksTableCP.uid_task_cp AND tcp.UUID_USER = TasksTableCP.uid_user_cp

  IF( @@ERROR != 0 )
  BEGIN
      SET @ErrorCode = -1
      GOTO Cleanup
  END

  RETURN 0
  Cleanup:
  RETURN @ErrorCode    
END

База данных temp находится на диске SSD. Может, кто подскажет, что делать для ускорения?

Предполагаемый план выполнения: https://www.brentozar.com/pastetheplan/?id=Byq2JzTwm

Настольный скрипт:

USE [lion_data]
GO

/****** Object:  Table [dbo].[lion_Tasks_Changes_Parts]    Script Date: 09/05/2018 11:31:53 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[lion_Tasks_Changes_Parts](
    [uid_obj_cp] [uniqueidentifier] NOT NULL,
    [uid_task_cp] [uniqueidentifier] NOT NULL,
    [uid_user_cp] [uniqueidentifier] NOT NULL,
    [_order_cp] [int] NOT NULL,
    [uid_marker_cp] [uniqueidentifier] NOT NULL,
    [date_begin_cp] [datetime] NULL,
    [date_end_cp] [datetime] NULL,
    [readed_cp] [int] NOT NULL,
    [collapsed_cp] [int] NOT NULL,
    [__usn_entity_cp] [int] NOT NULL,
    [__usn_field_order_cp] [int] NOT NULL,
    [__usn_field_uid_marker_cp] [int] NOT NULL,
    [__usn_field_date_begin_cp] [int] NOT NULL,
    [__usn_field_date_end_cp] [int] NOT NULL,
    [__usn_field_readed_cp] [int] NOT NULL,
    [__usn_field_collapsed_cp] [int] NOT NULL,
    [__usn_field_list_tags_cp] [int] NULL,
    [Contacts] [nvarchar](max) NULL,
    [__usn_field_contacts_cp] [int] NULL,
    [uid_user_marker] [uniqueidentifier] NULL,
    [__usn_field_uid_user_marker] [int] NULL,
    [focus_cp] [int] NULL,
    [__usn_field_focus_cp] [int] NULL,
 CONSTRAINT [PK_lion_Tasks_Changes_Parts] PRIMARY KEY CLUSTERED 
(
    [uid_obj_cp] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

Скрипты для индексов:

USE [lion_data]
GO

/****** Object:  Index [PK_lion_Tasks]    Script Date: 09/05/2018 11:28:44 ******/
ALTER TABLE [dbo].[lion_Tasks] ADD  CONSTRAINT [PK_lion_Tasks] PRIMARY KEY CLUSTERED 
(
    [uid_obj] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO


USE [lion_data]
GO

/****** Object:  Index [IX_lion_Tasks_CP_Uid_Task]    Script Date: 09/05/2018 11:29:17 ******/
CREATE NONCLUSTERED INDEX [IX_lion_Tasks_CP_Uid_Task] ON [dbo].[lion_Tasks_Changes_Parts] 
(
    [uid_task_cp] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO


USE [lion_data]
GO

/****** Object:  Index [IX_lion_Tasks_CP_Uid_User]    Script Date: 09/05/2018 11:29:30 ******/
CREATE NONCLUSTERED INDEX [IX_lion_Tasks_CP_Uid_User] ON [dbo].[lion_Tasks_Changes_Parts] 
(
    [uid_user_cp] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO
...