Заметил интересный момент: модуль заполняет таблицу данными и ПОСЛЕ заполнения строит индексы. Тут проблем нет.
(После - для быстродействия, ибо в этом случае получаю выигрыш по скорости в 6,5 раз.)
Но вот при повторном вызове начинается самое интересное: заполнение таблицы идет гораздо медленнее (?!).
/* фрагменты кода*/
Request DBFCDX
Rddsetdefault( "DBFCDX" )
DBCreate ( ( "Calls.dbf" ) , aarq )
Use ( "Calls.dbf" ) Alias Calls New
/* Индексы НЕ ПОДКЛЮЧЕНЫ!!!*/
/*
Index ON Calls->Abonent Tag Abonent TO Calls // так было раньше, но скорость никакая. Позже создадим...
*/
/* Удаляем ВСЕ записи из существующей базы */
zap
/* Далее наполнение таблицы... */
/* Самое интересное: строим индексы */
Select Calls
Index ON Calls->Abonent Tag Abonent TO Calls
/* конец процедуры*/ Вроде все правильно, но... При первом вызове отрабатывает за 3:30, а при втором - за 6:20.
Если перед первым вызовом убираю Index ON... , то время одинаковое.
Если оставляю - опять медленно.
Если оставляю, но перед вторым запуском вручную удаляю файл индекса - быстро.
То есть при
отсутствии(!) файла индекса все замечательно.
Задумался:
явно же индексы не подключаю!!! И в мануале по USE:
/*
USE [<xcDatabase>[ INDEX <xcIndex list>]
[ ALIAS <xcAlias>]
[ EXCLUSIVE | SHARED ] [ NEW ] [ READONLY ]
[ VIA <cDriver>]]
INDEX - опционально.
А индексы подключаются потом по выбору с помощью INDEX ON, SET INDEX.
*/
И самое интересное: заменив
Index ON Calls->Abonent Tag Abonent TO
Calls на
Index ON Calls->Abonent Tag Abonent TO
idxCalls (то есть, когда имя индексного файла
не совпадает с именем таблицы) получил стабильный быстрый вариант.
И как с этим бороться? Не отраженный момент в документации, неправильное прочтение ее мной, глюк реализации или...???
PS: пару-тройку минут пережить можно, но на реальных таблицах под 6 миллионов записей разница, мягко говоря, весьма заметна. Тут уже 3-4 десятка минут набегает.