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

Откуда: Харьков, Украина
Сообщений: 62034
Когда мне понадобится быстро сохранить массив целых чисел - я приду к М.
21 май 10, 12:08    [8812487]     Ответить | Цитировать Сообщить модератору
 Re: Выбор СУБД. Нужна очень быстрая вставка.  [new]
g-u-e-s-t
Guest
Любая вменяемая БД всосет 100000 записей за секунду.
Все остальное зависит от кривизны рук разработчика и обвязки.

postgres@localhost:/tmp> psql -c 'SELECT version()'
version
------------------------------------------------------------------------------------------------------------------------
PostgreSQL 8.4.3 on i686-pc-linux-gnu, compiled by GCC gcc (SUSE Linux) 4.4.1 [gcc-4_4-branch revision 150839], 32-bit
(1 row)

postgres@localhost:/tmp> psql -c 'drop table if exists test_copy;'
DROP TABLE
postgres@localhost:/tmp> psql -c 'create table test_copy (id bigserial not null, temp_data text, constraint pk_test_copy primary key (id));'NOTICE: CREATE TABLE will create implicit sequence "test_copy_id_seq" for serial column "test_copy.id"
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "pk_test_copy" for table "test_copy"
CREATE TABLE
postgres@localhost:/tmp> psql -c "copy (select s, (random()*1000000)::text||'-'||random()*1000000||'-'||random()*1000000||'-'||random()*1000000||'-'||random()*1000000||'-'||random()*1000000||'-'||random()*1000000||'-'||random()*1000000||'-'||random()*1000000||'-'||random()*1000000 from generate_series(1, 100000) as s) to '/tmp/test_copy'"
COPY 100000
postgres@localhost:/tmp> ls -l /tmp/test_copy
-rw-r--r-- 1 postgres postgres 17477878 Май 21 11:27 /tmp/test_copy
postgres@localhost:/tmp> time psql -c "copy test_copy (id, temp_data) from '/tmp/test_copy';"
COPY 100000

real 0m0.466s
user 0m0.001s
sys 0m0.001s
postgres@localhost:/tmp> time psql -c "select count(*) from test_copy;"
count
--------
100000
(1 row)


real 0m0.019s
user 0m0.000s
sys 0m0.002s
postgres@localhost:/tmp>

21 май 10, 12:34    [8812794]     Ответить | Цитировать Сообщить модератору
 Re: Выбор СУБД. Нужна очень быстрая вставка.  [new]
-Serg-
Member

Откуда:
Сообщений: 47
g-u-e-s-t
Любая вменяемая БД всосет 100000 записей за секунду.

а если не 100.000, а 1.000.000 ?
21 май 10, 16:55    [8815617]     Ответить | Цитировать Сообщить модератору
 Re: Выбор СУБД. Нужна очень быстрая вставка.  [new]
g-u-e-s-t
Guest
-Serg-
А 100 000 000 000 ...
Торг не уместен.
Вы вначале получите 1000000 полезных данных, обработайте их, посмотрите на затраченное время, а потом думайте с какой скоростью Вам нужна вставка.

postgres@localhost:~> psql -c 'drop table if exists test_copy;'
DROP TABLE
postgres@localhost:~> psql -c 'create table test_copy (id bigserial not null, temp_data text, constraint pk_test_copy primary key (id));'
NOTICE: CREATE TABLE will create implicit sequence "test_copy_id_seq" for serial column "test_copy.id"
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "pk_test_copy" for table "test_copy"
CREATE TABLE
postgres@localhost:~> psql -c "copy (select s, (random()*1000000)::text||'-'||random()*1000000||'-'||random()*1000000||'-'||random()*1000000||'-'||random()*1000000||'-'||random()*1000000||'-'||random()*1000000||'-'||random()*1000000||'-'||random()*1000000||'-'||random()*1000000 from generate_series(1, 1000000) as s) to '/tmp/test_copy'"
COPY 1000000
postgres@localhost:~> ls -l /tmp/test_copy
-rw-r--r-- 1 postgres postgres 175776592 Май 21 16:50 /tmp/test_copy
postgres@localhost:~> time psql -c "copy test_copy (id, temp_data) from '/tmp/test_copy';"
COPY 1000000

