SQLRU.net
Разработка приложений баз данных

Начало » Использование СУБД » Firebird, HQbird, InterBase » IRequest против IStatement (по скорости)
IRequest против IStatement [сообщение #4014] Tue, 09 January 2024 20:12 Переход к следующему сообщению
SD в настоящее время не в онлайне  SD
Сообщений: 411
Зарегистрирован: August 2022
Senior Member
Был у меня такой код:
// Just insert the record
if (!data->stmt)
{
	std::string query("INSERT INTO \"");
	query += table.name;
	query += "\" (";
	query += table.fields;
	query += ") VALUES (?";
	for (unsigned i = 1; i < metadata->getCount(data->status("Get fields count")); i++)
	{
		query += ",?";
	}
	query += ')';
	data->stmt.reset(data->tgtAtt->prepare(data->status("Prepare insert statement"), data->tgtTra.get(), query.size(), query.c_str(), SQL_DIALECT_V6, Firebird::IStatement::PREPARE_PREFETCH_NONE));
}
data->stmt->execute(data->status("Execute insert statement"), data->tgtTra.get(), metadata, dataBuffer.get(), nullptr, nullptr);
Поменял я его на вот такой.
if (!data->req)
{
	data->req.reset(data->tgtAtt->compileRequest(data->status("Prepare insert statement"), blr->size(), blr->data()));
	data->req->startAndSend(data->status("Execute insert statement"), data->tgtTra.get(), 0, 0, dataLength, dataBuffer.get());
}
else
{
	data->req->send(data->status("Execute insert statement"), 0, 0, dataLength, dataBuffer.get());
}
Вся прочая обвеска осталась той же. Результат - работает на четверть быстрее. Что может в DSQL быть тормозом? Разбор MessageMetadata?..
Re: IRequest против IStatement [сообщение #4015 является ответом на сообщение #4014] Tue, 09 January 2024 20:34 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 330
Зарегистрирован: June 2022
Senior Member
Что конкретно ты меришь? Первое выполнение вместе с подготовкой запроса или второе выполнение?

Это сетевое подключение или embedded?
Re: IRequest против IStatement [сообщение #4016 является ответом на сообщение #4015] Tue, 09 January 2024 22:13 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 330
Зарегистрирован: June 2022
Senior Member
Тормозом может быть не разбор, а скорее проверка соответствия буфера формату сообщения.
Странно что нет варианта вообще не передавать metadata, а тупо доверять буферу как есть. То есть считать что формат на стороне сервера и клиента одинаковы, буфер им соответствует, проверка и преобразование форматов не требуется.
Re: IRequest против IStatement [сообщение #4017 является ответом на сообщение #4016] Tue, 09 January 2024 22:39 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 330
Зарегистрирован: June 2022
Senior Member
Кстати если выполнение многократное, то почему бы не воспользоваться IBatch? Если оно однократное, то 25% это мелочь над которым не стоит биться.
Re: IRequest против IStatement [сообщение #4018 является ответом на сообщение #4015] Wed, 10 January 2024 01:37 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время не в онлайне  SD
Сообщений: 411
Зарегистрирован: August 2022
Senior Member
sim_84 писал(а) Tue, 09 January 2024 18:34
Что конкретно ты меришь?
Полное время переливки существующей БД в новую. Это сеть 100 мегабит. Бутылочное горлышко сервера - ЦПУ. Параллельные подключения ускоряют общий процесс, но это отдельный вопрос.

Вместо IBatch я бы скорее задействовал IReplicator - он удобнее и скорее всего быстрее, но требуется поддержка тройки.

[Обновления: Wed, 10 January 2024 01:38]

Известить модератора

Re: IRequest против IStatement [сообщение #4100 является ответом на сообщение #4018] Fri, 19 January 2024 01:38 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время не в онлайне  SD
Сообщений: 411
Зарегистрирован: August 2022
Senior Member
Перевёл на BLR и select тоже. Скорость поднялась ещё процентов на пять, но я так подозреваю чисто из-за разгрузки "серверного" проца, поскольку выборка никогда не была бутылочным горлышком.

Переход с DSQL-ного формата message "data-null-data-null" на gbak-овский "data-data-null-null" ускорения не дал. То есть тормоз не в парсинге буфера.
Re: IRequest против IStatement [сообщение #4646 является ответом на сообщение #4100] Tue, 12 March 2024 01:37 Переход к предыдущему сообщению
SD в настоящее время не в онлайне  SD
Сообщений: 411
Зарегистрирован: August 2022
Senior Member
Сделал для эксперимента использование IReplicator. Вставка идёт в три раза быстрее, чем с помощью BLR.
IBatch, пожалуй, пробовать уже не буду.
Предыдущая тема: Firebird -a
Следующая тема: На чем переписывать win-приложение для Web?
Переход к форуму:
  


Текущее время: Sat Nov 23 23:14:59 GMT+3 2024

Общее время, затраченное на создание страницы: 0.01092 секунд