powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Быстрое создание записей в БД
57 сообщений из 57, показаны все 3 страниц
Быстрое создание записей в БД
    #36214978
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал простой тест
Вставка в таблицу поля (a,b,c: integer) 1 000 000 записей

(все СУБД внутри виртуальной машины VirtualPC)

MS SQL 2005 544сек
ORACLE 10 100сек
CACHE 2009.1 через интерфейс Objects 70сек
CACHE 2009.1 через интерфейс SQL 45сек
CACHE 2009.1 через доступ к глобалям 7сек

У кого есть какие комментарии?
У меня вопрос - почему такое отставание MSSQL (Он при работе все время обращается к винту) ?
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36215032
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторСделал простой тест
Вставка в таблицу поля (a,b,c: integer) 1 000 000 записей

Записи можно вставлять по разному... Покажите, хотябы, как Вы дедали это для MS SQL.
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36215094
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и снова здравствуйте, Рыцарь Печального Образа

P.S. Побег за попкорном
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36215112
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglСделал простой тест

У кого есть какие комментарии?

- Штурман, приборы!
- Семьдесят.
- Что "семьдесят"?
- А что "приборы"?

Для начала нужно чётко понимать, что же, собственно, Вы хотите мерять.

SiemarglУ меня вопрос - почему такое отставание MSSQL (Он при работе все время обращается к винту) ?
Стеклянный шар советует проверить autocommit :)

SiemarglУ кого есть какие комментарии?
Да, ещё один маленький комментарий.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
Connected to Oracle Database 10g Express Edition Release  10 . 2 . 0 . 1 . 0  
Connected as test

...

SQL> truncate table million;

Table truncated

Executed in  0 , 406  seconds

SQL> exec insert_million_1;

PL/SQL procedure successfully completed

Executed in  2 , 218  seconds

SQL> truncate table million;

Table truncated

Executed in  0 , 328  seconds

SQL> exec insert_million_2;

PL/SQL procedure successfully completed

Executed in  225 , 969  seconds

Any questions?
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36215238
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerSiemarglУ меня вопрос - почему такое отставание MSSQL (Он при работе все время обращается к винту) ?
Стеклянный шар советует проверить autocommit :)Тоже про это подумалось. Про постоянное обращение к диску - он родимый. Сравниваем:
Код: plaintext
1.
   372406  мс - с autocommit
   109844  мс - с  1  явной  1  транзакцией
Ну и нельзя не проверить "наше все"
Код: plaintext
 5734  мс - BULK INSERT
Ну и до кучи:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
begin tran
go

set nocount on;

declare @i int

set @i =  0 
while @i <  1000000  begin
	insert into tbl(a, b, c) values(@i, @i, @i)
	set @i = @i +  1 
end
go

commit tran
go
Код: plaintext
 12296  мс
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36215292
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо еще и FB испытать. А то мужики не поймут...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
execute block
as
declare variable i int;
begin
  i =  0 ;
  while (i <  1000000 ) do begin
    insert into ttt(a, b, c) values(:i, :i, :i);
    i = i +  1 ;
  end
end
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 1000000  record(s) was(were) inserted into TTT

------ Performance info ------
Prepare time = 0ms
Execute time = 4s 688ms
Current memory =  34   376   820 
Max memory =  34   710   028 
Memory buffers =  2   048 
Reads from disk to cache =  23 
Writes from cache to disk =  1   561 
Fetches from cache =  3   095   744 
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36215391
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Куда, что и кто еще вставлять будет ?
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36215406
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry ArefievКуда, что и кто еще вставлять будет ?Да ты только идею подай!..

Имхо, автору достаточно наглядно показали, что сравнивать сферический insert в вакууме - дело неблагодарное.
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36215424
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Senya_Linsert
Да может там не insert, а alter table add column ("Вставка в таблицу поля"),
а в таблице 1M записей :)
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36215509
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Senya_L
> Надо еще и FB испытать. А то мужики не поймут...

Семён, а если так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
execute block
as
declare variable i int;
begin
  i =  0 ;
  insert into ttt(a, b, c) values(:i, :i, :i);
  while (i <  31 ) do begin
    insert into ttt(a, b, c) select a, b, c from ttt;
    i = i +  1 ;
  end
end
?


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36215517
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос,

ой, да вариантов можно напридумывать:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
DECLARE 
  @StartTime datetime
SET @StartTime = GETDATE()

SELECT TOP  1000000  s1.object_id c1, s2.object_id c2, s3.object_id c3, s4.object_id c4 INTO T1
FROM sys.objects s1, sys.objects s2, sys.objects s3, sys.objects s4

SELECT DATEDIFF(ms, @StartTime, GETDATE()) AS ms
GO

Код: plaintext
1.
2.
3.
4.
(1000000 row(s) affected)

ms          
----------- 
1520

тока оно зачем?!
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36215628
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да процедуру я не показал
Она в приципе почти копия как у Senya_L в свертке "до кучи", только значения присваиваются через random();

BULK INSERT мне не подходят (пока)

