![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
А как это делать правильнее и быстрее? (SQL) [D6, MSSQL]
Behemoth © (2002-09-19 11:17:00)Например, есть две таблицы.
Первая (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, а полей, да и таблиц больше. В общем долго. Мож кто что предложит?
Behemoth (2002-09-19 11:54:00) [1]to ЮЮ:
Второй вариант точно не подходит из-за особенностей базы оригинала, да и обновляемой тоже.
Behemoth (2002-09-19 11:51:00) [2]to ЮЮ:
Записей 150000. В это время непрерывно идет обращение к базе со стороны других клиентов, которые тоже непрочь что-нить в нее вставить. По моему одна большая транзакция на полчаса чрезмерно загрузит базу
ЮЮ (2002-09-19 11:46:00) [3]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, что и в исходной таблице и сделать всё одним запросом
3JIA9I CyKA (2002-09-19 11:45:00) [4]8)
Behemoth (2002-09-19 11:43:00) [5]to 3JIA9I CyKA:
Спасибо!!!!
Вроде дошло!
3JIA9I CyKA (2002-09-19 11:42:00) [6]Зайди в QA (кВеРи аНаЛайзЕр) и нажни F1 (Ф1).
Behemoth (2002-09-19 11:39:00) [7]to 3JIA9I CyKA:
Поясни: select @Client_ID = @@identity
Что есть @@identity?
3JIA9I CyKA (2002-09-19 11:32:00) [8]@@identityБЛН!
3JIA9I CyKA (2002-09-19 11:31:00) [9]Ку?
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:00) [10]А я не знаю как иначе. Какое значение писать во вторую таблицу?
Андрей Прокофьев (2002-09-19 11:20:00) [11]Если поле AutoIncrement, то зачем искать максимальное значение