В этой статье я решил написать пример, как не нужно писать SQL запросы в ABAP. Для примера взял кусок кода с SQL запросом из реальной Z программы и на его основе поставил эксперимент.
Итак, есть вот такой SQL:
Итак, делаем пример с замерами:
Конечно, ерунда, но! Давайте воспользуемся средствами ABAP и откажемся от вложенного SQL запроса. Меняем код:
Очень надеюсь, что данная статья кому-то будет полезна при составлении SQL запросов для известных алгоритмов
Полный код программы
Итак, есть вот такой SQL:
SELECT *
INTO ls_mseg
FROM mseg AS m
.
SELECT SINGLE mblnr
INTO ls_mseg-mblnr
FROM mseg
WHERE smbln = ls_mseg-mblnr
AND sjahr = ls_mseg-mjahr
AND smblp = ls_mseg-zeile.
CHECK sy-subrc <> 0.
* ToDo
ENDSELECT.
По сути, этот алгоритм отсеивает документы сторно. Я намеренно убрал все условия WHERE из первого оператора SELECT для наглядности.Итак, делаем пример с замерами:
GET RUN TIME FIELD t1.
SELECT *
INTO ls_mseg
FROM mseg AS m
.
SELECT SINGLE mblnr
INTO ls_mseg-mblnr
FROM mseg
WHERE smbln = ls_mseg-mblnr
AND sjahr = ls_mseg-mjahr
AND smblp = ls_mseg-zeile.
CHECK sy-subrc <> 0.
CNT = CNT + 1.
ENDSELECT.
GET RUN TIME FIELD t2.
t2 = t2 - t1.
WRITE: / 'EXECUTION TIME:', t2.
WRITE: / 'RECORDS COUNT:', CNT.
Что бы не быть голословным, я посчитал время выполнения всего этого куска и количество записей, которое он вернул:EXECUTION TIME: 2.545.691
RECORDS COUNT: 9.093
Итак, условно у нас 9 тысяч записей за 2.5 млн микросекунд.Конечно, ерунда, но! Давайте воспользуемся средствами ABAP и откажемся от вложенного SQL запроса. Меняем код:
GET RUN TIME FIELD t1.
SELECT *
INTO ls_mseg
FROM mseg AS m
WHERE
NOT EXISTS (
SELECT *
FROM mseg
WHERE smbln = m~mblnr
AND sjahr = m~mjahr
AND smblp = m~zeile
)
.
CNT = CNT + 1.
ENDSELECT.
GET RUN TIME FIELD t2.
t2 = t2 - t1.
WRITE: / 'EXECUTION TIME:', t2.
WRITE: / 'RECORDS COUNT:', CNT.
И снова для наглядности приведем цифры:EXECUTION TIME: 440.612
RECORDS COUNT: 9.093
В итоге получаем те же строчки, но за какое время?Очень надеюсь, что данная статья кому-то будет полезна при составлении SQL запросов для известных алгоритмов
Полный код программы
REPORT zztest.
START-OF-SELECTION.
DATA: ls_mseg TYPE mseg.
DATA: t1 TYPE i
, t2 TYPE i
, CNT TYPE i
.
CNT = 0.
GET RUN TIME FIELD t1.
SELECT *
INTO ls_mseg
FROM mseg AS m
WHERE
NOT EXISTS (
SELECT *
FROM mseg
WHERE smbln = m~mblnr
AND sjahr = m~mjahr
AND smblp = m~zeile
)
.
* SELECT SINGLE mblnr
* INTO ls_mseg-mblnr
* FROM mseg
* WHERE smbln = ls_mseg-mblnr
* AND sjahr = ls_mseg-mjahr
* AND smblp = ls_mseg-zeile.
* CHECK sy-subrc <> 0.
CNT = CNT + 1.
ENDSELECT.
GET RUN TIME FIELD t2.
t2 = t2 - t1.
WRITE: / 'EXECUTION TIME:', t2.
WRITE: / 'RECORDS COUNT:', CNT.
Комментарии
Отправить комментарий