С отключением автокоммита ситуация значительно улучшилась.
MS SQL 2005 25сек
остальное неизменно
ORACLE 10 100сек
CACHE 2009.1 через интерфейс Objects 70сек
CACHE 2009.1 через интерфейс SQL 45сек
CACHE 2009.1 через доступ к глобалям 7сек



Порядок времени исполнения почти выровнялся. Возможно можно улучшить ORACLE? Вот процедура:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
declare              
     numrec number := 10000 ;             
     ii number := 0 ;             
     var1  number := 0 ;           
     var2  number := 0 ;           
     var3  number := 0 ;     
BEGIN     
    
     ii :=  0 ;     
     WHILE ii < numrec LOOP               
          var1 := ( 1000  + ii) mod  10000 ;                    
          var2 := ( 1002  + ii) mod  10000 ;                    
          var3 := ( 1010  + ii) mod  10000 ;                   
          INSERT INTO TestA (a,b,c) VALUES (var1,var2,var3);               
          ii := ii + 1 ;     
     END LOOP;     
     DBMS_OUTPUT.PUT_LINE( 'we ran succesfully! : ' || ii );     
END;
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36215632
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglВозможно можно улучшить ORACLE?Может, тоже коммитить попробовать?
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36215638
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglПорядок времени исполнения почти выровнялся. Возможно можно улучшить ORACLE? Вот процедура:

Код: plaintext
1.
2.
3.
declare              
     numrec number := 10000 ;             
END;

чо за фигня?
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36215822
Yo.!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Siemargl

Порядок времени исполнения почти выровнялся. Возможно можно улучшить ORACLE?
вот так нуна:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SQL> set timing on ;
SQL> insert /*+ append */ into TestA select mod(1000+rownum,1000), mod(1002+rownum,1000), mod(1010+rownum,1000) from (select null from dual connect by level <= 1000000) ;

1000000 rows created.

Elapsed: 00:00:02.39

...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36215917
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yo.!,
это трик, не совсем честный по логике.
Кроме того, рекурсия - дорогое удовольствие и у меня, например, по памяти не проходит.


ORA-04031: unable to allocate 44 bytes of shared memory ("large pool","unknown object","kxs-heap-w","cursor work heap")
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36215930
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl wrote:

> У кого есть какие комментарии?

Я думаю, тут дело в неверных замерах.
А в случае кэша -- возможно и непонимание
того, что он делает, и эквивалентность этого
тому, что делают другие СУБД (я например
не понимаю этого. Ты понимаешь ?)
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36215935
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl wrote:

> С отключением автокоммита ситуация значительно улучшилась.
> MS SQL 2005 25сек

Дело не в автокоммите, а в размере транзакции. Если 1 миллион
транзакций по одной записи -- будет медленно.
Если 10 тыщ транзакций по 100 записей -- будет быстрее.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36215944
Yo.!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SiemarglYo.!,
это трик, не совсем честный по логике.

это не трюк, а так люди работают с rdbms. ваш вариант - пример абсолютной безграмотности и некомпетентности. обычно манией все решать неестественными реляционым бд циклами пресущи фокспро-гайз и пораженных кашей.

Siemargl
Кроме того, рекурсия - дорогое удовольствие и у меня, например, по памяти не проходит.


дефолтной инсталяции oracle xe памяти хватает, нефиг лезть в настройки не обладая хотя бы минимальной квалификацией ...
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36215978
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yo.!,
Инсталляция почти дефолтная, крутить ничего не надо было для тест-системы.
Изменена только ALTER SYSTEM SET SHARED_POOL_SIZE='100M' SCOPE=spfile;
по инструкции к apex v3

И не надо страдать манием величия (запроса) - единственным запросом выгребая тучу памяти.
А остальным что? Админ БД побьет, если поймает.

В реальности задача конечно не крутит циклы в PL/SQL, а внешней программой пишет по одной записи. У нее свои циклы (по приходу данных) и таких табличек - скажем, типично тысяча.
А это-искусственная ее имитация.


MasterZiv
Не понимаю. Самая прозрачная структура хранения кстати, у Кэша, который я впервые вижу, а вот остальные на что тратят время в тривиальном случае - мне непонятно.
Это как NTFS - (и структура хранения кстати, в СУБД похожа) - и надежная и иногда очень быстрая, но периодически тратит на свои внутренние дела ХЗ сколько времени. А кэш в этой аналогии как FAT.

А замеры то верные - в одной виртуалке, с дефолтными настройками.

С индексами структура еще усложнится, и не нужны они (пока и так не совем понятно что происходит).
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36215985
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Siemargl wrote:

> С отключением автокоммита ситуация значительно улучшилась.
> MS SQL 2005 25сек

Дело не в автокоммите, а в размере транзакции. Если 1 миллион
транзакций по одной записи -- будет медленно.
Если 10 тыщ транзакций по 100 записей -- будет быстрее.
+1

XML'ем можно "лить" данные, уж на то пошло.

И что за мания сравнивать скорость вставки тупо создав программный цикл на сервере? Задача сервера БД - обслуживать клиентские запросы (простите уж за банальности, они для автора :)), а оценивать скорость вставки по запросам, как все мои выше указанные - это полная фигня. Я-то хоть проикалывался
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36215992
Fox5631
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Visual Foxpro 9

Код: plaintext
1.
2.
3.
4.
5.
6.
T1=SECONDS()
FOR i= 1  TO  1000000 
   INSERT INTO Ttt (a,b,c) VALUES (i,i,i)
NEXT

T2=SECONDS()
? T2-T1

2.703
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36215998
Yo.!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SiemarglYo.!,
Инсталляция почти дефолтная, крутить ничего не надо было для тест-системы.
Изменена только ALTER SYSTEM SET SHARED_POOL_SIZE='100M' SCOPE=spfile;
по инструкции к apex v3
брехня.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
SQL> alter system set sga_target=100m;

System altered.

SQL> shutdown immediate ;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup ;
ORACLE instance started.

Total System Global Area   134217728  bytes
Fixed Size                   1257620  bytes
Variable Size              117444460  bytes
Database Buffers            12582912  bytes
Redo Buffers                 2932736  bytes
Database mounted.
Database opened.
SQL> drop table testa ;

Table dropped.

SQL> create table TestA (var1 number( 5 ), var2 number( 5 ), var3 number( 5 )) ;

Table created.

SQL> insert /*+ append */ into TestA select mod( 1000 +rownum, 1000 ), mod( 1002 +rownum, 1000 ), mod( 1010 +rownum, 1000 ) from (select null from dual connect by level <=  1000000 ) ;

 1000000  rows created.

SiemarglИ не надо страдать манием величия (запроса) - единственным запросом выгребая тучу памяти.
память - она резиновая и дешевле картошки, а вот и/о - дорого, вот его беречь нуна.

SiemarglА остальным что? Админ БД побьет, если поймает.
гнать таких админов на пенсию, в крайнем случае, если где-то сохранилось, в зад на кашу...
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36216018
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторС индексами структура еще усложнится, и не нужны они

Можно я буду Вас цитировать???
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36216042
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yo.!SiemarglИ не надо страдать манием величия (запроса) - единственным запросом выгребая тучу памяти.
память - она резиновая и дешевле картошки, а вот и/о - дорого, вот его беречь нуна.
В районе 5т-10т записей на батч (зависит от <длинный список 1>) перестает существенно
расти производительность. Заключать всю "нарезку" или только один батч в транзакцию
зависит больше <длинный список 2>. Первый и второй списки слабо пересекаются ...
Так что - кто как порежет. А кто и одной кучей.
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36216102
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yo.!,
Поправьте меня, но ваша команда set sga sga_target без SCOPE действует только до перезапуска БД.
Что и видно при старте, что ее 128М =)

Ну и память в Ора SGA, которая используется для рекурсии, совсем не резиновая в мультиюзер.
Нечего демагогию разводить.


> pkarklin
Цитировать можно, но полностью и без отрыва от контекста, который есть "в данном случае"

А результаты такие
-в простую базу и писать легче. См.FoxPro и Cache.Direct
-при нормальном доступе (SQL) скорость такой операции сравнима у разных БД. Только у каждой свои приколы/мульки
-использовать надо инструмент, подходящий под задачу

А вообще, сравнение родилось случайно, т.к. мне нужен был нормальный ОБЪЕКТНЫЙ доступ, с которым я наткнулся на Кэше, а проверка скорости началась из вопроса "а не сильно ли медленно оно работает (и как)?". Ну и задача была под руками.

Побочный вывод - рекламе верить нельзя вообще, а Кэшу в частности (про скорость).

Так что для меня тема закрыта. Всем сочувствовавшим спасибо.
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36216185
кстати
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Fox5631

Респект и уважение!
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36216267
Yo.!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SiemarglYo.!,
Поправьте меня, но ваша команда set sga sga_target без SCOPE действует только до перезапуска БД.
Что и видно при старте, что ее 128М =)


в данном случае не важно, 28 мб никакой роли не играют:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SQL> startup ;
ORACLE instance started.

Total System Global Area   104857600  bytes
Fixed Size                   1257452  bytes
Variable Size               79691796  bytes
Database Buffers            20971520  bytes
Redo Buffers                 2936832  bytes
Database mounted.
Database opened.
SQL> insert /*+ append */ into TestA select mod( 1000 +rownum, 1000 ), mod( 1002 +rownum, 1000 ), mod( 1010 +rownum, 1000 ) from (select null from dual connect by level <=  1000000 ) ;


 1000000  rows created.

SiemarglНу и память в Ора SGA, которая используется для рекурсии, совсем не резиновая в мультиюзер.
Нечего демагогию разводить.
с чего ты решил, что этот запрос съест сколько нибудь заметное кол-во памяти ?
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36216458
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglЦитировать можно, но полностью и без отрыва от контекста, который есть "в данном случае"

Обязательно! С линком на первый пост в этом топике.


SiemarglА результаты такие
-в простую базу и писать легче. См.FoxPro и Cache.Direct

Еще легче просто в файл. И что?!


Siemarglпри нормальном доступе (SQL) скорость такой операции сравнима у разных БД. Только у каждой свои приколы/мульки

