Вход в личный кабинет:

Забыли пароль? | Регистрация

Адреса компании:

Санкт-Петербург

196158, Санкт-Петербург,
Пулковское шоссе, д. 30,
корп. 4, Лит. А, офис 203

Тел: +7 812 414 95 41

Москва

129085, г. Москва, проезд Ольминского, д. 3а, стр. 3, офис 706

Тел: +7 495 616 00 53

Блог

26.08.2015

Progress OpenEdge: промышленные средства репликации данных в Oracle и MS-SQL

Progress OpenEdge Pro2 Replication

Читать далее →




Десять причин перехода на новые версии OpenEdge (Progress)


Производительность кода ABL – подсчет количества записей

Вернуться к списку постов

22.06.2012

Если Вам необходимо подсчитать все записи в таблице, Вы можете использовать несколько различных методов, как показано в приведенных примерах.

Метод 1. Использование CAN-FIND

DEF VAR loop AS INT NO-UNDO.
DEF VAR cnt  AS INT NO-UNDO.
DEF VAR end-num LIKE order.ordernum.
ETIME(TRUE).
FIND LAST order NO-LOCK.
end-num = order.ordernum.
DO loop = 1 TO end-num :
IF CAN-FIND ( order WHERE ordernum = loop )
THEN cnt = cnt + 1.
END.
DISPLAY cnt ETIME.

Метод 2. Использование QUERY / GET NEXT

DEF VAR cnt  AS INT NO-UNDO.
DEF QUERY q FOR order.
ETIME(TRUE).
OPEN QUERY q FOR EACH order NO-LOCK.
GET FIRST q.
cnt = 1.
DO WHILE TRUE:
GET NEXT q.
IF AVAIL order THEN cnt = cnt + 1.
ELSE LEAVE.
END.
DISPLAY cnt ETIME.

Метод 3. Использование SELECT

ETIME(TRUE).
SELECT COUNT (*) FROM order.
PAUSE 0.
DISPLAY ETIME.

Метод 4. Использование FOR EACH / ACCUMULATE

ETIME(TRUE).
FOR EACH order NO-LOCK:
ACCUMULATE ordernum (COUNT).
END.
DISPLAY ACCUM COUNT order.ordernum ETIME.

Метод 5. Использование FOR EACH и счетчика

DEF VAR cnt  AS INT NO-UNDO.
ETIME(TRUE).
FOR EACH order NO-LOCK:
cnt = cnt + 1.
END.
DISPLAY cnt ETIME.

Метод 6. Использование QUERY PRESELECT и NUM-RESULTS

DEF QUERY q FOR order SCROLLING.
ETIME(TRUE).
OPEN QUERY q PRESELECT EACH order NO-LOCK.
DISPLAY NUM-RESULTS ("q") ETIME.

В качестве базового метода, согласно рекомендациям Дэна Формана, принят метод 1.

Он является самым медленным, так как функция CAN-FIND на каждой итерации устанавливает позицию индексного курсора заново, тогда как при перемещении по записям с помощью FOR EACH или QUERY на каждой итерации происходит лишь перемещение индексного курсора на следующую позицию.

Кроме того, для использования метода 1 требуется наличие соответствующего уникального ключа для поиска последней записи.

Те же самые методы (кроме метода 1) могут быть использованы для подсчета записей, удовлетворяющих некоторому условию/фильтру.

Затраты на подсчет количества записей в больших таблицах могут быть очень значительны. В этом случае следует рассмотреть возможность введения специальной таблицы счетчиков, которые будут обновляться в триггерах CREATE и DELETE. В этом случае выполнять подсчет записей не требуется, Вы должны лишь прочитать соответствующую запись счетчика. К сожалению, этот метод не может быть использован для подсчета записей с учетом действующего фильтра. Точнее, это возможно лишь для заранее определенного ограниченного набора фильтров, так как требует поддержки соответствующей логики в коде триггеров.

Измерение производительности методов выполнялось по таблице Order базы Sports2000 (около 4000 записей), каждый тест выполнялся 22 раза, лучший и худший результаты отбрасывались.

Результаты измерений (выигрыш в производительности по сравнению с методом 1) приведены в таблице. Для справки в таблицу также приведены результаты Дэна Формана для методов. Следует отметить довольно значительное различие в цифрах результатов, но качественная картина совпадает.

Наиболее быстрым методом является метод 6.

Тест

Авторский тест, %

Dan Foreman, %

Метод 1 — CAN-FIND

Base

Base

Метод 2 — QUERY / GET NEXT

49

22

Метод 3 – SELECT

51

25

Метод 4 — FOR EACH / ACCUMULATE

55

25

Метод 5 — FOR EACH и счетчик

57

Метод 6 — QUERY PRESELECT и NUM-RESULTS

64

45

И еще пара замечаний. Во-первых, в моих тестах метод 4 работал несколько быстрее, чем метод 3. Дэн Форман таких различий не выявил. И во-вторых, подсчет записей в цикле FOR EACH «вручную» оказался немного быстрее, чем при использовании ACCUMULATE.

Александр Леоненко


Добавить свой комментарий

Ваше имя*:
Ваш E-mail*:
Ваш комментарий*:

Компьютерные системы для бизнеса
© 2010 - 2017 Все права на материалы, находящиеся на этом сайте, охраняются в соответствии с законодательством РФ, в том числе, об авторском праве и смежных правах. При любом использовании материалов сайта ссылка на источник обязательна.