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

Откуда:
Сообщений: 16
Здравствуйте

В моем проекте требуется постоянно вписывать в базу простые строки.

В общем все сводиться к двум действиям - вписать строку (INSERT) и иногда считать значение автоинкремента (@@IDENTITY).

В принципе никакие индексы не нужны.

Потом эта база вся скопом переноситься в MSSQL2000 (дописывается в существующую базу).

Требуется заносить по несколько тысяч строк в секунду (таблиц много - более сотни).

Очень хочется узнать какая СУБД (freeware) наилучшая для этих целей - сам MSSQL не хочет заносить более 500-800 строк ни в какую...

Зарание спасибо.

PS - должна быть поддержка полей типа text (BLOB)
24 июл 03, 22:11    [275099]     Ответить | Цитировать Сообщить модератору
 Re: Самая быстрая СУБД при инсерте  [new]
Zmeishe
Member

Откуда: Нижний Новгород
Сообщений: 1271
Какая конкретно сказать трудно. Необходимо прогнать одинаковый тест на нескольких СУБД. Но самое главное каждая СУБД должна быть сконструирована профессионально. Не одинаково, а профессионально.
Одному на разных нереально сделать профессионально. Невозможно быть профи на всех СУБД. Да и ни к чему размазываться как масло по бутерброду.

Из своего личного опыта могу сказать на примере InterBase.

Если закачивать в таблицу по 100 тыс. записей, также будут тормоза.
Перестройка индексов, работа триггеров и т.д. Закачка таким лобовым способом у меня шла целую ночь. Затем в литературе нашёл способ как это сделать намного быстрее.

Рекомендации были следующие:
1. Данные заранее должны удовлетворять бизнес правилам БД. Т.е. закачивается не "мусор" из "помойки", а информация например из более мелкой БД в крупную. И бизнес правила у них должны быть аналогичными.
2. Отключить индексы (не удалить, а отключить)
3. Отключить триггеры.
4. Закачивать данные порциями (я делал по 5 тыс) затем COMMIT и новая порция.
5. Включить триггеры и индексы.
Перестройка индексов в этом случае шла от 3 сек. до 10 сек на всю таблицу.
Общее время этим способом занимало около 2 мин, на том же самом железе конечно. В 1999 г. такие операции пришлось делать у заказчика на P-II, RAM-64Мб (Сейчас смешно). И IB тогда был то ли 4.5 то ли 5.0.
На мощных серверах под Linux время не замечал - очень быстро.
Что касается BLOB на сегодняшний день это не проблема, если пользоваться IB компонентами из стандартной поставки Билдер или Дельфи.

PS: Мнений тебе выскажут, думаю много. Окончательное решение принимай сам.
Удачи!
25 июл 03, 09:04    [275321]     Ответить | Цитировать Сообщить модератору
 Re: Самая быстрая СУБД при инсерте  [new]
IBMer
Guest
В принципе в DB2 можно быстро добавлять записи в обход транзакционного механизма. Обычно это делается в хранилищах данных
25 июл 03, 11:10    [275537]     Ответить | Цитировать Сообщить модератору
 Re: Самая быстрая СУБД при инсерте  [new]
killed
Member

Откуда: Moscow
Сообщений: 3526
2Аrchi

откуда входные данные? телеметрия?

вероятно нужно смотреть в сторону in-memory DB. Я правда не знаю, есть ли там приличные из разряда free.
25 июл 03, 11:40    [275638]     Ответить | Цитировать Сообщить модератору
 Re: Самая быстрая СУБД при инсерте  [new]
Andrew_256
Guest
В MSSQL смотри BULK INSERT (функции bulk_init и т.п. в MSSQL ODBC):
500 записей (Time-Value) без индексов вставляется за 30ms, 50000 - 1,5 секунды на простой PIII машине.
25 июл 03, 21:48    [276659]     Ответить | Цитировать Сообщить модератору
 Re: Самая быстрая СУБД при инсерте  [new]
Ermak
Member

Откуда: Tomsk
Сообщений: 811
Если всетаки говорим про закачку больших объемов данных в обход механизма транзакций, то в ASA см. Load table ...
26 июл 03, 07:44    [276861]     Ответить | Цитировать Сообщить модератору
 Re: Самая быстрая СУБД при инсерте  [new]
Archi
Member

Откуда:
Сообщений: 16
2Andrew_256: Большое спасибо за совет - скорости просто супер! А у тебя нет какой-то документации или примеров по bulk-insert на С++?
29 июл 03, 23:11    [280728]     Ответить | Цитировать Сообщить модератору
 Re: Самая быстрая СУБД при инсерте  [new]
Andron
Member

Откуда: Cherepovets
Сообщений: 1816
В Informix например всю таблицу можно разместить в оперативной памяти (если место есть) set table имя_таблицы memory resident, тогда любые операции с данными в такой таблице наверное будут идти очень быстро :-)
Кроме того можно отключить журналирование для этой таблицы (если вся база с журналированием) через alter table type (raw)

А вообще первое правило при массовой заливке данных - отключить в таблице индексы (или удалить) а после пересоздать и собрать статистику, блокировать доступ других пользователей к заливаемым таблицам, а лучше ко всей базе :-)
фрагментировать таблицу по какому-либо правилу на несколько физических дисков. Ну и иметь мощное железо.
4 авг 03, 10:02    [286773]     Ответить | Цитировать Сообщить модератору
 Re: Самая быстрая СУБД при инсерте  [new]
Andrew_256
Guest
1. Все примеры и документация вся есть в MSDN
2. На всякий случай - привожу простейший пример. Здесь используется bulk файл в MS формате. Чтобы его сгенерировать - запусти этот же пример, но укажи DB_OUT при вызове bcp_init.
3. В документации описаны функции по указанию формата CSV файла для импорта, я просто не разбирался.
4. Ну и учти, что транзакций и т.п. с этим методом не будет. Хотя обычно они в таких задачах и не требуются.


#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <tchar.h>
#include <windows.h>

#include <sql.h>
#include <sqlext.h>
#include <odbcss.h>

SQLHENV henv = SQL_NULL_HENV;
SQLHDBC hdbc = SQL_NULL_HDBC;
SQLHDBC hdbc1 = SQL_NULL_HDBC;
SQLHSTMT hstmt1 = SQL_NULL_HSTMT;

int main(int argc, char* argv[])
{
RETCODE retcode;

// Bulk copy variables.
SDWORD cRows;

// Allocate the ODBC environment and save handle.
retcode = SQLAllocHandle (SQL_HANDLE_ENV, NULL, &henv);

// Let ODBC know this is an ODBC 3.0 app.
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,
(SQLPOINTER) SQL_OV_ODBC3,
SQL_IS_INTEGER);

// Allocate ODBC connection handle, set bulk copy mode, and
// then connect.
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);
retcode = SQLSetConnectAttr(hdbc1, SQL_COPT_SS_BCP,
(void *)SQL_BCP_ON,
SQL_IS_INTEGER);

retcode = SQLConnect(hdbc1, (unsigned char *)"MSSQLDSN", SQL_NTS,
(unsigned char *)"sa", SQL_NTS, (unsigned char *)"", SQL_NTS);

// Initialize the bulk copy.
DWORD start_time = GetTickCount();

retcode = bcp_init(hdbc1, "Database..Database", "F:\\bulktest.bcp",
"F:\\BCPERROR.out", DB_IN);

// not the ODBC return of SQL_SUCCESS.
if ( (retcode != SUCCEED) )
{
return(1);
}

// Execute the bulk copy.
retcode = bcp_exec(hdbc1, &cRows);

if ( (retcode != SUCCEED) )
{
return(1);
}

printf("Time to bulk insert %d records: %d ms\n",cRows,GetTickCount() - start_time);


/* Clean up. */
SQLDisconnect(hdbc1);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);
SQLFreeHandle(SQL_HANDLE_ENV, henv);

getchar();
return(0);
}
4 авг 03, 20:52    [287931]     Ответить | Цитировать Сообщить модератору
 Re: Самая быстрая СУБД при инсерте  [new]
non
Guest
Ребята смотри общепризнанные тесты...там все написано....

http://www.tpc.org/tpcc/results/tpcc_perf_results.asp
5 авг 03, 10:02    [288156]     Ответить | Цитировать Сообщить модератору
 Re: Самая быстрая СУБД при инсерте  [new]
eNose
Member

Откуда:
Сообщений: 183063
Самая быстрая - какая-нить in-memory database, например Raima DB.
6 авг 03, 08:55    [289522]     Ответить | Цитировать Сообщить модератору
Все форумы / Сравнение СУБД Ответить