Что есть "нормальный доступ"?! И что Вы относите к приколам\мулькам в каждой из "протестированных Вами СУБД"?

Siemarglиспользовать надо инструмент, подходящий под задачу

Упс... А где, собственно то задача???
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36218565
Фотография vadiminfo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl
-использовать надо инструмент, подходящий под задачу

Как представляется по предшествующим постам, существуют риски определение "подходимости" инструмента "под задачу" может оказаться более сложной задачей, чем исходная типа задача. По крайней мере, для некоторых задачерешателей. Потому все еще стоит рассмотреть более принятый подход: выбрать инструмент "под как моно больше задач" раз и на долго. По крайней мере, если идет речь о "задачах", "над" которыми ожидается инструмент типа СУБД.
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36219693
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadiminfoПотому все еще стоит рассмотреть более принятый подход: выбрать инструмент "под как моно больше задач" раз и на долго.

Fox имеешь в виду ? ;)
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36228607
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот еще результат к размышлению. Берем NHibernate 2.1, тот же SQL2005 express и миллион объектов.

Время: Time to insert: 00:06:02.7215680
Напомню, что в SQL-процедуре создание заняло 26сек.

Продолжим комментарии?


Для всякий случай - основной код ниже.


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
            try {
                using (ISession session = OpenSession()) {
                    int i;
                    Random rnd = new Random();
                    using (ITransaction transaction = session.BeginTransaction()) {
                        for (i =  0 ; i <  1000000 ; i++)
                        {
                            TestA obj = new TestA(rnd.Next( 1000 ), rnd.Next( 1000 ), rnd.Next( 1000 ));
                            session.Save(obj);
                            obj = null;
                        }
                        transaction.Commit();
                    }
                    Console.WriteLine("Saved to the database objects = " + i);
                }
            } catch (Exception e) { Console.WriteLine(e); }
            
            Console.WriteLine("Time to insert: " + (DateTime.Now - begin) + "\n");
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36537062
Толстый_Троль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglСделал простой тест
Вставка в таблицу поля (a,b,c: integer) 1 000 000 записей

(все СУБД внутри виртуальной машины VirtualPC)

MS SQL 2005 544сек
ORACLE 10 100сек
CACHE 2009.1 через интерфейс Objects 70сек
CACHE 2009.1 через интерфейс SQL 45сек
CACHE 2009.1 через доступ к глобалям 7сек

У кого есть какие комментарии?
У меня вопрос - почему такое отставание MSSQL (Он при работе все время обращается к винту) ?

Неплохо. У меня Sqlite через sql сумел то же самое сделать за 61 сек.

7 сек скорее всего из-за того что не парсится SQL

http://webfile.ru/4377782
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36537194
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Толстый_Троль
Неплохо. У меня Sqlite через sql сумел то же самое сделать за 61 сек.

7 сек скорее всего из-за того что не парсится SQL

http://webfile.ru/4377782

Все измерения я проводил в виртуалке. Скорость в ней падает вдвое (минимум).

Текущая таблица выглядит так:

MS SQL 2005 25сек
ORACLE 10 100сек
CACHE 2009.1 через интерфейс Objects 70сек
CACHE 2009.1 через интерфейс SQL 45сек
CACHE 2009.1 через доступ к глобалям 7сек
ORM NHibernate 2.1 + SQL2005 6 минут 2 сек

Firebird 2.5 7.4сек
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36537252
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А теперь тесты Кэтрин

В транзакционном режиме TxF 51.8 cек
В нетранзакционном режиме 16.9 сек

Это существенно быстрее NHibernate

Код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
class k3testobj : public k3obj
{
	static	int gen_id;
public:
	int m_a, m_b, m_c;

	k3testobj();
	virtual k3obj *create(){ return new k3testobj(); }
};
....


	int	objnumber =  1000000 ;
	k3trans		trans1(L"transact1");
	{
		k3entity	ent_objs(&trans1, L"objs", k3testobj());
		ent_objs.m_blocksize =  16  *  1024  - 4 ;

		trans1.start();
		// create test set
		for (int i =  0 ; i < objnumber; i++)
		{
			ent_objs.add(k3testobj());
			if (i %  10000  ==  0 ) printf ("saved obj N: %I32i\n", i);
		}
		printf("\nStatistics creation:\n");
		ent_objs.m_disk->m_statistics.print();
	}
	trans1.commit();

...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36537467
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglА теперь тесты Кэтрин

это что? новый TJ7 ?
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36537539
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, SergSuper!
You wrote on Tue, 23 Mar 10 13:07:58 GMT:

SergSuper S> это что? новый TJ7 ?достойный конкрент!

--
With best regards, Мимопроходящий.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36537575
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergSuper,

Ответы в топике по ней же
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36539786
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl,

