Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Генерация и заполнение бд ~60 млн. записей 
:(
    Опции темы
NightWolf3000
Дата 27.5.2013, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 28.1.2013

Репутация: нет
Всего: нет



Задача в сабже.
Генерация и вставка написана, но работает медленно.
Код

    private static void runFilling(PooledConnection poolledConnection,
            int maxRow, int minRow) throws UnsupportedEncodingException,
            SQLException {
        try {
         for (int j = 1; j <= count; j++) {
                    for (int i = 1; i <= count2; i++) {
                        for (int i = minRow; i < minRow+count; i++) {
                            insertNextRow(poolledConnection, SQL_INSERT_STRING);
                            insertNextRow(poolledConnection, SQL_INSERT_STRING_OTHER_TABLE);
                        }
                    }
                }
            }
        } catch (SqlIntegrityConstraintViolationException e) {
            //обрабатываю исключение
        }
    }

    private static void insertNextRow(PooledConnection poolledConnection, String insertIn) throws SQLException,
            UnsupportedEncodingException {
        Connection connection = poolledConnection.getConnection();
        PreparedStatement statement = connection.prepareStatement(insertIn
                + MAIN_SQL_INSERT_WITH_PARAMETR);
        for (int j = 1; j <= 52; j++) {
            if (j == 1)
                statement.setObject(1, "");
            else if (j == 2)
            ...
            //простыня заполнения параметрами
        }
        statement.executeUpdate();
    }


идеи по исправлению этого жуткого кода? 
PM MAIL   Вверх
danilych
Дата 27.5.2013, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 2.2.2011

Репутация: нет
Всего: 3



что за БД, - может попробовать нативные утилиты? 
PM MAIL   Вверх
NightWolf3000
Дата 27.5.2013, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 28.1.2013

Репутация: нет
Всего: нет



db2, появилась мысль использовать 
Код

Connection connection = poolledConnection.getConnection();
connection.setAutoCommit(false);
Statement st = connection.createStatement();
цикл st.addBatch(sql);
проверка лимита команд
st.executeBatch();
connection.commit();
st.clearBatch();
продолжение цикла


скорость увеличилась, однако на 3 итерации виснет  на st.executeBatch();
PM MAIL   Вверх
serger
Дата 28.5.2013, 07:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 19.6.2007
Где: Ижевск

Репутация: 2
Всего: 5



Можно проверить на тестовом запросе. Драйвер обновить...

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL WWW Skype GTalk Jabber   Вверх
d_k
Дата 28.5.2013, 07:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 20.7.2004

Репутация: 1
Всего: 1



стейтменты стоит закрывать... да и использовать предварительно откомпиллированные запросы

Это сообщение отредактировал(а) d_k - 28.5.2013, 07:51
PM MAIL   Вверх
serger
Дата 28.5.2013, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 19.6.2007
Где: Ижевск

Репутация: 2
Всего: 5



Тут примерчик:
Your text to link here...
Можно для эксперементов с размером batchSize поиграться...

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL WWW Skype GTalk Jabber   Вверх
NightWolf3000
Дата 28.5.2013, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 28.1.2013

Репутация: нет
Всего: нет



преобразил код, теперь около 600к записей вбрасывает за минуту, но маловата скорость все равно, долго думает на st.executeBatch();
Код

Connection connection = poolledConnection.getConnection(); 
connection.setAutoCommit(false); 
int bathcount = 0; 
Statement st = connection.createStatement(); 
for (condit){ st.addBatch(sql); 
if (bathcount >= 10000) 
{ st.executeBatch(); 
connection.commit(); 
st.clearBatch();
bathcount = 0; }
bathcount++; } }

