Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

А как это делать правильнее и быстрее? (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, то зачем искать максимальное значение


Наверх

Титульная страница Поиск, карта сайта Написать письмо