powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Выбор СУБД. Нужна очень быстрая вставка.
25 сообщений из 129, страница 2 из 6
Выбор СУБД. Нужна очень быстрая вставка.
    #36641122
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда мне понадобится быстро сохранить массив целых чисел - я приду к М.
...
Рейтинг: 0 / 0
Выбор СУБД. Нужна очень быстрая вставка.
    #36641225
g-u-e-s-t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Любая вменяемая БД всосет 100000 записей за секунду.
Все остальное зависит от кривизны рук разработчика и обвязки.

Код: 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.
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>

...
Рейтинг: 0 / 0
Выбор СУБД. Нужна очень быстрая вставка.
    #36642137
-Serg-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
g-u-e-s-tЛюбая вменяемая БД всосет 100000 записей за секунду.

а если не 100.000, а 1.000.000 ?
...
Рейтинг: 0 / 0
Выбор СУБД. Нужна очень быстрая вставка.
    #36642346
g-u-e-s-t
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-Serg-
А 100 000 000 000 ...
Торг не уместен.
Вы вначале получите 1000000 полезных данных, обработайте их, посмотрите на затраченное время, а потом думайте с какой скоростью Вам нужна вставка.

Код: 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.
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.
Все тесты проводились на обычной домашней тачке.
качалки, торренты, дц++, не отключались.
...
Рейтинг: 0 / 0
Выбор СУБД. Нужна очень быстрая вставка.
    #36642548
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lockyКогда мне понадобится быстро сохранить массив целых чисел - я приду к М.

И напрасно. Они там строки сохраняют :)
...
Рейтинг: 0 / 0
Выбор СУБД. Нужна очень быстрая вставка.
    #36642768
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan)lockyКогда мне понадобится быстро сохранить массив целых чисел - я приду к М.

И напрасно. Они там строки сохраняют :)
ну, это я знаю.
Я к тому, что скорость генерации списка интов это конечно круто... но задлянахрена?
на случай, если кто-то забудет устный счет от нуля до фиг-знает-скольки?
...
Рейтинг: 0 / 0
Выбор СУБД. Нужна очень быстрая вставка.
    #36642901
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lockyGluk (Kazan)lockyКогда мне понадобится быстро сохранить массив целых чисел - я приду к М.

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

то верно :)
...
Рейтинг: 0 / 0
Выбор СУБД. Нужна очень быстрая вставка.
    #36643281
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-Serg-Откуда 2 сек то берутся.
Терминалу не прикажешь...

-Serg-p.s. используй вместо $p($h,",",2) просто $zh
Всенепременно!
...
Рейтинг: 0 / 0
Выбор СУБД. Нужна очень быстрая вставка.
    #36643282
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lockyКогда мне понадобится быстро сохранить массив целых чисел - я приду к М.
Напиши что тебе еще сохранить - потестим и это. Так глядишь и окажешся у нас быстрее.
...
Рейтинг: 0 / 0
Выбор СУБД. Нужна очень быстрая вставка.
    #36643434
locky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krvsalockyКогда мне понадобится быстро сохранить массив целых чисел - я приду к М.
Напиши что тебе еще сохранить - потестим и это. Так глядишь и окажешся у нас быстрее.
Пасибо
Я расстался с М в... 1996(?) году.
Обратно не тянет.
...
Рейтинг: 0 / 0
Выбор СУБД. Нужна очень быстрая вставка.
    #36646605
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
locky , тогда зачем юродствовать?
...
Рейтинг: 0 / 0
Выбор СУБД. Нужна очень быстрая вставка.
    #36646933
спит
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ответы.

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

Минута звукового файла с частотой 44К вставляется около получаса. СУБД - oracle 11g r2.
...
Рейтинг: 0 / 0
Выбор СУБД. Нужна очень быстрая вставка.
    #36647220
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спит,

А что с ними дальше делать, по чем индексы нужны?
...
Рейтинг: 0 / 0
Выбор СУБД. Нужна очень быстрая вставка.
    #36647226
DPH3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спит
Минута звукового файла с частотой 44К вставляется около получаса. СУБД - oracle 11g r2.

Э, код в студию. А то судя по скорости, запускается задача на стареньком ноуте, каждая запись вставляется в отдельной транзакции, да еще и общий sequence без кэширования.
...
Рейтинг: 0 / 0
Выбор СУБД. Нужна очень быстрая вставка.
    #36647847
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спитСпасибо за ответы.

В общем, алгоритм вставки такой:
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.
Код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Class temp.wav Extends %Persistent
{
  Property iTimeTicks As %Integer;

  Property iChannel As %Integer;

  Property iValue As %Integer;
}
Код: 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.
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: если обработку файла производить средствами самой СУБД, общая скорость будет выше.
...
Рейтинг: 0 / 0
Выбор СУБД. Нужна очень быстрая вставка.
    #36648239
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если код немного улучшить, то время уменьшается с 40с. до 25с.
Улучшенный код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
...
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();
...
...
Рейтинг: 0 / 0
Выбор СУБД. Нужна очень быстрая вставка.
    #36648602
правильный емайл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servit,

ужос какой, если уж очень хотите средствами jdbc без использования утилит прямой загрузки(sql*loader) то как вариант использование хранимки которая на вход принимает масивы с данными и вставляет через forall
...
Рейтинг: 0 / 0
Выбор СУБД. Нужна очень быстрая вставка.
    #36648615
правильный емайл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ещё вот это почитай

http://download-west.oracle.com/docs/cd/B10501_01/java.920/a96654/oraperf.htm#1056502
...
Рейтинг: 0 / 0
Выбор СУБД. Нужна очень быстрая вставка.
    #36648631
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
правильный емайл,

Я с Oracle не работаю, а вот топикстартеру (спит) Ваша ссылка может пригодиться.
...
Рейтинг: 0 / 0
Выбор СУБД. Нужна очень быстрая вставка.
    #36648642
правильный емайл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servit,

упс, сори перепутал думал думал эт просто обёртка собственая)
...
Рейтинг: 0 / 0
Выбор СУБД. Нужна очень быстрая вставка.
    #36648675
Yo.!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
имхо передавать массив в pl/sql процедуру быстрее должно получиться.
...
Рейтинг: 0 / 0
Выбор СУБД. Нужна очень быстрая вставка.
    #36648793
Alexey Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servitЕсли код немного улучшить, то время уменьшается с 40с. до 25с.
код поскипан


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

у меня таким макаром 2 млн записей из dbf грузятся в БД за 8-10 сек на средненькой тачке.
...
Рейтинг: 0 / 0
Выбор СУБД. Нужна очень быстрая вставка.
    #36649285
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Kuznetsov,

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

PS: для нативной работы с dbf (чтение, запись) в Caché есть соответствующий класс, входящий в Прототип-6 .
...
Рейтинг: 0 / 0
Выбор СУБД. Нужна очень быстрая вставка.
    #36651617
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хватит уже томить всех пустыми разговорами. Давайте сформулируем DDL таблицы для вставки, правила вставки (BULK или не BULK) и будем тесты проводить.
...
Рейтинг: 0 / 0
Выбор СУБД. Нужна очень быстрая вставка.
    #36651645
AAron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Senya_L,

+1

а то массовая вставка нормальными ETL позволяет вливать и 100К, и 1млн в секунду...
...
Рейтинг: 0 / 0
25 сообщений из 129, страница 2 из 6
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Выбор СУБД. Нужна очень быстрая вставка.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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