Форум » [x]Harbour » Индексы САМИ подключаются к таблице? » Ответить

Индексы САМИ подключаются к таблице?

Chikanuk: Заметил интересный момент: модуль заполняет таблицу данными и ПОСЛЕ заполнения строит индексы. Тут проблем нет. (После - для быстродействия, ибо в этом случае получаю выигрыш по скорости в 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 десятка минут набегает.

Ответов - 6

AlexMyr: Set autopen off или удалить файл с индексом.

Chikanuk: AlexMyr, спасибо за пинок в нужном направлении! Либо хорошо забыл, либо вообще не знал про SET AUTOPEN OFF. И пробел в документации: нет про это ничего. Сама команда есть, а описания нет. В TODO... Нарыл, однако в доке от xHarbour. Буду штудировать ее. И ведь что самое гнусное: засада именно с DBFCDX Цитата из документации: Some replaceable database drivers support automatic opening of index files with the USE command when the index file has the same file name as the database file (without extension). An example is the DBFCDX driver. SET AUTOPEN toggles this behavior. А ведь мысль была программно индексный файл удалять! А тут 3 слова, и проблема ушла.

Andrey: Я всегда удаляю индексный файл перед его созданием. Это еще в Клипере 5.3 засада была....


Chikanuk: Andrey пишет: Я всегда удаляю индексный файл перед его созданием. Это еще в Клипере 5.3 засада была.... Вот как-то именно 5.3 мимо меня проскочил. Увы... А засада осталась!

SADSTAR4: по старой (древней) памяти это только с CDX - при открытии DBF ищется CDX с таким же именем и открывается с NTX такого нет - только в явном виде

Chikanuk: Спасибо всем за помощь! Теперь на ЭТИ грабли не наступлю



полная версия страницы