ADS Как использовать индекс при выборе запроса

У меня есть файл .dbf из старой программы клипера здесь, в компании, и я добавил его в словарь данных в ADS 12 Evaluation со связанными индексными файлами dbf (.ntx)

Поля:

account,type,billmo,bill,kwhr,amount,pay,present,previous,forex,fpca,pfcharge,demand,demandchg,rebate,paydate,dummy,raffle,enerchg,others,pf,adj,datebill,billstat,insert,tendered,meter,adj2,lifeline,e_vat,w_tax,add_chg,restruc,mtrr,senior

и содержащий 300 тыс.+ строк.

.dbf содержит 4 файла .ntx (индекс), и один из них имеет выражение account+billmo.

Когда я выполняю простой запрос:

SELECT * FROM TABLE.DBF WHERE account='000000...' AND billmo = '2016...'

Это занимает 16 секунд или больше. Также об удалении:

DELETE FROM TABLE.DBF WHERE account='...' AND billmo = '...'

Это все еще то же самое.

Я не знаю, как использовать индекс (.ntx) в запросе, я искал в Google и пробовал что-то вроде

SELECT * FROM TABLE.DBF use index TABLE1 WHERE account = '...' AND billmo = '...'

Но это не работает.


person John Pangilinan    schedule 18.10.2016    source источник


Ответы (1)


Некоторые подсказки:

  1. Файлы NTX (и IDX) необходимо добавлять в таблицу вручную (в отличие от индексных файлов CDX и ADI, которые обнаруживаются автоматически, поскольку имеют то же базовое имя, что и таблица). В ARC32, когда вы щелкаете правой кнопкой мыши по таблице, появляется опция «Добавить существующие индексные файлы…».

  2. Вы можете проверить, действительно ли ARC32 использует какие-либо индексы, показав план выполнения (кнопка с одной большой и двумя маленькими таблицами на панели инструментов окна SQL Utility). Если есть красный кружок и написано «СКАНИРОВАНИЕ ТАБЛИЦЫ», то он не будет использовать индекс.

введите описание изображения здесь

  1. Если индекс находится в FIELD1+FIELD2, вы должны запросить его следующим образом:

    SELECT * FROM TABLE.DBF WHERE account + billmo = '000000...' + '2016...'

Здесь нет красного круга, и вместо «СКАНИРОВАНИЕ ТАБЛИЦЫ» написано «СКАНИРОВАНИЕ AOF», что означает, что ADS использует индекс в сканировании «Оптимизированный оптимизированный фильтр» вместо чтения всей таблицы.

  1. Пока вы используете данные только для составления отчетов и не хотите записывать их обратно в свое устаревшее приложение, может иметь смысл перенести их (возможно, с периодическим заданием) в лучший формат базы данных (ADT + ADI с правильным такие индексы, как 'account;billmo' [обратите внимание на точку с запятой], уже были бы большим шагом вперед).

введите описание изображения здесь

person Jens Mühlenhoff    schedule 18.10.2016
comment
Привет, я уже добавил связанный индексный файл в таблицу, а также попробовал предложенный вами запрос с ACCOUNT+BILLMO, но он показывает TABLE SCAN с предупреждением Restriction is not optimized. Я попытался переиндексировать с помощью ARC32, но предупреждение осталось тем же. Я не могу перенести таблицу, потому что в настоящее время она используется другими системами здесь. - person John Pangilinan; 19.10.2016
comment
Вы пробовали отдельные индексы для каждого столбца? Также, как я уже писал: когда индекс не загружен, механизм SQL не может воспользоваться им (без каламбура). - person Jens Mühlenhoff; 19.10.2016
comment
Да, я пробовал только столбец account. Все такой же. Как я могу узнать, был ли индекс загружен или нет? Я уже добавил его в таблицу. - person John Pangilinan; 19.10.2016
comment
Боюсь, это все, чем я могу вам помочь. Вы можете разместить сообщение на форуме SAP: go.sap.com/community/ tag.html?id=67838200100800005437 - person Jens Mühlenhoff; 19.10.2016
comment
Привет, теперь я знаю, в чем проблема. Это быстро, когда никто не использует стол. Старая система использовала таблицу, и когда ею пользуются многие, она начинает тормозить. Я могу быстро получить данные, если их никто не использует, но утилита sql все же говорит, что не использует никаких индексов. Могу я спросить, какой TableType и DBFTableType вы использовали? Потому что я не могу использовать утилиту SQL, когда тип таблицы NTX, только в ADT. - person John Pangilinan; 20.10.2016
comment
Кажется, я случайно создал индекс CDX. Я переделал свою тестовую настройку и теперь получаю сообщение об ошибке poQuery: Компонент TAdsQuery не поддерживает таблицу NTX. Таким образом, вы не можете использовать SQL для таблиц NTX с индексами NTX. Вы можете запросить таблицу в режиме CDX, но тогда индекс не используется. - person Jens Mühlenhoff; 20.10.2016
comment
Другой метод заключается в использовании классических табличных операций. Тогда вам придется написать собственное приложение. - person Jens Mühlenhoff; 20.10.2016