Код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
Class del.d Extends %Persistent
{

/// PROPERTYVALIDATION parameter defined in %RegisteredObject
/// overridden here to VALIDATEONSAVE ( 2 ).
Parameter PROPERTYVALIDATION As INTEGER [ Constraint = "0,1,2", Flags = ENUM ] =  0 ;

Property a As %Integer;

Property b As %Integer;

Property c As %Integer;

/// Заполнение случайными данными с помощью объектного подхода.
/// <br><i>Параметры:</i>
/// <br><b>ACount</b> - количество генерируемых объектов;
/// <br><b>WithTrans</b> - включить/выключить транзакции.
ClassMethod FillObjects(
	ACount As %Integer =  1000 ,
	WithTrans As %Boolean =  1 ) As %Status
{
 set t1=$ZH
 do ##class(del.d).%KillExtent()
 if WithTrans {
   TSTART
 } else {
   do $system.OBJ.SetTransactionMode( 0 )
 }
 try{
   for i= 1 : 1 :ACount {
     set t=##class(del.d).%New()
   
     set t.a=$random( 1000 )
     set t.b=$random( 1000 )
     set t.c=$random( 1000 )

     do t.%Save( 0 )
   }
   //set a= 5 / 0 
   if WithTrans {
     TCOMMIT
   } else {
     do $system.OBJ.SetTransactionMode( 1 )
   }
 } catch ex {
   TROLLBACK
 }
 write "Ввод данных = ",($ZH-t1)_" с.",!
 quit $$$OK
}

/// Заполнение случайными данными с помощью SQL.
/// <br><i>Параметры:</i>
/// <br><b>ACount</b> - количество генерируемых записей;
ClassMethod FillSQL(ACount As %Integer =  1000 ) As %Status
{
 set t1=$ZH
 do ##class(del.d).%KillExtent()
 TSTART
 for i= 1 : 1 :ACount {
   set a( 1 )=$random( 1000 )
   set a( 2 )=$random( 1000 )
   set a( 3 )=$random( 1000 )
   &sql(insert %NOCHECK %NOLOCK %NOINDEX %NOTRIGGER into del.d(a,b,c) values(:a( 1 ),:a( 2 ),:a( 3 )))
 }
 TCOMMIT
 write "Ввод данных = ",($ZH-t1)," с.",!
 quit $$$OK
}

/// Заполнение случайными данными с помощью глобалов.
/// <br><i>Параметры:</i>
/// <br><b>ACount</b> - количество генерируемых записей;
ClassMethod FillDirect(ACount As %Integer =  1000 ) As %Status
{
 set t1=$ZH
 do ##class(del.d).%KillExtent()
 TSTART
 for i= 1 : 1 :ACount {
   set ^del.dD(i)=$LB("",$random( 1000 ),$random( 1000 ),$random( 1000 ))
 }
 set ^del.dD=ACount
 TCOMMIT
 write "Ввод данных = ",($ZH-t1)," с.",!
 quit $$$OK
}

}


Результаты для Caché 2010.2.FT1:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
TEST>d ##class(del.d).FillObjects(1e6)
Ввод данных =  27 . 970847  с.
 
TEST>d ##class(del.d).FillObjects(1e6, 0 )
Ввод данных =  26 . 682385  с.

TEST>d ##class(del.d).FillSQL(1e6)
Ввод данных =  12 . 683482  с.
 
TEST>d ##class(del.d).FillDirect(1e6)
Ввод данных =  2 . 733289  с.
Разница в скорости из-за накладных расходов: concurrency, getters/setters, callbacks и т.д. Подробнее можно почитать здесь .
Но Вы можете комбинировать подходы: где важна скорость - используйте SQL (или глобалы), где важно удобство работы или есть сложная обработка - объекты.

В Hibernate есть поддержка диалекта Caché.

PS: если Вы делали тест на однопользовательской версии, то в ней ограничен кэш базы данных.
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36547548
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дополнение
SQLite 3.6.23

4,095 сек

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SQLite version  3 . 6 . 23 
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> pragma page_size= 16384 ;
sqlite> pragma cache_size= 40000 ;
sqlite> .load tablefunc.dll
sqlite> .timer ON
sqlite> create table facts1(rowid int);
CPU Time: user  0 . 000000  sys  0 . 711022 
sqlite> BEGIN TRANSACTION;
CPU Time: user  0 . 000000  sys  0 . 000000 
sqlite> select intrange2table ( 1 , 1000000 , 1 ,'facts1');

CPU Time: user  3 . 645242  sys  0 . 180259 
sqlite> COMMIT;
CPU Time: user  0 . 030043  sys  0 . 240346 
sqlite>
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36551482
AlexKB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglYo.!,
Поправьте меня, но ваша команда set sga sga_target без SCOPE действует только до перезапуска БД.
Что и видно при старте, что ее 128М =)

Ну и память в Ора SGA, которая используется для рекурсии, совсем не резиновая в мультиюзер.
Нечего демагогию разводить.


> pkarklin
Цитировать можно, но полностью и без отрыва от контекста, который есть "в данном случае"

А результаты такие
-в простую базу и писать легче. См.FoxPro и Cache.Direct
-при нормальном доступе (SQL) скорость такой операции сравнима у разных БД. Только у каждой свои приколы/мульки
-использовать надо инструмент, подходящий под задачу

