Как ускорить InsertBatch?
От: Holms США  
Дата: 14.03.11 20:32
Оценка:
При таком простом класе

internal class pthist
  {
    public DateTime Timestamp { get; set; }
    public string Ticker { get; set; }
    public double Open { get; set; }
    public double High { get; set; }
    public double Low { get; set; }
    public double Close { get; set; }
    public double Volume { get; set; }
  }
  
  
  ...
  List<pthist> batch = new List<pthist>();
  ...
  pthist h = new pthist
                     {
                       Ticker = fieldTicker.str(),
                       Timestamp = DecomrpessDateTime(fieldDateTime.str()),
                       Open = DecompressPrice(fieldOpen.str()),
                       High = DecompressPrice(fieldHigh.str()),
                       Low = DecompressPrice(fieldLow.str()),
                       Close = DecompressPrice(fieldClose.str()),
                       Volume = (int)DecompressVolume(fieldVolume.str()),
                     };
        batch.Add(h);
...

if (rcCount > 1000000)
        {
          manager.InsertBatch(batch); // ОООООЧЧЕЕЕЕНЬ долго работает
        }



и милионе записей, InsertBatch работает около 5 минут для SQL Server 2008.
сервер в той же сети что и мой комп.
Сеть совершенно не забита другими вещами.

Как такое может быть?

Как добиться большей скорости.
Индексов в таблице нету.


Спасибо
... << RSDN@Home 1.2.0 alpha 5 rev. 1495>>
The life is relative and reversible.
Re: Как ускорить InsertBatch?
От: IT Россия linq2db.com
Дата: 14.03.11 22:26
Оценка:
Здравствуйте, Holms, Вы писали:

H>Как добиться большей скорости.


Самый быстрый способ для MSSQL BULK INSERT. Но нужна шара, чтобы положить на неё файл для сервера.

Если бы в MSSQL был бы какой-нибудь API (хотя бы даже нативный) для BCP, то его можно было бы прикрутить к BLToolkit. Для Sybase на работе мы смастерили обёртку над нативными библиотеками и у нас получается заливать порядка 50k записей в секунду.
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Как ускорить InsertBatch?
От: Holms США  
Дата: 14.03.11 22:33
Оценка:
Здравствуйте, IT, Вы писали:

IT>Если бы в MSSQL был бы какой-нибудь API (хотя бы даже нативный) для BCP, то его можно было бы прикрутить к BLToolkit. Для Sybase на работе мы смастерили обёртку над нативными библиотеками и у нас получается заливать порядка 50k записей в секунду.


да блин, облом. SQLite и тот быстрее записавает. Хотя читает медлено при 10 мил. записей. Хотел сравнить MS SQL. Не удалось
... << RSDN@Home 1.2.0 alpha 5 rev. 1495>>
The life is relative and reversible.
Re[3]: Как ускорить InsertBatch?
От: IT Россия linq2db.com
Дата: 14.03.11 22:47
Оценка:
Здравствуйте, Holms, Вы писали:

H>да блин, облом. SQLite и тот быстрее записавает. Хотя читает медлено при 10 мил. записей.


Естественно. InMemory database.

H>Хотел сравнить MS SQL. Не удалось


Можно ещё попробовать для 2008 групповой INSERT:

INSERT INTO MyTable (FirstCol, SecondCol)
VALUES
    ('First',1),
    ('Second',2),
    ('Third',3),
    ('Fourth',4),
    ('Fifth',5)

Если будет работать приемлемо, то сделать над ним обёртку.
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Как ускорить InsertBatch?
От: artelk  
Дата: 15.03.11 07:49
Оценка: +1
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Holms, Вы писали:


H>>Как добиться большей скорости.


IT>Самый быстрый способ для MSSQL BULK INSERT. Но нужна шара, чтобы положить на неё файл для сервера.


IT>Если бы в MSSQL был бы какой-нибудь API (хотя бы даже нативный) для BCP, то его можно было бы прикрутить к BLToolkit. Для Sybase на работе мы смастерили обёртку над нативными библиотеками и у нас получается заливать порядка 50k записей в секунду.


А это не подходит?
Re[3]: Как ускорить InsertBatch?
От: IT Россия linq2db.com
Дата: 15.03.11 11:07
Оценка:
Здравствуйте, artelk, Вы писали:

A>А это не подходит?


Надо посмотреть на реализацию. Аналогичный класс в Sybase провайдере тупо вставляет записи в цикле.
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: Как ускорить InsertBatch?
От: Holms США  
Дата: 15.03.11 19:04
Оценка:
Здравствуйте, artelk, Вы писали:

