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

Откуда: Київ
Сообщений: 10428
есть две таблицы, надо добавить из второй в первую записи только теЮ которых нет в 1-й и чтобы в первой были только уникальные.
Можно ли сделать запрос оптимальнее , учитывая, что записей может быть сотни тыщ

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

insert into #a(id)	
(select distinct id from #b where id not in (select id from #a))

select * from #a
select * from #b
1 сен 09, 12:25    [7602388]     Ответить | Цитировать Сообщить модератору
 Re: как оптимально добавить записи?  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
select #b.id from #b
 left join #a on (#a.id = #b.id)
where  #a.id is null
1 сен 09, 12:30    [7602431]     Ответить | Цитировать Сообщить модератору
 Re: как оптимально добавить записи?  [new]
aleks2
Guest
Winnipuh,

CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name 
    ON { table | view } ( column [ ASC | DESC ] [ ,...n ] ) 
[ WITH < index_option > [ ,...n] ] 
[ ON filegroup ]

< index_option > :: = 
    { PAD_INDEX | 
        FILLFACTOR = fillfactor | 
        IGNORE_DUP_KEY | 
        DROP_EXISTING | 
    STATISTICS_NORECOMPUTE | 
    SORT_IN_TEMPDB  
}

IGNORE_DUP_KEY
1 сен 09, 12:31    [7602442]     Ответить | Цитировать Сообщить модератору
 Re: как оптимально добавить записи?  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Winnipuh
чтобы в первой были только уникальные.
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)
alter table #a add constraint unique_a_id unique(id) with (ignore_dup_key = on)
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

insert into #a(id) select id from #b

select * from #a
select * from #b
1 сен 09, 12:32    [7602448]     Ответить | Цитировать Сообщить модератору
 Re: как оптимально добавить записи?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Паганель
Winnipuh
чтобы в первой были только уникальные.
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)
alter table #a add constraint unique_a_id unique(id) with (ignore_dup_key = on)
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

insert into #a(id) select id from #b

select * from #a
select * from #b


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

create	table #a(id int primary key)

или лучше добавить правило, добавить индекс и не делать ключ?
1 сен 09, 12:40    [7602508]     Ответить | Цитировать Сообщить модератору
 Re: как оптимально добавить записи?  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Winnipuh
а если мне нужен первичный ключ в этой таблице
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 not null)
alter table #a add constraint primary_a_id primary key(id) with (ignore_dup_key = on)
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

insert into #a(id) select id from #b

select * from #a
select * from #b
PS честно говоря, никогда раньше так не делал
1 сен 09, 12:59    [7602659]     Ответить | Цитировать Сообщить модератору
 Re: как оптимально добавить записи?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Паганель
Winnipuh
а если мне нужен первичный ключ в этой таблице
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 not null)
alter table #a add constraint primary_a_id primary key(id) with (ignore_dup_key = on)
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

insert into #a(id) select id from #b

select * from #a
select * from #b
PS честно говоря, никогда раньше так не делал


я бы тоже не делал, да вот надо оптимизировать процедуру..
1 сен 09, 13:02    [7602682]     Ответить | Цитировать Сообщить модератору
 Re: как оптимально добавить записи?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
кстати, что лучше строить на временной таблице в данном случае:

- ПК с игнором дубликатов
- индекс кластерный с игнором дубликатов (получается это от же что и ПК практически?)
- индекс некластерный с игнором дубликатов
1 сен 09, 13:07    [7602722]     Ответить | Цитировать Сообщить модератору
 Re: как оптимально добавить записи?  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Winnipuh
кстати, что лучше строить на временной таблице в данном случае
я не знаю
в оптимизациях не силен
попробуйте потестить и выложить результаты сюда
для грядущих поколений может быть полезно
1 сен 09, 13:24    [7602852]     Ответить | Цитировать Сообщить модератору
 Re: как оптимально добавить записи?  [new]
mike909
Member

Откуда:
Сообщений: 662
Winnipuh,

Версия SQL_я, случайно не SQL2k5(8) ?
Если да, то
insert into #a
select * from #b
except
select * from #a
1 сен 09, 13:28    [7602883]     Ответить | Цитировать Сообщить модератору
 Re: как оптимально добавить записи?  [new]
Winnipuh
Member [заблокирован]

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

Версия SQL_я, случайно не SQL2k5(8) ?
Если да, то
insert into #a
select * from #b
except
select * from #a


2005, ок, попробую
1 сен 09, 13:38    [7602962]     Ответить | Цитировать Сообщить модератору
 Re: как оптимально добавить записи?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Winnipuh
кстати, что лучше строить на временной таблице в данном случае:

- ПК с игнором дубликатов
- индекс кластерный с игнором дубликатов (получается это от же что и ПК практически?)
- индекс некластерный с игнором дубликатов


пока получается, что ПК самый неоптимальный
1 сен 09, 13:39    [7602971]     Ответить | Цитировать Сообщить модератору
 Re: как оптимально добавить записи?  [new]
iap
Member

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

Версия SQL_я, случайно не SQL2k5(8) ?
Если да, то
insert into #a
select * from #b
except
select * from #a


2005, ок, попробую
Сдаётся мне, что старый добрый NOT EXISTS не хуже!
Раз пошла такая пьнка, то
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 THEN INSERT(F) VALUES(F);
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, 13:54    [7603107]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить