Использование временных таблиц весьма удобно, по сравнению с другими формами хранения временных коллекций. И часто, как-то забывается, что они не являются полноценными таблицами.
1. Любимая многими схема использования временной таблицы для группировки данных, особенно часто встречается в отчетах:
X++:
TransTable trans; // постоянная таблица каких-то строк
TmpTable tmpTable; // временная таблица
while select trans
where trans.Tratata <= "tititi" &&
trans.LaLaLa >= "gogogo"
{
select firstonly tmpTable
where tmpTable.Field1 == trans.SomeRefId &&
tmpTable.Date1 == trans.TransDate;
if(! tmpTable)
{
tmpTable.initFromTrans(trans);
}
tmpTable.Amount += trans.Amount;
tmpTable.Qty += trans.Qty;
tmpTable.write();
}
Такой код замечательно работает до 1000 записей, но чем дальше, тем все хуже и хуже, потому что с каждым циклом время на 1 итерацию увеличивается... 5000 вообще сложно дождаться.
И в этом случаи, индекс на временной таблице помогает, но редко кто о нем задумывается пока не надо будет сдавать отчетность за квартал-полгода.
2. Временная таблица, по мнению Аксапты, может быть перемещена на диск, если достигла какого-то предела в размерах (где-то была дока, которая более подробно об этом говорила). После такого подвоха работа с ней превращается в постоянное дерганье диска, что ну никак не увеличивает скорость.
Я так и не научился предугадывать и ловить этот "счастливый" момент... всегда становится неприятной неожиданностью.
3. Место хранение либо клиент, либо сервер, хотя чаше хочется создать на сервере, а использовать на клиенте, что приводит к многочисленным обменам клиент-сервер.
Итого: когда встречаю в чей-то разработке временную таблицу заполняемую неопределенным объемом данным, отмечаю для себя, что надо либо протестировать на большом объеме, либо постараться не использовать для больших выборок.