и если я добавляю здесь  st.addBatch(sql); поочередно вставку в разные таблицы то это не сть хорошо? стоит разделить на два PreparedStatment? но пробовал на одном коннекте из пула скорость сохраняась такая же ибо стайтменты выполнялись последовательно, на двух коннектах теряется один из PreparedStatment и не дает сетить значения. За совет по обновлению драйвер благадорю, стало быстрей.

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
serger
Дата 28.5.2013, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 19.6.2007
Где: Ижевск

Репутация: 2
Всего: 5



Цитата

   и если я добавляю здесь  st.addBatch(sql); поочередно вставку в разные таблицы то это не есть хорошо?
   

можно же по-эксперементировать, но думаю лучше однотипные запросы.
База-то какая? мб есть поддержка своих способов заливки. Или всё-таки через утилиты?

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL WWW Skype GTalk Jabber   Вверх
NightWolf3000
Дата 29.5.2013, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 28.1.2013

Репутация: нет
Всего: нет



я писал уже, база  - IBM db2. Насчет своих способов: вы подразумеваете аналог постгресовской copy? можно пример утилит на любой базе?

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
serger
Дата 29.5.2013, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 19.6.2007
Где: Ижевск

Репутация: 2
Всего: 5



да банальный psql. Должны быть утилиты работы из командной строки.

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL WWW Skype GTalk Jabber   Вверх
NightWolf3000
Дата 29.5.2013, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 28.1.2013

Репутация: нет
Всего: нет



попробовал для разных таблиц разделить следующим образом
Код

PooledConnection pooledConnection = db2ConnectionPoolDataSource.getPooledConnection();
Connection connection1 = pooledConnection.getConnection();
connection1.setAutoCommit(false);
PreparedStatement pst1 = connection1.prepareStatement(SQL_TAMPLATE);
Connection connection2 = pooledConnection.getConnection();
connection2.setAutoCommit(false);
PreparedStatement pst2 = connection1.prepareStatement(SQL_TAMPLATE_2);
for (int i = 1; i <= count; i++) {
           changedata
           fillStatment(pst1);
           changedata
           fillStatment(pst2);
           batchCounter++;
           if (batchCounter >= 10000) {
                       pst1.executeBatch();
                       pst2.executeBatch();
                       connection1.commit();
                       connection2.commit();
                       pst1.clearBatch();
                       pst2.clearBatch();
                       batchCounter = 0;
           }
}

private static void fillStatment(PreparedStatement pst1){
        pst1.setLong(1, value);
        pst1.addBatch();
    }

получил следующую ошибку com.ibm.db2.jcc.am.SqlException: [jcc][10120][10943][4.14.113] Invalid operation: statement is closed. ERRORCODE=-4470, SQLS
TATE=null  на    вот этой строчке pst1.setLong(1, value);

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
serger
Дата 29.5.2013, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 19.6.2007
Где: Ижевск

Репутация: 2
Всего: 5



NightWolf3000, а всё-таки, через стандартные db-тулсы скорость намного быстрее?
Ещё индексы влияют на insert.

Код

if (batchCounter >= 10000) {
    pst1.executeBatch();
    pst2.executeBatch();
    connection1.commit();
    connection2.commit();
    pst1.clearBatch();
    pst2.clearBatch();
    batchCounter = 0;
}

разве так можно? ;)

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL WWW Skype GTalk Jabber   Вверх
NightWolf3000
Дата 29.5.2013, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 28.1.2013

Репутация: нет
Всего: нет



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

насчет индексов проверю тогда как доберусь до базы, не помню так)

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
serger
Дата 29.5.2013, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 19.6.2007
Где: Ижевск

Репутация: 2
Всего: 5



Код

psql db < data.sql

типа этого )

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL WWW Skype GTalk Jabber   Вверх
batigoal
Дата 30.5.2013, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 16
Всего: 151



Я в своем случае шел тем же путем: сначала пробовал просто insert через PreparedStatement, потом batch, потом - batch с предварительно дропнутым индексом. А потом выкинул все и перешел на загрузку внешней утилитой (у меня был Оракл, поэтому sqlldr).


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.1090 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.