А вообще, сравнение родилось случайно, т.к. мне нужен был нормальный ОБЪЕКТНЫЙ доступ, с которым я наткнулся на Кэше, а проверка скорости началась из вопроса "а не сильно ли медленно оно работает (и как)?". Ну и задача была под руками.

Побочный вывод - рекламе верить нельзя вообще, а Кэшу в частности (про скорость).

Так что для меня тема закрыта. Всем сочувствовавшим спасибо.

Да писать - то ерунда.
А почему бы Вам не попробовать более реальную задачу.

1. Требуется создать 1 000 000 записей.
2. Каждая запись имеет уникальный индекс целого типа.
3. Содержание записи является суммой трех слагаемых.
4. Каждое слагаемое есть результат вычитки из уже созданных записей по индексу,находящемуся в диапазоне от 1 до до индекса последней записи, взятого случайным образом.
5. Самая первая запись может иметь значение равное единице.
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36553134
AlexKB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то "тестеры-теоретики" притихли, или страшно даже затевать подобный эксперимент.
Я вот попробовал на бытовой "железяке", купленной пять лет назад, и получил примерно 24 секунды.
Cache 2009.1
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36553327
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
п.4 не поясните? что такое "вычитка"? и как понять "до индекса последней записи, взятого случайным образом"?
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36553480
AlexKB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergSuper,

Каждое слагаемое суммы, есть уже записанное значение в БД (его необходимо прочитать).
Место хранения такого слагаемого определяется индексом записи.
Если уже было произведено 100 000 записей, то слагаемое может находиться в любой из этих записей от 1 до 100 000. Конкретное значение индекса для каждого слагаемого определяется случайным образом в этом диапазоне.
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36553689
AlexKB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergSuper,

Кстати, вот тестовый код.
Функция старт на входе получает 1000 000 количество вставляемых записей (по умолчанию - 100).

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Start(m= 100 ) 
 set max=m
 set min= 1 
 kill ^Zap
 set t=$zh
 set i= 0 
 set ^Zap(i)= 1 
 do {
	 set i=i+ 1 
	 set ^Zap(i)=^Zap($r(i))+^Zap($r(i))+^Zap($r(i))
 }while i<max
 
 set t1=$zh
 w !,"i=",i
 w !,"time=",t1-t
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36553803
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
плохо MS SQL со случайными числами работает, выглядит некрасиво
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
create table #t(id int, m money)

create index ss on #t(id)

set nocount off
delete #t
begin tran
insert #t(id,  m) select  0 ,  1 
set nocount on
declare @n int
set @n= 1 
while @n< 1000000 
begin
	insert #t(id,  m) select @n, (select m from #t  where id=convert(int,RAND()*@n))+(select m from #t  where id=convert(int,RAND()*@n))+(select m from #t  where id=convert(int,RAND()*@n))
	set @n=@n+ 1 
end
commit tran

1:08
двухядерный офисный нотебук
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36553911
AlexKB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergSuper,

А теперь не удаляя существующие данные выполняем 1 000 000 апдейтов по тем же правилам.
Причем обновляем случайные записи на множестве от1 до 1 000 000.

у меня 29 сек.
Вот код.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Upd(m= 100 ) 
 set max=m
 set min= 1 
 //kill ^Zap
 set t=$zh
 set i= 0 
 //set ^Zap(i)= 1 
 do {
	 set i=i+ 1 
	 set ^Zap($r(max))=^Zap($r(max))+^Zap($r(max))+^Zap($r(max))
 }while i<max
 
 set t1=$zh
 w !,"i=",i
 w !,"time=",t1-t 
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36553946
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1:20

давайте чего-нибудь без случайных чисел :)
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36553953
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
например запись содержит три ссылки на записи с суммой
надо подсчитать общую сумму всех сумм из трёх полей
Код: plaintext
1.
2.
3.
4.
select sum(t1.m+t2.m+t3.m)
 from #t t
 join #t t1 on t1.id=t.s1
 join #t t2 on t2.id=t.s2
 join #t t3 on t3.id=t.s3
0:05
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36554206
AlexKB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SergSuper,

Согласен, ряд моментов вносит деструктив в чистоту собственно эксперимента.
Эти моменты, считаю не столь значимые, чтобы на них зацикливаться.
Экспериментом является скорость работы движка СУБД по записи и чтению регулярного потока данных. А способы реализации отдельных функций в различных системах могут вносить большую погрешность в само измерение, поскольку разработчики не должны удовлетворять наши с Вами прихоти - у них другие цели. Вот если бы заталкивать случайный поток данных из внешнего окружения, одинаковый к Вам и ко мне, тогда можно было бы и сравнивать.

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

Насколько я понял необходимо подсчитать сумму из трех слагаемых на всем множестве данных, где каждая запись хранит кроме собственно данных еще и три индекса по которым нужно читать сами данные. Индексы случайным образом распределены в диапазоне от 1 до 1 000 000
Количество записей тоже 1 000 000.

Вы за 5 сек выполнили весь подсчет.

