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 запроса?
4
0
2
Общее количество ответов: 2

Ответ #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 доступные индексы.

10
0

Ответ #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 записей в таблице.

8
0