real 0m5.324s
user 0m0.002s
sys 0m0.001s
postgres@localhost:~> time psql -c "select count(*) from test_copy;"
count
---------
1000000
(1 row)

real 0m0.461s
user 0m0.003s
sys 0m0.001s
postgres@localhost:~>
p.s.
Все тесты проводились на обычной домашней тачке.
качалки, торренты, дц++, не отключались.
21 май 10, 18:03    [8816218]     Ответить | Цитировать Сообщить модератору
 Re: Выбор СУБД. Нужна очень быстрая вставка.  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
locky
Когда мне понадобится быстро сохранить массив целых чисел - я приду к М.


И напрасно. Они там строки сохраняют :)
21 май 10, 20:39    [8816773]     Ответить | Цитировать Сообщить модератору
 Re: Выбор СУБД. Нужна очень быстрая вставка.  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Gluk (Kazan)
locky
Когда мне понадобится быстро сохранить массив целых чисел - я приду к М.


И напрасно. Они там строки сохраняют :)

ну, это я знаю.
Я к тому, что скорость генерации списка интов это конечно круто... но задлянахрена?
на случай, если кто-то забудет устный счет от нуля до фиг-знает-скольки?
22 май 10, 00:19    [8817486]     Ответить | Цитировать Сообщить модератору
 Re: Выбор СУБД. Нужна очень быстрая вставка.  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
locky
Gluk (Kazan)
locky
Когда мне понадобится быстро сохранить массив целых чисел - я приду к М.


И напрасно. Они там строки сохраняют :)

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


то верно :)
22 май 10, 11:35    [8817945]     Ответить | Цитировать Сообщить модератору
 Re: Выбор СУБД. Нужна очень быстрая вставка.  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 13741
-Serg-
Откуда 2 сек то берутся.

Терминалу не прикажешь...

-Serg-
p.s. используй вместо $p($h,",",2) просто $zh

Всенепременно!
22 май 10, 18:36    [8818670]     Ответить | Цитировать Сообщить модератору
 Re: Выбор СУБД. Нужна очень быстрая вставка.  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 13741
locky
Когда мне понадобится быстро сохранить массив целых чисел - я приду к М.

Напиши что тебе еще сохранить - потестим и это. Так глядишь и окажешся у нас быстрее.
22 май 10, 18:37    [8818671]     Ответить | Цитировать Сообщить модератору
 Re: Выбор СУБД. Нужна очень быстрая вставка.  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
krvsa
locky
Когда мне понадобится быстро сохранить массив целых чисел - я приду к М.

Напиши что тебе еще сохранить - потестим и это. Так глядишь и окажешся у нас быстрее.

Пасибо
Я расстался с М в... 1996(?) году.
Обратно не тянет.
22 май 10, 22:14    [8819041]     Ответить | Цитировать Сообщить модератору
 Re: Выбор СУБД. Нужна очень быстрая вставка.  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 13741
locky, тогда зачем юродствовать?
25 май 10, 08:06    [8826989]     Ответить | Цитировать Сообщить модератору
 Re: Выбор СУБД. Нужна очень быстрая вставка.  [new]
спит
Guest
Спасибо за ответы.

В общем, алгоритм вставки такой:
1) Для теста вытаскиваем данные из файла. К примеру, вытаскиваем из Wav файла и формируем массив сигналов.
2) Вставляем эти данные в БД в виде
insert temp (iTimeTicks, iChannel, iValue) ({0},{1},{2})

Минута звукового файла с частотой 44К вставляется около получаса. СУБД - oracle 11g r2.
25 май 10, 11:18    [8828133]     Ответить | Цитировать Сообщить модератору
 Re: Выбор СУБД. Нужна очень быстрая вставка.  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6633
спит,

А что с ними дальше делать, по чем индексы нужны?
25 май 10, 12:29    [8828879]     Ответить | Цитировать Сообщить модератору
 Re: Выбор СУБД. Нужна очень быстрая вставка.  [new]
