Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.064 c
15-1328526701
2222
2012-02-06 15:11
2013.03.22
Вырезать полигон из полигона


2-1331645587
Сергей
2012-03-13 17:33
2013.03.22
Компонент Delphi для Clob Oracle?


15-1353960706
Дмитрий С
2012-11-27 00:11
2013.03.22
Удаленная отладка Lazarus


4-1259213007
Alex_C
2009-11-26 08:23
2013.03.22
Работа с LPT-портом


15-1349434291
oxffff
2012-10-05 14:51
2013.03.22
Ищем ABAP стажеров(разработчиков).





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский