Решил проверить как в 2009-й работает джоин временной и постоянной таблички.
Для этого сделал постоянную табличку GRD_TmpAccountSum - близнеца времянки.
и попробовал позапускать джобик для разных комбинаций.
X++:
// [url=http://axforum.info/forums/showthread.php?p=264151#post264151]Временные таблицы и скорость работы[/url]
static void glibs_Job2(Args _args)
{
TmpAccountSum tmpAccountSum1;
// GRD_TmpAccountSum tmpAccountSum1;
TmpAccountSum tmpAccountSum2;
// GRD_TmpAccountSum tmpAccountSum2;
Counter i;
FreeText text;
Counter startTime;
#Define.cycles(1000)
;
info(strFMT("isRunningOnServer() = %1", Global::isRunningOnServer()));
info(strFMT("tmpAccountSum1.isTmp() = %1", tmpAccountSum1.isTmp()));
info(strFMT("tmpAccountSum2.isTmp() = %1", tmpAccountSum2.isTmp()));
delete_from tmpAccountSum1;
delete_from tmpAccountSum2;
startTime = WinAPI::getTickCount();
for (i = 0; i <= #cycles; i++)
{
tmpAccountSum1.clear();
tmpAccountSum2.clear();
text = int2str(i);
tmpAccountSum1.AccountNum = strrep("0", 20 - strlen(text)) + text;
tmpAccountSum2.AccountNum = strrep("0", 20 - strlen(text)) + text;
tmpAccountSum1.Balance01 = 999999 * 888888;
tmpAccountSum2.Balance01 = 999999 * 888888;
tmpAccountSum1.Balance02 = 999999 * 888888;
tmpAccountSum2.Balance02 = 999999 * 888888;
tmpAccountSum1.Balance03 = 999999 * 888888;
tmpAccountSum2.Balance03 = 999999 * 888888;
tmpAccountSum1.Balance04 = 999999 * 888888;
tmpAccountSum2.Balance04 = 999999 * 888888;
tmpAccountSum1.Balance05 = 999999 * 888888;
tmpAccountSum2.Balance05 = 999999 * 888888;
tmpAccountSum1.Balance06 = 999999 * 888888;
tmpAccountSum2.Balance06 = 999999 * 888888;
tmpAccountSum1.Balance07 = 999999 * 888888;
tmpAccountSum2.Balance07 = 999999 * 888888;
tmpAccountSum1.Balance10 = 999999 * 888888;
tmpAccountSum2.Balance10 = 999999 * 888888;
tmpAccountSum1.TaxCode = "XXXXXXXXXXXXXXXXXXXX";
tmpAccountSum2.TaxCode = "XXXXXXXXXXXXXXXXXXXX";
tmpAccountSum1.CurrencyCode = "XXX";
tmpAccountSum2.CurrencyCode = "XXX";
tmpAccountSum1.Posting = 1;
tmpAccountSum2.Posting = 1;
tmpAccountSum1.Dimension[1] = "XXXXXXXXXXXXXXXXXXXX";
tmpAccountSum2.Dimension[1] = "XXXXXXXXXXXXXXXXXXXX";
tmpAccountSum1.Dimension[2] = "XXXXXXXXXXXXXXXXXXXX";
tmpAccountSum2.Dimension[2] = "XXXXXXXXXXXXXXXXXXXX";
tmpAccountSum1.Dimension[3] = "XXXXXXXXXXXXXXXXXXXX";
tmpAccountSum2.Dimension[3] = "XXXXXXXXXXXXXXXXXXXX";
tmpAccountSum1.OperationsTax = 1;
tmpAccountSum2.OperationsTax = 1;
tmpAccountSum1.TransDate = today();
tmpAccountSum2.TransDate = today();
tmpAccountSum1.Txt = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" +
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" +
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" +
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
tmpAccountSum2.Txt = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" +
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" +
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" +
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
tmpAccountSum1.SortDate = today();
tmpAccountSum2.SortDate = today();
tmpAccountSum1.Balance01Cur = 999999 * 888888;
tmpAccountSum2.Balance01Cur = 999999 * 888888;
tmpAccountSum1.Qty01 = 999999 * 888888;
tmpAccountSum2.Qty01 = 999999 * 888888;
tmpAccountSum1.Qty02 = 999999 * 888888;
tmpAccountSum2.Qty02 = 999999 * 888888;
tmpAccountSum1.Qty03 = 999999 * 888888;
tmpAccountSum2.Qty03 = 999999 * 888888;
tmpAccountSum1.Voucher = "XXXXXXXXXXXXXXXXXXXX";
tmpAccountSum2.Voucher = "XXXXXXXXXXXXXXXXXXXX";
tmpAccountSum1.insert();
tmpAccountSum2.insert();
}
info (strfmt("Prepare data took %1 seconds", (WinAPI::getTickCount() - startTime) / 1000));
startTime = WinAPI::getTickCount();
i = 0;
while select tmpAccountSum1
join tmpAccountSum2
where tmpAccountSum1.AccountNum == tmpAccountSum2.AccountNum
{
text = tmpAccountSum1.Voucher + tmpAccountSum2.Voucher;
i++;
}
info (strfmt("Join %1 loops", i));
info (strfmt("Join %1 seconds", (WinAPI::getTickCount() - startTime) / 1000));
startTime = WinAPI::getTickCount();
i = 0;
while select tmpAccountSum1
{
while select tmpAccountSum2
where tmpAccountSum2.AccountNum == tmpAccountSum1.AccountNum
{
text = tmpAccountSum1.Voucher + tmpAccountSum2.Voucher;
i++;
}
}
info (strfmt("Sub while select %1 loops", i));
info (strfmt("Sub while select %1 seconds", (WinAPI::getTickCount() - startTime) / 1000));
}
Цитата:
isRunningOnServer() = 1
tmpAccountSum1.isTmp() = true
tmpAccountSum2.isTmp() = true
Prepare data took 0,42 seconds
Join 1001 loops
Join 6,91 seconds
Sub while select 1001 loops
Sub while select 0,06 seconds
isRunningOnServer() = 1
tmpAccountSum1.isTmp() = false
tmpAccountSum2.isTmp() = true
Prepare data took 2,34 seconds
Join 1001 loops
Join 7,03 seconds
Sub while select 1001 loops
Sub while select 0,08 seconds
isRunningOnServer() = 1
tmpAccountSum1.isTmp() = true
tmpAccountSum2.isTmp() = false
Prepare data took 2,25 seconds
Join 1001 loops
Join 1,28 seconds
Sub while select 1001 loops
Sub while select 1,45 seconds
isRunningOnServer() = 1
tmpAccountSum1.isTmp() = false
tmpAccountSum2.isTmp() = false
Prepare data took 2,27 seconds
Join 1001 loops
Join 0,06 seconds
Sub while select 1001 loops
Sub while select 1,25 seconds