DPH3
Guest
спит

Минута звукового файла с частотой 44К вставляется около получаса. СУБД - oracle 11g r2.


Э, код в студию. А то судя по скорости, запускается задача на стареньком ноуте, каждая запись вставляется в отдельной транзакции, да еще и общий sequence без кэширования.
25 май 10, 12:31    [8828890]     Ответить | Цитировать Сообщить модератору
 Re: Выбор СУБД. Нужна очень быстрая вставка.  [new]
servit
Member

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

В общем, алгоритм вставки такой:
1) Для теста вытаскиваем данные из файла. К примеру, вытаскиваем из Wav файла и формируем массив сигналов.
2) Вставляем эти данные в БД в виде
insert temp (iTimeTicks, iChannel, iValue) ({0},{1},{2})

Минута звукового файла с частотой 44К вставляется около получаса. СУБД - oracle 11g r2.

(Сore 2 Duo 2.66MHz, 2Gb)
В СУБД Caché 3000000 записей из программы на Java записываются за 40с., используя "eXTreme dynamic object API" и за 287с. - используя JDBC.
+ Код

Class temp.wav Extends %Persistent
{
  Property iTimeTicks As %Integer;

  Property iChannel As %Integer;

  Property iValue As %Integer;
}
import java.sql.*;
import com.intersys.extreme.*;
import com.intersys.mds.jni.MDSUtilsJNI;

class XTWave {

   public static void main(String[] args)
   {
      String url = "jdbc:Cache://SPCHOST:1972/TEST";
      String user = "_system";
      String password = "SYS";
      
      Connection jdbcConnection = null;
      XTDatabaseConnection dbConn = null;
      try {
         Class.forName ("com.intersys.jdbc.CacheDriver");
         jdbcConnection = DriverManager.getConnection(url,user,password);
         
         // Then create and connect an XTDatabaseConnection
         
         dbConn = XTDatabaseConnectionFactory.createJNIDatabaseConnection();
         dbConn.connect("TEST", user, password);
         
         // Get numeric ids of properties to facilitate faster getters and setters

         XTDynamicObject obj = dbConn.createNew("temp.wav");
         int iTimeTicksId = obj.getPropertyNumber("iTimeTicks");
         int iChannelId = obj.getPropertyNumber("iChannel");
         int iValueId = obj.getPropertyNumber("iValue");
         obj.cleanup();
         
         int start = MDSUtilsJNI.getCurrentMs();

         //dbConn.startTransaction();
         for (int i = 0; i < 3000000; i++) {
             obj = dbConn.createNew("temp.wav");
             obj.set(iTimeTicksId, i);
             obj.set(iChannelId, i);
             obj.set(iValueId, i);

             obj.save();
             obj.cleanup();
         }
         //dbConn.commit();

         int end = MDSUtilsJNI.getCurrentMs();
         int secs = (end - start) / 1000;
         int ms = (end - start) % 1000;
         System.out.println("Finished, elapsed time " + secs + " seconds, " + ms + " ms.");

      }
      catch (XTException e)
      {
         System.out.println("Caught XTException: " + e.getMessage());
      }
      catch (Exception e)
      {
         System.out.println("Caught Exception: " + e.getMessage());
      }
      finally
      {
         System.out.println("Ending session.");
         try {
            if (dbConn != null)
               dbConn.disconnect();
            if (jdbcConnection != null)
               jdbcConnection.close();
         }
         catch (Exception e)
         {
            System.out.println("When disconnecting, caught Exception: " + e.getMessage());
         }
      }
   }
}

PS: если обработку файла производить средствами самой СУБД, общая скорость будет выше.
25 май 10, 15:17    [8830867]     Ответить | Цитировать Сообщить модератору
 Re: Выбор СУБД. Нужна очень быстрая вставка.  [new]
servit
Member

Откуда: г. Кишинёв, Республика Молдова
Сообщений: 3148
Блог
Если код немного улучшить, то время уменьшается с 40с. до 25с.
+ Улучшенный код

...
obj = dbConn.createNew("temp.wav");
for (int i = 0; i < 3000000; i++) {
    obj.set(iTimeTicksId, i);
    obj.set(iChannelId, i);
    obj.set(iValueId, i);

    obj.insert();
}
obj.cleanup();
...
25 май 10, 16:49    [8831876]     Ответить | Цитировать Сообщить модератору
 Re: Выбор СУБД. Нужна очень быстрая вставка.  [new]
правильный емайл
Member

Откуда:
Сообщений: 1565
servit,

ужос какой, если уж очень хотите средствами jdbc без использования утилит прямой загрузки(sql*loader) то как вариант использование хранимки которая на вход принимает масивы с данными и вставляет через forall
25 май 10, 18:22    [8832871]     Ответить | Цитировать Сообщить модератору
 Re: Выбор СУБД. Нужна очень быстрая вставка.  [new]
правильный емайл
Member

Откуда:
Сообщений: 1565
ещё вот это почитай

http://download-west.oracle.com/docs/cd/B10501_01/java.920/a96654/oraperf.htm#1056502
25 май 10, 18:26    [8832922]     Ответить | Цитировать Сообщить модератору
 Re: Выбор СУБД. Нужна очень быстрая вставка.  [new]
servit
Member

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

Я с Oracle не работаю, а вот топикстартеру (спит) Ваша ссылка может пригодиться.
25 май 10, 18:33    [8832980]     Ответить | Цитировать Сообщить модератору
 Re: Выбор СУБД. Нужна очень быстрая вставка.  [new]
правильный емайл
Member

Откуда:
Сообщений: 1565
servit,

упс, сори перепутал думал думал эт просто обёртка собственая)
25 май 10, 18:38    [8833021]     Ответить | Цитировать Сообщить модератору
 Re: Выбор СУБД. Нужна очень быстрая вставка.  [new]
Yo.!
Guest
имхо передавать массив в pl/sql процедуру быстрее должно получиться.
25 май 10, 18:53    [8833111]     Ответить | Цитировать Сообщить модератору
 Re: Выбор СУБД. Нужна очень быстрая вставка.  [new]
Alexey Kuznetsov
Member

Откуда: Krasnoyarsk
Сообщений: 1141
servit
Если код немного улучшить, то время уменьшается с 40с. до 25с.
код поскипан


если используете Jdbc, то для ускорения необходимо еще заюзать Batch (пакетный) режим.
Размер пакета выбрать где-то 100-500.
из моей практики массовой вствки в DB2 переход на пакетную вствку давал ускорение в 10 раз.
ну и comit надо каждые 1000 делать, что бы транзакционый лог не деградировал.

у меня таким макаром 2 млн записей из dbf грузятся в БД за 8-10 сек на средненькой тачке.
25 май 10, 21:55    [8833377]     Ответить | Цитировать Сообщить модератору
 Re: Выбор СУБД. Нужна очень быстрая вставка.  [new]
servit
Member

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

Пример с JDBC был приведён лишь для сравнения со специализированным интерфейсом.
В пакетном (по 500) режиме время уменьшается с 287с. до 70с.

PS: для нативной работы с dbf (чтение, запись) в Caché есть соответствующий класс, входящий в Прототип-6.
26 май 10, 10:15    [8834537]     Ответить | Цитировать Сообщить модератору
 Re: Выбор СУБД. Нужна очень быстрая вставка.  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
Хватит уже томить всех пустыми разговорами. Давайте сформулируем DDL таблицы для вставки, правила вставки (BULK или не BULK) и будем тесты проводить.
26 май 10, 21:53    [8841221]     Ответить | Цитировать Сообщить модератору
 Re: Выбор СУБД. Нужна очень быстрая вставка.  [new]
AAron
Member

Откуда: Москва
Сообщений: 4324
Senya_L,

+1

а то массовая вставка нормальными ETL позволяет вливать и 100К, и 1млн в секунду...
26 май 10, 22:18    [8841277]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4 5 6   вперед  Ctrl      все
Все форумы / Сравнение СУБД Ответить