Форум: "Базы";
Текущий архив: 2002.10.10;
Скачать: [xml.tar.bz2];
ВнизА как это делать правильнее и быстрее? (SQL) Найти похожие ветки
← →
Behemoth (2002-09-19 11:17) [0]Например, есть две таблицы.
Первая (Clients): ID :Int (Автоинкрементное) и Name:String.
Вторая (Phones) : ID_Clients: int и Phone:String. Таблицы связаны по ID и ID_Clients. Задача заполнить их.
Делаю так: нахожу максимальный ID, прибавляю 1, потом
insert into Clients(ID,Name) Values (:MaxID,:Name)
insert into Phones (ID_Clients, Phone) Values (:MaxID,:Phone)
Так вот, записей, которых надо обновлять 150000, а полей, да и таблиц больше. В общем долго. Мож кто что предложит?
← →
Андрей Прокофьев (2002-09-19 11:20) [1]Если поле AutoIncrement, то зачем искать максимальное значение
← →
3JIA9I CyKA (2002-09-19 11:31) [2]Ку?
create table Clients (
ID int not null identity(1,1),
Name varchar(30) not null default "Чё-то",
constraint PK_Clients primary key nonclustered (ID)
)
go
create table Phones (
ID int not null,
Client_ID int not null,
Phone varchar(16) not null default "03",
constraint PK_Phones primary key nonclustered (ID),
constraint FK_Phones_Clients foreign key (Client_ID) references Clients (ID)
)
go
create procedure p_Jopa
@Name varchar(30),
@Phone varchar(10)
as
begin tran
declare @Client_ID int
insert into Clients (Name) values (@Name)
if @@error != 0 goto Err
select @Client_ID = @@identity
insert into Phones (Client_ID, Phone) values (@Client_ID, @Phone)
if @@error != 0 goto Err
commit tran
return
Err:
rollback tran
raiserror 50001 "Error, блин!"
go
← →
Behemoth (2002-09-19 11:31) [3]А я не знаю как иначе. Какое значение писать во вторую таблицу?
← →
3JIA9I CyKA (2002-09-19 11:32) [4]@@identity БЛН!
← →
Behemoth (2002-09-19 11:39) [5]to 3JIA9I CyKA:
Поясни: select @Client_ID = @@identity
Что есть @@identity?
← →
3JIA9I CyKA (2002-09-19 11:42) [6]Зайди в QA (кВеРи аНаЛайзЕр) и нажни F1 (Ф1).
← →
Behemoth (2002-09-19 11:43) [7]to 3JIA9I CyKA:
Спасибо!!!!
Вроде дошло!
← →
3JIA9I CyKA (2002-09-19 11:45) [8]8)
← →
ЮЮ (2002-09-19 11:46) [9]1) убыстрение
StartTransaction<b/>
MaxID:=...(достаточно узнать один раз)
While not SourceQuery.EOF do
begin
inc(MaxID);
Insert1Queryparams.[0].Value<b/>.:=MaxID;
Insert1Query.ExecSQL;
Insert2Query.params[0].Value:=MaxID;
Insert2Query.ExecSQL;
SourceQuery.Next;
end;
Commit<b/>
2) использовать те же ID, что и в исходной таблице и сделать всё одним запросом
← →
Behemoth (2002-09-19 11:51) [10]to ЮЮ:
Записей 150000. В это время непрерывно идет обращение к базе со стороны других клиентов, которые тоже непрочь что-нить в нее вставить. По моему одна большая транзакция на полчаса чрезмерно загрузит базу
← →
Behemoth (2002-09-19 11:54) [11]to ЮЮ:
Второй вариант точно не подходит из-за особенностей базы оригинала, да и обновляемой тоже.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.10.10;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c