Если я неправильно понял задачу, то поправьте.
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36554753
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, так
у Вас должно получится быстрее
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36555384
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вставка с учётом ранее введённых данных
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
Class del.e Extends %Persistent
{

Property Value As %BigInt(MINVAL =  1 ) [ InitialExpression =  1 , Required ];

ClassMethod FillSQL(ACount As %Integer = {1e3}) As %Status
{
 set t1 = $ZHOROLOG
 do ##class(del.e).%KillExtent()
 set ^del.eD = - 1  ;первичный ключ начинаем с  0 
 do DISABLE^%NOJRN ;отключаем для сессии журналирование
 ;TSTART
 &sql(insert into del.e default values)
 for i =  1 : 1 :ACount- 1  {
   set id1 = $random(i)
   set id2 = $random(i)
   set id3 = $random(i)
  
   &sql(select %NOLOCK Value into :val1 from del.e where %ID=:id1)
   &sql(select %NOLOCK Value into :val2 from del.e where %ID=:id2)
   &sql(select %NOLOCK Value into :val3 from del.e where %ID=:id3)
   &sql(insert %NOCHECK %NOLOCK %NOINDEX %NOTRIGGER into del.e(Value) values(:val1+:val2+:val3))

   ; или &sql(insert into del.e(Value) select sum(Value) from del.e where %ID in (:id1,:id2,:id3))
    
 }
 do ENABLE^%NOJRN
 ;TCOMMIT
 write "Ввод данных = ",($ZHOROLOG - t1)," с.",!
 quit $$$OK
}

ClassMethod FillDirect(ACount As %Integer = {1e3}) As %Status
{
 set time = $ZHOROLOG
 do ##class(del.e).%KillExtent()
 ;do DISABLE^%NOJRN
 TSTART
 
 set ^del.eD( 0 ) = $ListBuild("", 1 )
 for i =  1 : 1 :ACount- 1  {

   s ^del.eD(i) = $lb("",$li(^del.eD($r(i)), 2 ) + $li(^del.eD($r(i)), 2 ) + $li(^del.eD($r(i)), 2 ))

   /* или
   set id1 = $random(i)
   set id2 = $random(i)
   set id3 = $random(i)
   set val1 = $list(^del.eD(id1),2)
   set val2 = $list(^del.eD(id2),2)
   set val3 = $list(^del.eD(id3),2)
   set ^del.eD(i) = $ListBuild("",val1 + val2 + val3)
   */
 }
 set ^del.eD = ACount- 1 
 ;do ENABLE^%NOJRN
 TCOMMIT
 write "Ввод данных = ",($ZHOROLOG - time)," с.",!
 quit $$$OK
}
}
Результаты:
Код: plaintext
1.
2.
FillSQL(1e6):  28 . 7  с. -  30 . 1  с. (без транзакции/журналирования - с транз./журнал.)
FillDirect(1e6):  12 . 4  с. -  12 . 8  с. (без транз./журнал. - с транз./журнал.)

Подсчёт общей суммы
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
Class del.f Extends %Persistent
{

Property m As %BigInt [ Required ];

Property s1 As del.f [ Required ];

Property s2 As del.f [ Required ];

Property s3 As del.f [ Required ];

ClassMethod Fill(
  ACount As %Integer = {1e6},
  ARnd As %Boolean =  0 ) As %Status
{
 set time = $ZHOROLOG
 do ##class(del.f).%KillExtent()
 do DISABLE^%NOJRN
 set ^del.fD = - 1 
 if ARnd =  0  {
   for i =  0 : 1 :ACount- 1  {
     set ^del.fD(i) = $listbuild("",i+ 1 ,i,i,i)
   }
 } else {
   for i =  0 : 1 :ACount- 1  {
     set ^del.fD(i) = $listbuild("",i+ 1 ,$random(ACount),$random(ACount),$random(ACount))
   }
 }
 set ^del.fD = ACount- 1 
 do ENABLE^%NOJRN
 write "Ввод данных = ",($ZHOROLOG - time)," с.",!
 quit $$$OK
}

/// Хранимая процедура SPQuery1 равнозначна SPQuery2, но удобней в написании благодаря объектному расширению SQL
Query SPQuery1() As %SQLQuery(ROWSPEC="Результат:%BigInt") [SqlProc]
{
  SELECT sum(s1->m + s2->m + s3->m) FROM del.f
}

Query SPQuery2() As %SQLQuery(ROWSPEC="Результат:%BigInt") [SqlProc]
{
  SELECT sum(t1.m + t2.m + t3.m)
  from del.f t
  join del.f t1 on t1.id = t.s1
  join del.f t2 on t2.id = t.s2
  join del.f t3 on t3.id = t.s3
}

ClassMethod SPQuery3() As %BigInt [SqlProc]
{
  set result =  0 
  for i =  0 : 1 :^del.fD {
    set s1 = $list(^del.fD(i), 3 )
    set s2 = $list(^del.fD(i), 4 )
    set s3 = $list(^del.fD(i), 5 )
    set m1 = $list(^del.fD(s1), 2 )
    set m2 = $list(^del.fD(s2), 2 )
    set m3 = $list(^del.fD(s3), 2 )
    set result = result + m1 + m2 + m3
  }
  quit result
}
}
Результаты:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
TEST>d ##class(del.f).Fill()
Ввод данных = . 459627  с.

