Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Проблема при удалении записи с большим количеством связей  [new]
sp
Member

Откуда:
Сообщений: 3947
Возникла проблема: имеем таблицу Persons и Users
В таблице Persons есть поле UserID -ссылка на пользователя создавшего запись (к слову сказать - все объекты в базе имеют ссылку на запись в таблице Users)

Проблема возникает при удалении записи из таблицы Users - около 5мин происходит удаление это при налиции 43млн записей в таблице Persons

Что мне делать - разрывать связи?
19 дек 09, 14:18    [8090290]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при удалении записи с большим количеством связей  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
О боже. Нахрена вам удалять пользователя?
Если он ничего не "сделал" (белое удаление мёртвого груза), это одноразово - терпите. Только удаляйте сразу усех "духов" одной командой. Но всё равно непонятно - чё, они так мешают?
19 дек 09, 15:47    [8090447]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при удалении записи с большим количеством связей  [new]
sp
Member

Откуда:
Сообщений: 3947
Mnior
О боже. Нахрена вам удалять пользователя?
Если он ничего не "сделал" (белое удаление мёртвого груза), это одноразово - терпите. Только удаляйте сразу усех "духов" одной командой. Но всё равно непонятно - чё, они так мешают?


ну типа создаются тренировочные юзеры, а потом типа надо удалить мусор - странно что похоже технология такая не сильно умная что похоже скуль делает попытки и проверки с каждой записью вместо того чтобы глянуть есть ли чеки или триггера и сделать это все быстро и одним махом!!!
19 дек 09, 17:41    [8090675]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при удалении записи с большим количеством связей  [new]
Glory
Member

Откуда:
Сообщений: 104760
sp
Mnior
О боже. Нахрена вам удалять пользователя?
Если он ничего не "сделал" (белое удаление мёртвого груза), это одноразово - терпите. Только удаляйте сразу усех "духов" одной командой. Но всё равно непонятно - чё, они так мешают?


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

А что вы сделали для возможности такой проверки одним махом ?
Построили индекс или заставляете проверять всю таблицу сканом ?
19 дек 09, 18:31    [8090740]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при удалении записи с большим количеством связей  [new]
sp
Member

Откуда:
Сообщений: 3947
Glory
А что вы сделали для возможности такой проверки одним махом ?
Построили индекс или заставляете проверять всю таблицу сканом ?


Я бы посмотрел если нет констраинтов и триггеров то сделал бы селект проверку на наличие связи и если нету - удалил бы все одним махом
20 дек 09, 02:07    [8091796]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при удалении записи с большим количеством связей  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
sp
Я бы посмотрел если нет констраинтов и триггеров то сделал бы селект проверку на наличие связи и если нету - удалил бы все одним махом
И по вшему он так не делает?
Целых 5 минут сканируется вся таблица Persons на наличие в ней удалённых юзверей - чтоб сделать указанное действие или ругнутся (согласно описанного в FK). И в чём вопрос то? Что вас не устраивает? Действие то нештатное - одноразовое.
20 дек 09, 03:47    [8091860]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при удалении записи с большим количеством связей  [new]
kkv
Member

Откуда: Москва
Сообщений: 18677
sp
Возникла проблема: имеем таблицу Persons и Users
В таблице Persons есть поле UserID -ссылка на пользователя создавшего запись (к слову сказать - все объекты в базе имеют ссылку на запись в таблице Users)

Проблема возникает при удалении записи из таблицы Users - около 5мин происходит удаление это при налиции 43млн записей в таблице Persons

Что мне делать - разрывать связи?

Можно построить индекс по полю UserID.
20 дек 09, 04:13    [8091868]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при удалении записи с большим количеством связей  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
kkv
Можно построить индекс по полю UserID.
Будте внимательны:
sp
ну типа создаются тренировочные юзеры, а потом типа надо удалить мусор


Удалить за 40 минут, или построить индекс за 40 минут, удалить мусор и затем индекс за ненадобностью. Смысл?
20 дек 09, 23:24    [8093308]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при удалении записи с большим количеством связей  [new]
iljy
Member

Откуда:
Сообщений: 8711
Mnior
Удалить за 40 минут, или построить индекс за 40 минут, удалить мусор и затем индекс за ненадобностью. Смысл?

Не преувеличивайте
+ тестовый скрипт

create table testT
(
	id int identity primary key,
	someID bigint not null,
	someText char(200) not null
)

insert into testT (someID, someText)
select cast(cast(NEWID() as binary(8)) as bigint),
	REPLICATE('Object ', 20) + CAST(N as varchar)
from
(
select top 50000000 ROW_NUMBER() over(order by (select 1)) N
from master..spt_values t1, master..spt_values t2, master..spt_values t3
)t
create index IS_SomeId on testT
(someID)

Машинка тестовая, без жуткой мощи, 4 винта конечно, но и только, памяти всего 2Г. Так вот, на ней этот индекс создался за 2 минуты.
Надо посмотреть на план удаления, но думаю даже однократная операция с индексом будет не сильно медленнее. А уж если его еще и оставить, хотя бы пока весь мусор не вычистится, - думаю плюсы будут налицо. Не знаю чего там в таблице, но думаю не 2 поля, так что перерасход места небольшой.
21 дек 09, 00:20    [8093388]     Ответить | Цитировать Сообщить модератору
 Re: Проблема при удалении записи с большим количеством связей  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
iljy,
Вы как всегда непоследовательны, и пришли как обычно, похвастаться или поязвить.
Но спорить с вами запрещено, ибо всегда на аргументы вы начинаете лить воду не по теме.

Вы абсолютно не знаете, что в реальности происходит у человека, начинаете приводить тесты синтетических запросов в вакууме. Хотя задача и выедено яйца не стоит. Даже создавать топик было бессмыслено, а вы тут холивар разводите.

Вот на вашем примере. Удаление 8 сек, индекс 9. Сопоставимо.

+
create table testT (
	id smallint identity (0,1) primary key,
	someText varchar(200) not null
)
GO
create table testF (
	 id int identity primary key
	,someID smallint not null --REFERENCES testT (id)
	,someText varchar(200) not null
)
GO
insert	testT (someText)
select REPLICATE('Object ', 20) + CAST(N as varchar)
from (
	select top 32768 ROW_NUMBER() over(order by (select 1)) N
	from master..spt_values t1, master..spt_values t2
) t
GO
insert testF (someID, someText)
select	X.x, 'xxx'
from (
	select top 50000000 NULL N
	from master..spt_values t1, master..spt_values t2, master..spt_values t3
)F CROSS APPLY (SELECT cast(cast(NEWID() as binary(2)) as int)/2 X) X
GO
ALTER table testF ADD CONSTRAINT IF_SomeId FOREIGN KEY (SomeId) REFERENCES testT (id) ON DELETE CASCADE
GO
--BEGIN TRAN XXX

DELETE	testT
WHERE	id < 20

--ROLLBACK
GO
-- create index IS_SomeId on testF (someID)
-- drop index IS_SomeId on testF
21 дек 09, 14:10    [8095601]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить