Openedge: условие If..then в Open Query — проблема с производительностью
open query q for each notepad no-lock where notepad.ctrl-code = pCode and (if pE-num = 0 then notepad.k-num = pk-num else notepad.e-num = pe-num)
мой вопрос заключается в том, будет ли условие 9X_progress-4gl if в предложении where замедлять выполнение 9X_progress-4gl запроса?
Ответ #1
Ответ на вопрос: Openedge: условие If..then в Open Query — проблема с производительностью
Простой ответ: да, если это достаточно большая 9X_openedge таблица.
Вместо этого вам следует подумать 9X_openedge о написании динамического запроса:
IF pE-num = 0 THEN QUERY q:QUERY-PREPARE ("for each notepad no-lock where notepad.ctrl-code = pCode and notepad.k-num = pk-num") . ELSE QUERY q:QUERY-PREPARE ("for each notepad no-lock where notepad.ctrl-code = pCode and notepad.e-num = pe-num") . QUERY q:QUERY-OPEN() .
Динамический 9X_progress-4gl запрос исключает условие ЕСЛИ из запросов 9X_openedge и позволяет более эффективно использовать 9X_progress-4gl доступные индексы.
Ответ #2
Ответ на вопрос: Openedge: условие If..then в Open Query — проблема с производительностью
Наверное.
Как написано, предложение WHERE 9X_openedge будет использовать первичный индекс для 9X_progress-4gl выполнения поиска ПО ВСЕМ ИНДЕКСАМ (" сканирование 9X_progress-4gl таблицы") и запускать логику IF для 9X_openedge каждой записи.
Чтобы увидеть это, используйте 9X_openedge "COMPILE program.p XREF program.xrf" и 9X_progress-4gl найдите строки в выводе XREF, содержащие 9X_progress-4gl SEARCH.
Медленно это или нет, зависит от 9X_openedge вашего определения медленности и количества 9X_openedge записей в таблице.