Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Как быстро вставить записи в oracle?   Найти похожие ветки 

 
Eu   (2012-06-19 17:38) [0]

Клиентское приложение - delphi, ADO коннектится на oracle.

Проводим тесты, простая таблица:

create table Z_TEST
(
 id    NUMBER not null,
 name1 VARCHAR2(150) not null,
 name2 VARCHAR2(120) not null
)

Пишем рандомные данные, по 5000 тысяч записей за транзакцию.

1) Выполнение кучи запросов вида:

insert into z_test (id, name1, name2) values (<Num>, <String>, <String>)

оочень долго. Получилось что-то порядка 25 минут...

2) выполнение запроса, но с вариацией параметров... То есть, запрос один:

insert into z_test (id, name1, name2) values (:p1, :p2, :p3)

Прибиваются разные значения и инсертится 5 тысяч строк. Гораздо лучше, чуть больше двух минут.

Как бы сделать еще быстрее?


 
Медвежонок Пятачок ©   (2012-06-19 20:09) [1]

естественно быстрее не с клиента а с сервера.


 
Petr V. Abramov ©   (2012-06-19 22:02) [2]


> Как бы сделать еще быстрее?

http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/tuning.htm#sthref2176
ADO не знаю, но если не умеет, объехать через передачу массивов строками через запятые, плохо, но все равно более быстрее выйдет


 
AV ©   (2012-06-19 22:32) [3]

.Disablecontrols;

конечно, написано?


 
Petr V. Abramov ©   (2012-06-19 22:41) [4]


> AV ©   (19.06.12 22:32) [3]
>
> .Disablecontrols;
>
> конечно, написано?

ага, в init.ora :))))


 
AV ©   (2012-06-19 23:01) [5]

не, туда, по совету Кайта,  Fast = true надо писать :)
Я к тому, что в ado к НД disablecontrol хорошо прикрутить в начале телодвижений. Ega бы давно сказал, да что-то молчит и молчит - ну, сам не выдержал:)


 
Petr V. Abramov ©   (2012-06-19 23:05) [6]


> AV ©   (19.06.12 23:01) [5]

кто чего давно бы сказал, я промолчу, но вреда от [3], да, не будет :)


 
AV ©   (2012-06-19 23:16) [7]


> Petr V. Abramov ©   (19.06.12 23:05) [6]

да просто

>  5 тысяч строк. Гораздо лучше, чуть больше двух минут

это для параметров+disablecontrol что-то многовато.


 
wicked ©   (2012-06-19 23:46) [8]


> >  5 тысяч строк. Гораздо лучше, чуть больше двух минут
>
> это для параметров+disablecontrol что-то многовато.

ну автор же не написал, сколько у него на таблице индексов и триггеров...


 
Eu   (2012-06-20 15:13) [9]


> Disablecontrols;
>
> конечно, написано?

а какое влияние disablecontrols может оказать на операции ExecSQL?


 
Eu   (2012-06-20 15:15) [10]


> естественно быстрее не с клиента а с сервера.

так то да. Но изначально вливочный файл... (допустим, это табулированный CVS) находится на стороне, где можно запустить дельфи-сервис, допустим. Ора доступна по локальной сети.
Глаголь )


 
Kerk ©   (2012-06-20 15:30) [11]


> Eu   (20.06.12 15:15) [10]

Процедурку на PL/SQL набросать не вариант?


 
Игорь Шевченко ©   (2012-06-20 15:50) [12]

sql loader или external tables и не изобретать велосипеды с пятью квадратными колесами, а потом удивляться, почему ездят медленно.


 
Eu   (2012-06-20 16:01) [13]


> Процедурку на PL/SQL набросать не вариант?

что она должна делать?


 
Kerk ©   (2012-06-20 16:03) [14]


> что она должна делать?

BULK INSERT ?


 
sniknik ©   (2012-06-20 16:53) [15]

> а какое влияние disablecontrols может оказать на операции ExecSQL?
никакой, т.к. запросы баз возврата данных нужно делать в ADOCommand, а там отсутствует часть отвечающая за связь с визуальными контролами.
в любом другом случае - ССЗБ.

> Как бы сделать еще быстрее?
попробуй с ExecuteOptions "поиграть"  в частности eoExecuteNoRecords поставить.


 
Плохиш ©   (2012-06-20 16:55) [16]

