2015-01-22 2 views
0

У меня есть две таблицы (PreOrder, PreOrderDetails), где я хочу удалить записи. Таблицы имеют классическое отношение, в котором внешний ключ таблицы сведений относится к первичному ключу в таблице предзаказов. PreOrder имеет ~ 16 миллионов записей и деталей ~ 60 миллионов.удаление записей из таблиц с ограничением

CREATE TABLE [dbo].[PreOrder](
    [PreOrderId] [uniqueidentifier] NOT NULL, 
    -- more columns 
CONSTRAINT [PK_PreOrder] PRIMARY KEY NONCLUSTERED 
(
    [PreOrderId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) ON [PRIMARY] 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

GO 

ALTER TABLE [dbo].[PreOrder] WITH CHECK ADD CONSTRAINT [FK_PreOrder_PreOrder] FOREIGN KEY([PreOrderId]) 
REFERENCES [dbo].[PreOrder] ([PreOrderId]) 
GO 

ALTER TABLE [dbo].[PreOrder] CHECK CONSTRAINT [FK_PreOrder_PreOrder] 


CREATE TABLE [dbo].[PreOrderDetail](
    [PreOrderDetailId] [uniqueidentifier] NOT NULL, 
    [PreOrderId] [uniqueidentifier] NOT NULL, 
    more columns 
CONSTRAINT [PK_PreOrderDetail] PRIMARY KEY CLUSTERED 
(
    [PreOrderDetailId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) ON [PRIMARY] 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

GO 

ALTER TABLE [dbo].[PreOrderDetail] WITH CHECK ADD CONSTRAINT [FK_PreOrderDetail_PreOrder] FOREIGN KEY([PreOrderId]) 
REFERENCES [dbo].[PreOrder] ([PreOrderId]) 
GO 

ALTER TABLE [dbo].[PreOrderDetail] CHECK CONSTRAINT [FK_PreOrderDetail_PreOrder] 
GO 

удаление 5 записей с предварительного заказа занимает 90 секунд, что происходит слишком медленно. Я предполагаю, что это из-за ограничения, когда каждый раз, когда один предварительный заказ должен быть удален, он проверяется на полную таблицу preorderdetails. Правильно ли это предположение?

Что делать, чтобы сделать это быстрее? Прямо сейчас записи вставляются быстрее, чем их можно удалить.

+0

На основании приведенного выше сценария DELETE против PreOrder завершится с ошибкой, если будут какие-либо строки PreOrderDetail. Как выполняется удаление? Каскадный RI, триггер? –

+0

1) внешний ключ 'FK_PreOrder_PreOrder' на' PreOrder' не имеет смысла. он ссылается на себя. 2) У вас должен быть указатель на 'PreOrderDetail' для столбца' PreOrderId'. У тебя есть это? –

ответ

0

Да нет индекса на [PreOrderDetail]. [PreOrderId] будет приятным для вставок.
Но это не будет хорошо для выбора и удаления на основе столбца.
Вам нужен индекс на [PreOrderDetail]. [PreOrderId]

И использование uniqueidentifier для ПК или индекса неэффективно, они быстро фрагментируются.

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