Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Быстрое создание записей в БД  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6632
Сделал простой тест
Вставка в таблицу поля (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 (Он при работе все время обращается к винту) ?
24 сен 09, 14:14    [7703178]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
автор
Сделал простой тест
Вставка в таблицу поля (a,b,c: integer) 1 000 000 записей


Записи можно вставлять по разному... Покажите, хотябы, как Вы дедали это для MS SQL.
24 сен 09, 14:25    [7703289]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
и снова здравствуйте, Рыцарь Печального Образа

P.S. Побег за попкорном
24 сен 09, 14:39    [7703420]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67378
Блог
Siemargl
Сделал простой тест

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

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

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

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

Стеклянный шар советует проверить autocommit :)

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

Да, ещё один маленький комментарий.

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?
24 сен 09, 14:43    [7703457]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
softwarer
Siemargl
У меня вопрос - почему такое отставание MSSQL (Он при работе все время обращается к винту) ?

Стеклянный шар советует проверить autocommit :)
Тоже про это подумалось. Про постоянное обращение к диску - он родимый. Сравниваем:
  372406 мс - с autocommit
  109844 мс - с 1 явной 1 транзакцией
Ну и нельзя не проверить "наше все"
5734 мс - BULK INSERT
Ну и до кучи:
+
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
12296 мс
24 сен 09, 15:18    [7703774]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
Надо еще и FB испытать. А то мужики не поймут...
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
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
24 сен 09, 15:34    [7703921]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
Dmitry Arefiev
Member

Откуда:
Сообщений: 9993
Куда, что и кто еще вставлять будет ?
24 сен 09, 16:01    [7704144]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
Dmitry Arefiev
Куда, что и кто еще вставлять будет ?
Да ты только идею подай!..

Имхо, автору достаточно наглядно показали, что сравнивать сферический insert в вакууме - дело неблагодарное.
24 сен 09, 16:05    [7704179]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
Dmitry Arefiev
Member

Откуда:
Сообщений: 9993
Senya_L
insert

Да может там не insert, а alter table add column ("Вставка в таблицу поля"),
а в таблице 1M записей :)
24 сен 09, 16:11    [7704231]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
Игорь Горбонос
Member

Откуда: Днепропетровск
Сообщений: 4236

> Автор: Senya_L
> Надо еще и FB испытать. А то мужики не поймут...

Семён, а если так:
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

24 сен 09, 16:44    [7704490]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Игорь Горбонос,

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

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

(1000000 row(s) affected)

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

тока оно зачем?!
24 сен 09, 16:48    [7704514]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6632
Да процедуру я не показал
Она в приципе почти копия как у 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? Вот процедура:

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;
24 сен 09, 17:20    [7704822]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
miksoft
Member

Откуда:
Сообщений: 38918
Siemargl
Возможно можно улучшить ORACLE?
Может, тоже коммитить попробовать?
24 сен 09, 17:22    [7704845]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Siemargl
Порядок времени исполнения почти выровнялся. Возможно можно улучшить ORACLE? Вот процедура:

declare              
     numrec number :=10000;             
END;

чо за фигня?
24 сен 09, 17:24    [7704866]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
Yo.!
Guest
Siemargl


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

вот так нуна:

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

24 сен 09, 18:23    [7705269]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6632
Yo.!,
это трик, не совсем честный по логике.
Кроме того, рекурсия - дорогое удовольствие и у меня, например, по памяти не проходит.


ORA-04031: unable to allocate 44 bytes of shared memory ("large pool","unknown object","kxs-heap-w","cursor work heap")
24 сен 09, 19:21    [7705495]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34709

Siemargl wrote:

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

Я думаю, тут дело в неверных замерах.
А в случае кэша -- возможно и непонимание
того, что он делает, и эквивалентность этого
тому, что делают другие СУБД (я например
не понимаю этого. Ты понимаешь ?)

Posted via ActualForum NNTP Server 1.4

24 сен 09, 19:35    [7705532]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34709

Siemargl wrote:

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

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

Posted via ActualForum NNTP Server 1.4

24 сен 09, 19:38    [7705544]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
Yo.!
Guest
Siemargl
Yo.!,
это трик, не совсем честный по логике.

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

Siemargl

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


дефолтной инсталяции oracle xe памяти хватает, нефиг лезть в настройки не обладая хотя бы минимальной квалификацией ...
24 сен 09, 19:51    [7705567]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6632
Yo.!,
Инсталляция почти дефолтная, крутить ничего не надо было для тест-системы.
Изменена только ALTER SYSTEM SET SHARED_POOL_SIZE='100M' SCOPE=spfile;
по инструкции к apex v3

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

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


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

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

С индексами структура еще усложнится, и не нужны они (пока и так не совем понятно что происходит).
24 сен 09, 20:18    [7705638]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
MasterZiv

Siemargl wrote:

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

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

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

И что за мания сравнивать скорость вставки тупо создав программный цикл на сервере? Задача сервера БД - обслуживать клиентские запросы (простите уж за банальности, они для автора :)), а оценивать скорость вставки по запросам, как все мои выше указанные - это полная фигня. Я-то хоть проикалывался
24 сен 09, 20:23    [7705651]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
Fox5631
Guest
Visual Foxpro 9

T1=SECONDS()
FOR i=1 TO 1000000
   INSERT INTO Ttt (a,b,c) VALUES (i,i,i)
NEXT

T2=SECONDS()
? T2-T1

2.703
24 сен 09, 20:30    [7705661]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
Yo.!
Guest
Siemargl
Yo.!,
Инсталляция почти дефолтная, крутить ничего не надо было для тест-системы.
Изменена только ALTER SYSTEM SET SHARED_POOL_SIZE='100M' SCOPE=spfile;
по инструкции к apex v3

брехня.
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
А остальным что? Админ БД побьет, если поймает.

гнать таких админов на пенсию, в крайнем случае, если где-то сохранилось, в зад на кашу...
24 сен 09, 20:33    [7705668]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
автор
С индексами структура еще усложнится, и не нужны они


Можно я буду Вас цитировать???
24 сен 09, 20:46    [7705707]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
Dmitry Arefiev
Member

Откуда:
Сообщений: 9993
Yo.!
Siemargl
И не надо страдать манием величия (запроса) - единственным запросом выгребая тучу памяти.

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

В районе 5т-10т записей на батч (зависит от <длинный список 1>) перестает существенно
расти производительность. Заключать всю "нарезку" или только один батч в транзакцию
зависит больше <длинный список 2>. Первый и второй списки слабо пересекаются ...
Так что - кто как порежет. А кто и одной кучей.
24 сен 09, 21:16    [7705748]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Сравнение СУБД Ответить