BeginTransaction/CommitTransaction могут помочь отцу русской демократии.


 
sniknik ©   (2012-06-20 16:55) [17]

> баз возврата данных
без


 
DVM ©   (2012-06-20 17:00) [18]


> Пишем рандомные данные, по 5000 тысяч записей за транзакцию.

Сколько записей за транзакцию все же? 5000 или 5000 000 ?


 
Eu   (2012-06-20 17:07) [19]


> никакой, т.к. запросы баз возврата данных нужно делать в
> ADOCommand, а там отсутствует часть отвечающая за связь
> с визуальными контролами.
> в любом другом случае - ССЗБ.

если это абсолютное правило - то зачем разработчики сделали метод ExecSQL?


> BeginTransaction/CommitTransaction могут помочь отцу русской
> демократии.

каким образом?


> Сколько записей за транзакцию все же? 5000

за транзакцию пять тысяч (5 000). Пробовали сто тысяч, но там почти линейная зависимость по времени.


 
Eu   (2012-06-20 17:13) [20]


> BULK INSERT ?

не могу найти описание толковое... Для MS SQL это вроде возможность указать грузить данные из файла на внешней машине?

Для оракла типа того? То есть, трансформировать файл из исходного формата в нужный и с помощью этой команды натравить оракл на файл?


 
sniknik ©   (2012-06-20 17:19) [21]

> то зачем разработчики сделали метод ExecSQL?
не его, а вообще ADOQuery ... для облегчения перехода с BDE.

но вообще, ничего абсолютного в программировании не бывает.

тебе нужно быстрее??? ну так слушай что говорят.

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


 
sniknik ©   (2012-06-20 17:23) [22]

еще можно вот как запрос составить например, если пойдет в оракле
insert into z_test (id, name1, name2) FROM
(
SELECT :p1, :p2, :p3
UNION ALL
SELECT :p4, :p5, :p6
)
почти в 2 раза будет быстрее... ну в 1.8. но если 3 селекта то...


 
sniknik ©   (2012-06-20 17:26) [23]

> если пойдет в оракле
там скорее всего другая конструкция будет, а если есть определенная "под заполнение" (типа того же BULK INSERT) чтобы все в одном "скинуть", то это будет самый быстрый способ.


 
Eu   (2012-06-20 18:26) [24]


> без явно открытой транзакции сервер заворачивает в "автотранзакцию"
> каждый инсерт...

ну на ADOCOnnection я делаю BeginTrans / CommitTrans конечно. Хотя с точки зрения оракла команды начала транзакции нету.


> insert into z_test (id, name1, name2) FROM
> (
> SELECT :p1, :p2, :p3
> UNION ALL
> SELECT :p4, :p5, :p6
> )

ага, до этого дошли вчера еще )) В принципе, при таком подходе при 10 объединениях удалось пропихнуть 100к записей за полторы минуты, что уже приемлемо.

Но коли тема поднята - хотелось бы углубить знания в вопросе.

Пока никак не пойму, что такое Bulk insert. В Кайте том же это есть? Не могу найти...


 
Petr V. Abramov ©   (2012-06-20 20:40) [25]


> не могу найти описание толковое...

а ссылки читать не пробовал?


 
Inovet ©   (2012-06-20 20:50) [26]

> [25] Petr V. Abramov ©   (20.06.12 20:40)
> а ссылки читать не пробовал?

Там буквы незнакомые.


 
sniknik ©   (2012-06-20 22:27) [27]

> ага, до этого дошли вчера еще ))
врешь. в ветке этого нет.

> ну на ADOCOnnection я делаю BeginTrans / CommitTrans конечно. Хотя с точки зрения оракла команды начала транзакции нету.
если по BeginTrans у оракла нет начала транзакции, то ее и нет, команда бессмысленна.  делай запросами, так чтобы была транзакция у оракла.



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.116 c
15-1332959449
Гость
2012-03-28 22:30
2013.03.22
Вирусная музыкальная реклама twix


15-1350489704
Artem
2012-10-17 20:01
2013.03.22
Изменение размера окна в семерке и хр.


15-1339143768
Scott Storch
2012-06-08 12:22
2013.03.22
знатокам английского


2-1340630036
webpauk
2012-06-25 17:13
2013.03.22
Изменение заголовка формы


4-1260613396
GreyWolf
2009-12-12 13:23
2013.03.22
Установка CoInitFlags в COINIT_MULTITHREADED портит иконки файлов