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_openedge 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_openedge запрос исключает условие ЕСЛИ из запросов 9X_openedge и позволяет более эффективно использовать 9X_progress-4gl доступные индексы.

10
0

Ответ #2

Ответ на вопрос: Openedge: условие If..then в Open Query — проблема с производительностью

Наверное.

Как написано, предложение WHERE 9X_progress-4gl будет использовать первичный индекс для 9X_openedge выполнения поиска ПО ВСЕМ ИНДЕКСАМ (" сканирование 9X_progress-4gl таблицы") и запускать логику IF для 9X_openedge каждой записи.

Чтобы увидеть это, используйте 9X_openedge "COMPILE program.p XREF program.xrf" и 9X_progress-4gl найдите строки в выводе XREF, содержащие 9X_openedge SEARCH.

Медленно это или нет, зависит от 9X_progress-4gl вашего определения медленности и количества 9X_progress-4gl записей в таблице.

8
0