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

Откуда: 010100
Сообщений: 6645
Yo.!,
Поправьте меня, но ваша команда set sga sga_target без SCOPE действует только до перезапуска БД.
Что и видно при старте, что ее 128М =)

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


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

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

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

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

Так что для меня тема закрыта. Всем сочувствовавшим спасибо.
24 сен 09, 22:06    [7705852]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
кстати
Guest
Fox5631


Респект и уважение!
24 сен 09, 23:30    [7706048]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
Yo.!
Guest
Siemargl
Yo.!,
Поправьте меня, но ваша команда set sga sga_target без SCOPE действует только до перезапуска БД.
Что и видно при старте, что ее 128М =)


в данном случае не важно, 28 мб никакой роли не играют:
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, которая используется для рекурсии, совсем не резиновая в мультиюзер.
Нечего демагогию разводить.

с чего ты решил, что этот запрос съест сколько нибудь заметное кол-во памяти ?
25 сен 09, 01:19    [7706192]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Siemargl
Цитировать можно, но полностью и без отрыва от контекста, который есть "в данном случае"


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


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


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


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


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

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


Упс... А где, собственно то задача???
25 сен 09, 08:57    [7706538]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
vadiminfo
Member

Откуда: Обнинск
Сообщений: 4802
Siemargl

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

Как представляется по предшествующим постам, существуют риски определение "подходимости" инструмента "под задачу" может оказаться более сложной задачей, чем исходная типа задача. По крайней мере, для некоторых задачерешателей. Потому все еще стоит рассмотреть более принятый подход: выбрать инструмент "под как моно больше задач" раз и на долго. По крайней мере, если идет речь о "задачах", "над" которыми ожидается инструмент типа СУБД.
26 сен 09, 01:16    [7710942]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
vadiminfo
Потому все еще стоит рассмотреть более принятый подход: выбрать инструмент "под как моно больше задач" раз и на долго.


Fox имеешь в виду ? ;)
28 сен 09, 07:41    [7713615]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6645
А вот еще результат к размышлению. Берем NHibernate 2.1, тот же SQL2005 express и миллион объектов.

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

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


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


            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");
2 окт 09, 01:19    [7732306]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
Толстый_Троль
Member [заблокирован]

Откуда:
Сообщений: 33
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
23 мар 10, 14:27    [8519752]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6645
Толстый_Троль

Неплохо. У меня 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сек
23 мар 10, 14:54    [8520017]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6645
А теперь тесты Кэтрин

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

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

Код
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();

23 мар 10, 15:07    [8520147]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
Siemargl
А теперь тесты Кэтрин

это что? новый TJ7 ?
23 мар 10, 16:07    [8520771]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 32912

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

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

Откуда: 010100
Сообщений: 6645
SergSuper,

Ответы в топике по ней же
23 мар 10, 16:29    [8520988]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3148
Блог
Siemargl,

+ Код

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:
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: если Вы делали тест на однопользовательской версии, то в ней ограничен кэш базы данных.
24 мар 10, 14:49    [8526033]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6645
Дополнение
SQLite 3.6.23

4,095 сек

+
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>
29 мар 10, 10:16    [8546495]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
AlexKB
Member

Откуда: Запорожье
Сообщений: 856
Siemargl
Yo.!,
Поправьте меня, но ваша команда set sga sga_target без SCOPE действует только до перезапуска БД.
Что и видно при старте, что ее 128М =)

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


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

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

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

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

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


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

1. Требуется создать 1 000 000 записей.
2. Каждая запись имеет уникальный индекс целого типа.
3. Содержание записи является суммой трех слагаемых.
4. Каждое слагаемое есть результат вычитки из уже созданных записей по индексу,находящемуся в диапазоне от 1 до до индекса последней записи, взятого случайным образом.
5. Самая первая запись может иметь значение равное единице.
30 мар 10, 19:48    [8555702]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
AlexKB
Member

Откуда: Запорожье
Сообщений: 856
Что-то "тестеры-теоретики" притихли, или страшно даже затевать подобный эксперимент.
Я вот попробовал на бытовой "железяке", купленной пять лет назад, и получил примерно 24 секунды.
Cache 2009.1
31 мар 10, 15:24    [8559771]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
п.4 не поясните? что такое "вычитка"? и как понять "до индекса последней записи, взятого случайным образом"?
31 мар 10, 16:14    [8560218]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
AlexKB
Member

Откуда: Запорожье
Сообщений: 856
SergSuper,

Каждое слагаемое суммы, есть уже записанное значение в БД (его необходимо прочитать).
Место хранения такого слагаемого определяется индексом записи.
Если уже было произведено 100 000 записей, то слагаемое может находиться в любой из этих записей от 1 до 100 000. Конкретное значение индекса для каждого слагаемого определяется случайным образом в этом диапазоне.
31 мар 10, 16:53    [8560523]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
AlexKB
Member

Откуда: Запорожье
Сообщений: 856
SergSuper,

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

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
31 мар 10, 17:53    [8560966]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
плохо MS SQL со случайными числами работает, выглядит некрасиво
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
двухядерный офисный нотебук
31 мар 10, 18:39    [8561142]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
AlexKB
Member

Откуда: Запорожье
Сообщений: 856
SergSuper,

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

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

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 
31 мар 10, 19:40    [8561330]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
1:20

давайте чего-нибудь без случайных чисел :)
31 мар 10, 20:02    [8561382]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
например запись содержит три ссылки на записи с суммой
надо подсчитать общую сумму всех сумм из трёх полей
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
31 мар 10, 20:10    [8561398]     Ответить | Цитировать Сообщить модератору
 Re: Быстрое создание записей в БД  [new]
AlexKB
Member

Откуда: Запорожье
Сообщений: 856
SergSuper,

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

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

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

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

Если я неправильно понял задачу, то поправьте.
31 мар 10, 23:57    [8561930]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Сравнение СУБД Ответить