Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизКак быстро вставить записи в 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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.057 c