Usuń wpisy z itab1 których nie ma w itab2

Jeśli programujesz, administrujesz, integrujesz i masz wątpliwość lub obawę, to właśnie najlepsze miejsce dla Ciebie. Pisz śmiało...
emil
Posty: 133
Rejestracja: pt gru 27, 2019 11:02 am
Has thanked: 29 times
Been thanked: 42 times

Usuń wpisy z itab1 których nie ma w itab2

Post autor: emil »

Mam dwie tabele, każda ma tylko jedną kolumnę i zawiera pernr`s.
itab1 ma 40k^ wpisów, itab2 około 200 wpisów.
Jeśli jakiś wpis w itab1 nie istnieje w itab2, należy go usunąć z itab1.

Nie chcę lecieć loopem 40k^ razy.
Gdzieś mi się zapodziała w pamięci i notatkach składania na wydajne wywalenie tego, co mi zbędne.
Jak to było?
delete from itab1 where pernr not in @itab2 ? coś w tym kierunku?
K602
Posty: 135
Rejestracja: śr sie 24, 2022 11:50 am
Has thanked: 60 times
Been thanked: 86 times
Kontakt:

Re: Usuń wpisy z itab1 których nie ma w itab2

Post autor: K602 »

Proponuję coś takiego. Nie zawsze jednolinijkowe komendy są najoptymalniesze:

Prerekwizyty: Obie tabele SORTED po tym samym kluczu.

Kod: Zaznacz cały

*-- Złożoność O(n log(n))
LOOP AT lt_tab_mniejsza ASSIGNING FIELD-SYMBOL(<fs_tab_mniejsza>).
  DATA(lv_index) = sy-tabix.

  ASSIGN lt_tab_wieksza[ KEY primary_key table_line = <fs_tab_mniejsza> ] TO FIELD-SYMBOL(<fs_tab_wieksza>).
  IF NOT sy-subrc EQ 0.
    DELETE lt_tab_mniejsza INDEX lv_index.
  ENDIF.
ENDLOOP.
P.S. Jak nałożysz na siebie wykresy n i log(n) to zobaczysz, dlaczego zaczynam od mniejszej tabeli (dla niej złożoność obliczeniowa to n).
SAP ABAP Certified Developer
dominik.tylczynski
Posty: 8350
Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 1922 times
Been thanked: 1476 times
Kontakt:

Re: Usuń wpisy z itab1 których nie ma w itab2

Post autor: dominik.tylczynski »

K602 pisze: pn gru 19, 2022 11:47 am Proponuję coś takiego. Nie zawsze jednolinijkowe komendy są najoptymalniesze:

Prerekwizyty: Obie tabele SORTED po tym samym kluczu.

Kod: Zaznacz cały

*-- Złożoność O(n log(n))
LOOP AT lt_tab_mniejsza ASSIGNING FIELD-SYMBOL(<fs_tab_mniejsza>).
  DATA(lv_index) = sy-tabix.

  ASSIGN lt_tab_wieksza[ KEY primary_key table_line = <fs_tab_mniejsza> ] TO FIELD-SYMBOL(<fs_tab_wieksza>).
  IF NOT sy-subrc EQ 0.
    DELETE lt_tab_mniejsza INDEX lv_index.
  ENDIF.
ENDLOOP.
P.S. Jak nałożysz na siebie wykresy n i log(n) to zobaczysz, dlaczego zaczynam od mniejszej tabeli (dla niej złożoność obliczeniowa to n).
Coś tutaj chyba nie trybi - usuwasz z mniejszej tabeli a kasowane miały być rekordy z większej.
dominik.tylczynski
Posty: 8350
Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 1922 times
Been thanked: 1476 times
Kontakt:

Re: Usuń wpisy z itab1 których nie ma w itab2

Post autor: dominik.tylczynski »

Możesz zastosować operator FILTER z tablicą - SAP Help FILTER - Filter Table
K602
Posty: 135
Rejestracja: śr sie 24, 2022 11:50 am
Has thanked: 60 times
Been thanked: 86 times
Kontakt:

Re: Usuń wpisy z itab1 których nie ma w itab2

Post autor: K602 »

dominik.tylczynski pisze: pn gru 19, 2022 12:22 pm Coś tutaj chyba nie trybi - usuwasz z mniejszej tabeli a kasowane miały być rekordy z większej.
Chodzi mi o zasadę :)
SAP ABAP Certified Developer
K602
Posty: 135
Rejestracja: śr sie 24, 2022 11:50 am
Has thanked: 60 times
Been thanked: 86 times
Kontakt:

Re: Usuń wpisy z itab1 których nie ma w itab2

Post autor: K602 »

dominik.tylczynski pisze: pn gru 19, 2022 12:27 pm Możesz zastosować operator FILTER z tablicą - SAP Help FILTER - Filter Table
Pomysł dobry, ale tworzymy wtedy nową tabelę... wydaje mi się, że jednak usuwanie po indeksach, w tej samej tabeli, będzie szybsze...
SAP ABAP Certified Developer
wojtas7
Posty: 1061
Rejestracja: pt mar 14, 2008 12:51 pm
Has thanked: 71 times
Been thanked: 315 times

Re: Usuń wpisy z itab1 których nie ma w itab2

Post autor: wojtas7 »

K602 pisze: pn gru 19, 2022 11:47 am P.S. Jak nałożysz na siebie wykresy n i log(n) to zobaczysz, dlaczego zaczynam od mniejszej tabeli (dla niej złożoność obliczeniowa to n).
z innej beczki, niesamowite jest to że w branży abaperów jest tak mało profesjonalistów, w sensie ludzi którzy skończyli normalnie studia informatyczne kierunek programowania i potrafią jeszcze tak podchodzić do tematu jak złożoność obliczeniowa itp. Wokół mnie jest mnóstwo programistów abaperów w różnych projektach i jestem pewien że 90% z nich nie ma o tym pojęcia.
wojtas7
Posty: 1061
Rejestracja: pt mar 14, 2008 12:51 pm
Has thanked: 71 times
Been thanked: 315 times

Re: Usuń wpisy z itab1 których nie ma w itab2

Post autor: wojtas7 »

z filter:

https://answers.sap.com/questions/13205 ... nal-t.html

a tu analiza samej definicji tabeli wewnętrznej - też daje radę

http://zevolving.com/2015/07/abap-perfo ... e-on-itab/

Ale serio, 40 k rekordów w tabeli wewnętrznej tylko z jednym polem, to nie jest dużo :-)
Pytanie bardziej skąd te 40 k wpisów się wzięło - jeśli wcześniej czytasz te wpisy z bazy danych, to może już tam trzeba by zwrócić uwagę na wydajność?
emil
Posty: 133
Rejestracja: pt gru 27, 2019 11:02 am
Has thanked: 29 times
Been thanked: 42 times

Re: Usuń wpisy z itab1 których nie ma w itab2

Post autor: emil »

wojtas7 pisze: pn gru 19, 2022 1:51 pm Pytanie bardziej skąd te 40 k wpisów się wzięło - jeśli wcześniej czytasz te wpisy z bazy danych, to może już tam trzeba by zwrócić uwagę na wydajność?
To wynik działania logicznej bazy danych w HCM`ie, czyli lista numerów ewid, które dostaję puszczając na naszym systemie raport "dla wszystkich za cały okres". Na podstawie listy pozyskanych numerów ewid, sprawdzam, czy w tabeli z jakimiś innymi danymi są wpisy dla wspomnianych pernr`ów.
Po pobraniu danych do itab1 (z tym, co wpadło z pnpce) próbuję coś zrobić, by radykalnie zmniejszyć liczbę numerów ewid do sprawdzenia.
dominik.tylczynski
Posty: 8350
Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 1922 times
Been thanked: 1476 times
Kontakt:

Re: Usuń wpisy z itab1 których nie ma w itab2

Post autor: dominik.tylczynski »

To może eliminuj wpisy pobierane z logicznej bazy na bieżąco w trakcie selekcji?
dominik.tylczynski
Posty: 8350
Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 1922 times
Been thanked: 1476 times
Kontakt:

Re: Usuń wpisy z itab1 których nie ma w itab2

Post autor: dominik.tylczynski »

wojtas7 pisze: pn gru 19, 2022 1:38 pm z innej beczki, niesamowite jest to że w branży abaperów jest tak mało profesjonalistów, w sensie ludzi którzy skończyli normalnie studia informatyczne kierunek programowania i potrafią jeszcze tak podchodzić do tematu jak złożoność obliczeniowa itp. Wokół mnie jest mnóstwo programistów abaperów w różnych projektach i jestem pewien że 90% z nich nie ma o tym pojęcia.
Myślę, że w innych branżach (językach programowania) jest podobnie. Sama znajomość składni nie czyni dobrego programisty.
emil
Posty: 133
Rejestracja: pt gru 27, 2019 11:02 am
Has thanked: 29 times
Been thanked: 42 times

Re: Usuń wpisy z itab1 których nie ma w itab2

Post autor: emil »

dominik.tylczynski pisze: pn gru 19, 2022 2:06 pm To może eliminuj wpisy pobierane z logicznej bazy na bieżąco w trakcie selekcji?
Tak też próbowałem, wynik nie jest zadowalający ;)

Wiecie, cała zabawa bierze się stąd, że robię od zera raport, który wcześniej pisały/poprawiały/rozwijały/modyfikowały/(...)/znów rozwijały różne firmy. Doszliśmy do etapu, w którym dodanie czegokolwiek mogło doprowadzić do obłędu ;) A że miałem akurat wolne moce przerobowe - stwierdziłem: spróbuję napisać to od nowa ;>
No i jak widzę, że jakaś część mojego raportu działa wolniej, niż tamta łatana hybryda diabła z motopompą, to mnie ambicja boli ;)
wojtas7
Posty: 1061
Rejestracja: pt mar 14, 2008 12:51 pm
Has thanked: 71 times
Been thanked: 315 times

Re: Usuń wpisy z itab1 których nie ma w itab2

Post autor: wojtas7 »

Zostaw sobie te timestampy jak w przykładzie wyżej i wyłap co tak naprawdę długo się odpala, albo trace włącz ST05 itp. Wątpię żeby loop po 40 k wpisów mulił system.
dominik.tylczynski
Posty: 8350
Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 1922 times
Been thanked: 1476 times
Kontakt:

Re: Usuń wpisy z itab1 których nie ma w itab2

Post autor: dominik.tylczynski »

emil pisze: pn gru 19, 2022 2:28 pm
dominik.tylczynski pisze: pn gru 19, 2022 2:06 pm To może eliminuj wpisy pobierane z logicznej bazy na bieżąco w trakcie selekcji?
Tak też próbowałem, wynik nie jest zadowalający ;)
Z czym dokładnie masz problem przy eliminacji podczas odczytu z logicznej bazy danych? Opisz szczegóły, to spróbujemy pomóc.
dominik.tylczynski
Posty: 8350
Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 1922 times
Been thanked: 1476 times
Kontakt:

Re: Usuń wpisy z itab1 których nie ma w itab2

Post autor: dominik.tylczynski »

wojtas7 pisze: pn gru 19, 2022 1:51 pm Ale serio, 40 k rekordów w tabeli wewnętrznej tylko z jednym polem, to nie jest dużo :-)
Zgadzam się, że sama pętla po 40k rekordów nie powinna stanowić problemu. Ważne natomiast jest to co się robi w tej pętli.

Jeśli zdecydujesz się na pętlę po itab1 i sprawdzanie czy aktualny rekord z itab1 jest w itab2, to zadbaj o maksymalną wydajność tego sprawdzenia np. zrób z itab2 tablicę hashowaną, zastosuj TRANSPORTING NO FIELDS do odczytu z itab2.
ODPOWIEDZ