call del.f_SPQuery1():  5 . 7  с.
select del.f_SPQuery3() from del.f where id= 0 :  1 . 8  с.

TEST>d ##class(del.f).Fill(, 1 )
Ввод данных =  2 . 526582  с.

call del.f_SPQuery1():  16 . 8  с.
select del.f_SPQuery3() from del.f where id= 0 :  12  с.
Возможно, у меня жесткий диск медленно выполняет random access.
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #36556298
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Немного удалось улучшить результат, распараллелив запрос в несколько потоков, вернее процессов:
Распараллеленный запрос
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
...
ClassMethod SPQuery3(nThread As %Integer(VALUELIST=",1,2,4,5,8,10") =  2 ) As %BigInt [ SqlProc ]
{
  quit:($listfind($listbuild( 1 , 2 , 4 , 5 , 8 , 10 ),nThread)= 0 ) - 1 
  kill ^CacheTempUser($job)

  set result= 0 ,k=^del.fD+ 1 \nThread
  
  for i= 1 : 1 :nThread job ..Thread(i- 1 *k,i*k- 1 ,i,$job)

  for i= 1 : 1 :nThread {
    for  quit:$data(^CacheTempUser($job,i))
    set result=result+^CacheTempUser($job,i)
  }

  quit result
}

ClassMethod Thread(i1,i2,n,j) [ServerOnly =  1 ]
{
  set result= 0 
  for i=i1: 1 :i2 set result=result+$li(^del.fD($li(^del.fD(i), 3 )), 2 )+$li(^del.fD($li(^del.fD(i), 4 )), 2 )+$li(^del.fD($li(^del.fD(i), 5 )), 2 )
  // или &sql(select sum(s1->m + s2->m + s3->m) into :result FROM del.f where %ID between :i1 and :i2)
  set ^CacheTempUser(j,n)=result
}
...
Результат:
Код: plaintext
select del.f_SPQuery3( 8 ) from del.f where id= 0 :  7 . 9  с.
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #37043837
Alexander Ryndin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oracle 11R2:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
 declare
    numrec number := 100000 ;
    type tab_type is table of number;
    tab1 tab_type:=tab_type();
    tab2 tab_type:=tab_type();
    tab3 tab_type:=tab_type();
BEGIN
    tab1.extend(numrec);
    tab2.extend(numrec);
    tab3.extend(numrec);
    for ii in  1 ..numrec loop
    tab1(ii):=( 1000  + ii) mod  10000 ;
    tab2(ii):=( 1002  + ii) mod  10000 ;
    tab3(ii):=( 1010   + ii) mod  10000 ;
   end loop;
    forall ii in  1 ..numrec
          INSERT INTO TestA (a,b,c) VALUES (tab1(ii),tab2(ii),tab3(ii));
    commit;
END;
/

PL/SQL procedure successfully completed.
Elapsed: 00:00:00.34
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #37045520
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander Ryndin,

Там была опечаточка к коде: numrec number :=100000 1000000;
И Все измерения я проводил в виртуалке. Скорость в ней падает вдвое (минимум).
Причем на обычном ноуте среднего класса, а не продакшн сервере )
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #37045891
Alexander Ryndin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglAlexander Ryndin,

Там была опечаточка к коде: numrec number :=100000 1000000;
И Все измерения я проводил в виртуалке. Скорость в ней падает вдвое (минимум).
Причем на обычном ноуте среднего класса, а не продакшн сервере )У меня обычный офисный ноут. Настройки Oracle по default - наверняка еще что-то можно подтюнить. С исправленным результатом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
 declare
    numrec number := 1000000 ;
    type tab_type is table of number;
    tab1 tab_type:=tab_type();
    tab2 tab_type:=tab_type();
    tab3 tab_type:=tab_type();
BEGIN
    tab1.extend(numrec);
    tab2.extend(numrec);
    tab3.extend(numrec);
    for ii in  1 ..numrec loop
    tab1(ii):=( 1000  + ii) mod  10000 ;
    tab2(ii):=( 1002  + ii) mod  10000 ;
    tab3(ii):=( 1010   + ii) mod  10000 ;
   end loop;
    forall ii in  1 ..numrec
          INSERT INTO TestA (a,b,c) VALUES (tab1(ii),tab2(ii),tab3(ii));
    commit;
END;
/
PL/SQL procedure successfully completed.

Elapsed: 00:00:03.15
...
Рейтинг: 0 / 0
Быстрое создание записей в БД
    #37050122
Фотография Apex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglAlexander Ryndin,

Там была опечаточка к коде: numrec number :=100000 1000000;
И Все измерения я проводил в виртуалке. Скорость в ней падает вдвое (минимум).
Причем на обычном ноуте среднего класса, а не продакшн сервере )
Ты прикалываешься? Результаты продакшн-серверов здесь .
...
Рейтинг: 0 / 0
57 сообщений из 57, показаны все 3 страниц
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Быстрое создание записей в БД
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]