A>А это не подходит?

эта вещь работает очень быстро.
Имея 500000 строк на одну итереацию получаем
1. заполнение DataTable — 7000 ms
2. WriteToServer — 3500ms

весьма не плохо.

плохо что он работает только с DataTable как с внешним источником данных
... << RSDN@Home 1.2.0 alpha 5 rev. 1495>>
The life is relative and reversible.
Re[4]: Как ускорить InsertBatch?
От: IT Россия linq2db.com
Дата: 15.03.11 19:25
Оценка:
Здравствуйте, Holms, Вы писали:

H>эта вещь работает очень быстро.


Значит скорее всего используется какой-нибудь BCP-подобный API.

H>Имея 500000 строк на одну итереацию получаем

H>1. заполнение DataTable — 7000 ms
H>2. WriteToServer — 3500ms

Можно ещё попробовать заталкивать не сразу всё, а порциями.
Если нам не помогут, то мы тоже никого не пощадим.
Re[5]: Как ускорить InsertBatch?
От: Holms США  
Дата: 15.03.11 19:34
Оценка:
Здравствуйте, IT, Вы писали:


IT>Можно ещё попробовать заталкивать не сразу всё, а порциями.

так я порциями по 500000 строк и заталкиваю, у меня 9 мил записей.
... << RSDN@Home 1.2.0 alpha 5 rev. 1495>>
The life is relative and reversible.
Re[6]: Как ускорить InsertBatch?
От: IT Россия linq2db.com
Дата: 15.03.11 19:45
Оценка:
Здравствуйте, Holms, Вы писали:

IT>>Можно ещё попробовать заталкивать не сразу всё, а порциями.

H>так я порциями по 500000 строк и заталкиваю, у меня 9 мил записей.

Тогда поиграйся с размером порции.
Если нам не помогут, то мы тоже никого не пощадим.
Re[7]: Как ускорить InsertBatch?
От: Holms США  
Дата: 15.03.11 20:01
Оценка:
Здравствуйте, IT, Вы писали:

IT>Тогда поиграйся с размером порции.


В приниципе меня это устраивает, так как после этого поиск нужных данных происходит мнгновенно, Sqlite и подобные БД и рядом не стояли.
... << RSDN@Home 1.2.0 alpha 5 rev. 1495>>
The life is relative and reversible.
Re[4]: Как ускорить InsertBatch?
От: artelk  
Дата: 16.03.11 01:38
Оценка: 70 (2)
Здравствуйте, Holms, Вы писали:

H>плохо что он работает только с DataTable как с внешним источником данных


Разве?
void WriteToServer(IDataReader reader)
Делаешь свою реализацию IDataReader и скармливаешь ему...
У IDataReader достаточно реализовать только часть методов и свойств: Read, FieldCount и GetValue (вроде ничего не забыл).
Re[5]: Как ускорить InsertBatch?
От: Holms США  
Дата: 16.03.11 04:38
Оценка:
Здравствуйте, artelk, Вы писали:

A>Разве?

A>void WriteToServer(IDataReader reader)
A>Делаешь свою реализацию IDataReader и скармливаешь ему...
A>У IDataReader достаточно реализовать только часть методов и свойств: Read, FieldCount и GetValue (вроде ничего не забыл).
мдя, пропустил
надо попробовать
... << RSDN@Home 1.2.0 alpha 5 rev. 1495>>
The life is relative and reversible.
Re[4]: Как ускорить InsertBatch?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 19.03.11 08:36
Оценка:
Здравствуйте, IT, Вы писали:

IT>Надо посмотреть на реализацию. Аналогичный класс в Sybase провайдере тупо вставляет записи в цикле.


Как то пользовался — там честный bulk copy, очень быстрый. Я вставлял во временную табличку — оказалось, что это самый быстрый способ передать табличные данные в запрос.
... << RSDN@Home 1.2.0 alpha 5 rev. 1495 on Windows 7 6.1.7601.65536>>
AVK Blog
Re[8]: Как ускорить InsertBatch?
От: _FRED_ Черногория
Дата: 19.03.11 09:52
Оценка:
Здравствуйте, Holms, Вы писали:

IT>>Тогда поиграйся с размером порции.

H>В приниципе меня это устраивает, …

Если [можно] отключить индексы и лочить таблицу — то получится быстрее всего. Подробнее Optimizing Bulk Copy Performance.
Help will always be given at Hogwarts to those who ask for it.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.