AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Функционал
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.02.2012, 18:58   #1  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
Я имел в виду поле "Индекс по тексту".

Я так понимаю вы запустили индексацию в фоновом режиме и не останавливали. А как давно? Или пробовали останавливать? И сколько у вас записей в таблице с номенклатурой?

Вообще индексация работает небыстро. Алгоритм перебирает все записи в таблице последовательно, анализирует указанные текстовые поля (разбирает текст на слова по определенному алгоритму), для каждого из найденных слов вставляет минимум одну запись в таблицу + для каждой записи в индексируемой таблице сохраняется по одной записи для каждого слова в названии таблицы + еще одна строчка с указанием на запись + если находится новое слово, то еще одна запись вставляется.

Если у вас есть представление насколько медленные Аксаптовские функции парсинга текстовых переменных, и насколько быстро в принципе может происходить вставка данных в реляционной СУБД, то можете себе это представить. У меня полная реиндексация порядка 25 тысяч записей в двух таблицах занимала около 20 часов. Правда, алгоритм индексации был насильственно принужден индексировать Memo-поля со средней длинной текста около 500 байт, кажется.

Вполне возможно, что ваша индексация застряла на первой таблице и просто еще не добралась до второй. Делайте выводу по поводу скорости индексации и вообще про жизнь.

И еще. В настройке таблиц на первой закладке есть поле типа "Инкрементный" (я русский интерфейс не помню, извините). Так вот если у вас там не стоит галочка — то это плохо. Механизм индексации в таком случае очень неэффективен. Он постоянно переиндексирует все данные. Если же галка стоит, то он переиндексирует только измененные с момента последней индексации записи. При первой индексации это не существенно, но если вы остановите агента и запустите снова, то эффект будет принципиально разным.

И если у вас в индексацию попадут таблицы, данные в которых массово добавляются/удаляются/обновляются, то скорость подхвата изменений движком индексации может вас не устраивать или он вообще не будет успевать их индексировать.

Короче возможности движка ограничены. Он не всемогуч. И это не Яндекс.

Скорость индексации в вашем конкретном случае можете попробовать оценить запуская джобы, которые будут подсчитывать количество записей в таблицах SysSearchName, SysSearchPath, SysSearchRef. В первой уникальный список индексированных слов и прочих комбинаций символов, во второй список ссылок на записи, которые индексированы, в третьей связь какие слова в каких записях встречаются.
__________________
С уважением,
glibs®
За это сообщение автора поблагодарили: Atar (2).
Старый 09.02.2012, 23:55   #2  
dn is offline
dn
Участник
Самостоятельные клиенты AX
 
486 / 159 (6) ++++++
Регистрация: 26.03.2003
Адрес: Москва
Цитата:
Сообщение от glibs Посмотреть сообщение
Правда, алгоритм индексации был насильственно принужден индексировать Memo-поля со средней длинной текста около 500 байт, кажется
Т.е. этот механизм можно использовать для поиска по мемо-полям?
Старый 13.02.2012, 23:54   #3  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2494 (89) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от glibs Посмотреть сообщение
Если у вас есть представление насколько медленные Аксаптовские функции парсинга текстовых переменных, и насколько быстро в принципе может происходить вставка данных в реляционной СУБД, то можете себе это представить.
По-моему, здесь как раз тот случай, когда на сколько бы ни был тормозным x++, но соединение с базой - еще тормознутее

Помимо непосредственно операций вставки в коде еще много поисковых запросов и запросов на удаление.

К примеру, удаление из таблицы sysSearchPath
X++:
    delete_from sysSearchPath
        where sysSearchPath.Design     == design     &&
              sysSearchPath.LanguageId == languageId &&
              sysSearchPath.URL        == URL;
Вроде бы, выглядит все хорошо - один запрос, индексы используются.
Но вот только на таблице висит DeleteAction Cascade для sysSearchRef. И тут же дополнительно появляется неявный запрос на выборку из sysSearchPath с последующим удалением из sysSearchRef.

Или запрос
X++:
sysSearchName = SysSearchName::findRecId(word, design, languageId);
который вызывается для каждого слова, входящего в индексируемые поля
Опять-же - поиск по индексу, на таблице включено кэширование (Found).
Но если количество слов окажется больше размера кэша (2000 записей для сервера, чего при построении индекса по большим таблицам слишком мало), то запросы уже будут идти не в кэш, а на сиквел. И есть подозрение, что при этом кэш начнет активно обновляться.

В общем, регулярные выражения в Аксапте конечно неторопливы, но основные тормоза, в данном случае, не в них

Что бы убедиться, что проблема действительно в количестве обращений к базе данных, переписал код на использование класса System.Text.RegularExpressions.Regex. По тестам чистого разделения строки на слова производительность этого класса раз в 20 была выше на моей системе, чем TextBuffer, плюс еще сделал кое-какую оптимизацию кода.
Но на итоговую скорость выполнения это сказалось крайне слабо - время выполнения улучшилось максимум процентов на 10

Цитата:
Сообщение от glibs Посмотреть сообщение
И еще. В настройке таблиц на первой закладке есть поле типа "Инкрементный" (я русский интерфейс не помню, извините). Так вот если у вас там не стоит галочка — то это плохо. Механизм индексации в таком случае очень неэффективен. Он постоянно переиндексирует все данные. Если же галка стоит, то он переиндексирует только измененные с момента последней индексации записи. При первой индексации это не существенно, но если вы остановите агента и запустите снова, то эффект будет принципиально разным.
Галка показывает, есть на индексируемой таблице поле ModifiedDateTime или нет. Это дисплейный метод и влиять на него мы может только включением/выключением ModifiedDateTime на таблице
(Просто уточняю на всякий случай)
__________________
Axapta v.3.0 sp5 kr2
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Поиск набором в выпадающем списке.. propeller DAX: Программирование 0 04.04.2011 17:31
Поиск работает, а сортировка нет :mad: chanchala DAX: Программирование 1 26.01.2010 14:54
Деловые отношения. Поиск дубликатов. AX 2009 Alexx7 DAX: Функционал 3 25.11.2009 10:33
"поиск" braathe DAX: Программирование 6 24.03.2006 13:07
Поиск по полю временной таблицы Swetik DAX: Программирование 2 10.12.2003 11:35
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 10:39.