Начало » Использование СУБД » Firebird, HQbird, InterBase » IRequest против IStatement (по скорости)  
	
		
		
			| IRequest против IStatement [сообщение #4014] | 
			Tue, 09 January 2024 20:12   | 
		 
		
			
				
				
				
					
						  
						SD
						 Сообщений: 452 Зарегистрирован: 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?..
		
		
		
 |  
	| 
		
	 | 
 
 
 |  
  
 
Переход к форуму:
 
 Текущее время: Tue Nov 04 08:55:35 GMT+3 2025 
 Общее время, затраченное на создание страницы: 0.00938 секунд 
 |