Показать сообщение отдельно
Старый 28.01.2004, 15:29   #1  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,709 / 1201 (44) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
? Почему такое расхождение в скорости выполнения
Я не понимаю механизм доступа к данным в Axapta 2.5 Сделал простенький тест

PHP код:
static void Job_test(Args _args)
{
    
Connection      Con = new Connection();
    
Statement       Stmt Con.createStatement();
    
ResultSet       R;
    
CommaIo         fileOut;
    
int             timenowBegini;
    
InventTable     inventTable;

;

    
// Формирование ResultSet
    
fileOut = new CommaIo("C:\test_con.txt","W");
    
timenowBegin=timenow();
    
Stmt.executeQuery('SELECT TOP 1000 * FROM InventTable');

    while ( 
R.next() )
    {
        
fileOut.write(R.getString(1),
                        
R.getString(2),
                        
R.getString(3),
                        
R.getString(4),
                        
R.getString(5),
                        
R.getString(6),
                        
R.getString(7),
                        
R.getString(8),
                        
R.getString(9),
                        
R.getString(10),
                        
R.getString(11),
                        
R.getString(12),
                        
R.getString(13),
                        
R.getString(14),
                        
R.getString(15),
                        
R.getString(16),
                        
R.getString(17),
                        
R.getString(18),
                        
R.getString(19),
                        
R.getString(20) );
    }
    
info("Время сброса ResultSet = "+int2str(timenow()-timenowBegin));
    
Stmt.close();

    
// Чтение из табличной переменной
    
fileOut = new CommaIo("C:\test_sel.txt","W");
    
0;
    
timenowBegin=timenow();

    
select from inventTable;

    while (
i<=1000)
    {
        
i++;
        
next inventTable;
        
fileOut.write(inventTable.ItemGroupID,
                        
inventTable.ItemID,
                        
inventTable.ItemName,
                        
inventTable.ItemType,
                        
inventTable.PURCHMODEL,
                        
inventTable.HEIGHT,
                        
inventTable.WIDTH,
                        
inventTable.SALESMODEL,
                        
inventTable.COSTGROUPID,
                        
inventTable.REQGROUPID,
                        
inventTable.PRIMARYVENDORID,
                        
inventTable.NETWEIGHT,
                        
inventTable.DEPTH,
                        
inventTable.UNITVOLUME,
                        
inventTable.BOMUNITID,
                        
inventTable.DENSITY,
                        
inventTable.SCRAPTYPEID,
                        
inventTable.DIMENSION[1],
                        
inventTable.DIMENSION[2],
                        
inventTable.DIMENSION[3] );
    }
    
info("Время сброса прямого сканирования = "+int2str(timenow()-timenowBegin));

Получил расхождение в скорости примерно на порядок (если увеличить число выбрасываемых полей или количество строк это будет заметнее). Т.е. выброс в текстовый файл из ResulSet примерно на порядок МЕДЛЕННЕЕ, чем тот же выброс из табличной переменной. Почему собственно?

Собственно, изначально вопрос возник в попытке ускорить выброс результата выборки в текстовый файл. Выполнение Query с последующим циклом оказалось сопоставимо по времени с выбросом из ResulSet (примерно одинаково). Т.е. наиболее оптимальным по скорости оказалась такая технология:

-) Создать таблицу на сервере
-) Выполнить хранимую процедуру сервера по наполнению этой таблицы
-) Средствами Axapta сделать выброс из этой таблицы в текстовый файл

Но это достаточно сложно по исполнению, поэтому не хотелось бы этого делать.

Меня интересует, почему есть такое явное расхождение в скорости обработки казалось бы одинаковых операций?