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

Откуда: Київ
Сообщений: 10428
пример похож на вставку, но надо дулаить все записи в одной таблице, которые не во второй

if NOT(object_id('tempdb..#a')  IS NULL)	drop table #a
if NOT(object_id('tempdb..#b')  IS NULL)	drop table #b
create table #a(id int)
create table #b(id int)
insert into #a(id)
select 1 union select 2 union select 3 union select 4

insert into #b(id)
select 1 union select 1 union select 3 union select 5 union select 5

delete from #a where id not in (select id from #b) --<---------здесь

select * from #a
select * from #b
1 сен 09, 13:47    [7603040]     Ответить | Цитировать Сообщить модератору
 Re: как оптимально удалить записи?  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
натыкавшись с not in в одно время, пришел к выводу, что лучше сразу серверу сказать left join, чем он возможно догадается. в связи с чем вопрос возник?

для спящего время бодрствования равносильно сну
1 сен 09, 13:51    [7603074]     Ответить | Цитировать Сообщить модератору
 Re: как оптимально удалить записи?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Winnipuh
пример похож на вставку, но надо дулаить все записи в одной таблице, которые не во второй
Практически никакой разницы - что вставлять, что удалять!
SQL 2008
SET NOCOUNT ON;
USE tempdb;
IF OBJECT_ID(N'T',N'U') IS NOT NULL DROP TABLE T;
IF OBJECT_ID(N'S',N'U') IS NOT NULL DROP TABLE S;
CREATE TABLE T(F INT);
CREATE TABLE S(F INT);
INSERT T(F) VALUES(1),(2),(3);
INSERT S(F) VALUES(1),(3),(4),(5);
SELECT * FROM T;
SELECT * FROM S;
MERGE T USING S ON T.F=S.F WHEN NOT MATCHED BY SOURCE THEN DELETE;
SELECT * FROM T;
SELECT * FROM S;
IF OBJECT_ID(N'T',N'U') IS NOT NULL DROP TABLE T;
IF OBJECT_ID(N'S',N'U') IS NOT NULL DROP TABLE S;
1 сен 09, 14:02    [7603181]     Ответить | Цитировать Сообщить модератору
 Re: как оптимально удалить записи?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Алексей2003
натыкавшись с not in в одно время, пришел к выводу, что лучше сразу серверу сказать left join, чем он возможно догадается. в связи с чем вопрос возник?

для спящего время бодрствования равносильно сну


оптимизирую процедуру... и надо удалять записи , которых нет во второй таблице,
количество может быть сотни тысяч...
1 сен 09, 14:03    [7603193]     Ответить | Цитировать Сообщить модератору
 Re: как оптимально удалить записи?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
iap
Winnipuh
пример похож на вставку, но надо дулаить все записи в одной таблице, которые не во второй
Практически никакой разницы - что вставлять, что удалять!
SQL 2008
SET NOCOUNT ON;
USE tempdb;
IF OBJECT_ID(N'T',N'U') IS NOT NULL DROP TABLE T;
IF OBJECT_ID(N'S',N'U') IS NOT NULL DROP TABLE S;
CREATE TABLE T(F INT);
CREATE TABLE S(F INT);
INSERT T(F) VALUES(1),(2),(3);
INSERT S(F) VALUES(1),(3),(4),(5);
SELECT * FROM T;
SELECT * FROM S;
MERGE T USING S ON T.F=S.F WHEN NOT MATCHED BY SOURCE THEN DELETE;
SELECT * FROM T;
SELECT * FROM S;
IF OBJECT_ID(N'T',N'U') IS NOT NULL DROP TABLE T;
IF OBJECT_ID(N'S',N'U') IS NOT NULL DROP TABLE S;


это 100%
что водка, что пулемёт, лишь бы с ног валило
1 сен 09, 14:04    [7603201]     Ответить | Цитировать Сообщить модератору
 Re: как оптимально удалить записи?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
такое не понимает ;-)

INSERT T(F) VALUES(1),(2),(3);
1 сен 09, 14:09    [7603246]     Ответить | Цитировать Сообщить модератору
 Re: как оптимально удалить записи?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Winnipuh,

значит, сервер <10.0
Предупреждать надо!
1 сен 09, 14:13    [7603276]     Ответить | Цитировать Сообщить модератору
 Re: как оптимально удалить записи?  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
Winnipuh
Алексей2003
натыкавшись с not in в одно время, пришел к выводу, что лучше сразу серверу сказать left join, чем он возможно догадается. в связи с чем вопрос возник?

для спящего время бодрствования равносильно сну


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

сотни тысяч записей для анализа - очень мало.
главное чтобы был индекс. хотябы на момент операции.
если удаление сотни тысяч записей, то все упрется в железо.
1 сен 09, 14:16    [7603310]     Ответить | Цитировать Сообщить модератору
 Re: как оптимально удалить записи?  [new]
Нектотам
Guest
Winnipuh,

С некоторого количества записей TRUNCATE TABLE (или drop/create) + INSERT часто быстрее чем DELETE.
1 сен 09, 14:18    [7603322]     Ответить | Цитировать Сообщить модератору
 Re: как оптимально удалить записи?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Нектотам
Winnipuh,

С некоторого количества записей TRUNCATE TABLE (или drop/create) + INSERT часто быстрее чем DELETE.


ясно, может быть 10 записей, а может быть и 100000...
1 сен 09, 14:25    [7603381]     Ответить | Цитировать Сообщить модератору
 Re: как оптимально удалить записи?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Нектотам
Winnipuh,

С некоторого количества записей TRUNCATE TABLE (или drop/create) + INSERT часто быстрее чем DELETE.
Пример покажите, пожалуйста

Кроме всего прочего, кто будет транкейтить, инсертить и т.д.? Простой пользователь?
Это нормально, что он будет дропать и создавать объект? Откуда у него возьмутся такие права?
1 сен 09, 14:27    [7603392]     Ответить | Цитировать Сообщить модератору
 Re: как оптимально удалить записи?  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
Winnipuh
Нектотам
Winnipuh,

С некоторого количества записей TRUNCATE TABLE (или drop/create) + INSERT часто быстрее чем DELETE.


ясно, может быть 10 записей, а может быть и 100000...

а откуда может эти 100000 лишних записей "вдруг" появиться?
1 сен 09, 14:28    [7603408]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить