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?
Usuń wpisy z itab1 których nie ma w itab2
Re: Usuń wpisy z itab1 których nie ma w itab2
Proponuję coś takiego. Nie zawsze jednolinijkowe komendy są najoptymalniesze:
Prerekwizyty: Obie tabele SORTED po tym samym kluczu.
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).
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.
SAP ABAP Certified Developer
-
- Posty: 8026
- Rejestracja: wt kwie 03, 2007 4:05 pm
- Has thanked: 1759 times
- Been thanked: 1383 times
Re: Usuń wpisy z itab1 których nie ma w itab2
Coś tutaj chyba nie trybi - usuwasz z mniejszej tabeli a kasowane miały być rekordy z większej.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.
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).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.
-
- Posty: 8026
- Rejestracja: wt kwie 03, 2007 4:05 pm
- Has thanked: 1759 times
- Been thanked: 1383 times
Re: Usuń wpisy z itab1 których nie ma w itab2
Możesz zastosować operator FILTER z tablicą - SAP Help FILTER - Filter Table
Re: Usuń wpisy z itab1 których nie ma w itab2
Chodzi mi o zasadę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.

SAP ABAP Certified Developer
Re: Usuń wpisy z itab1 których nie ma w itab2
Pomysł dobry, ale tworzymy wtedy nową tabelę... wydaje mi się, że jednak usuwanie po indeksach, w tej samej tabeli, będzie szybsze...dominik.tylczynski pisze: ↑pn gru 19, 2022 12:27 pm Możesz zastosować operator FILTER z tablicą - SAP Help FILTER - Filter Table
SAP ABAP Certified Developer
-
- Posty: 997
- Rejestracja: pt mar 14, 2008 12:51 pm
- Has thanked: 70 times
- Been thanked: 285 times
Re: Usuń wpisy z itab1 których nie ma w itab2
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.
-
- Posty: 997
- Rejestracja: pt mar 14, 2008 12:51 pm
- Has thanked: 70 times
- Been thanked: 285 times
Re: Usuń wpisy z itab1 których nie ma w itab2
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ść?
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ść?
Re: Usuń wpisy z itab1 których nie ma w itab2
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.
-
- Posty: 8026
- Rejestracja: wt kwie 03, 2007 4:05 pm
- Has thanked: 1759 times
- Been thanked: 1383 times
Re: Usuń wpisy z itab1 których nie ma w itab2
To może eliminuj wpisy pobierane z logicznej bazy na bieżąco w trakcie selekcji?
-
- Posty: 8026
- Rejestracja: wt kwie 03, 2007 4:05 pm
- Has thanked: 1759 times
- Been thanked: 1383 times
Re: Usuń wpisy z itab1 których nie ma w itab2
Myślę, że w innych branżach (językach programowania) jest podobnie. Sama znajomość składni nie czyni dobrego programisty.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.
Re: Usuń wpisy z itab1 których nie ma w itab2
Tak też próbowałem, wynik nie jest zadowalającydominik.tylczynski pisze: ↑pn gru 19, 2022 2:06 pm To może eliminuj wpisy pobierane z logicznej bazy na bieżąco w trakcie selekcji?

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

No i jak widzę, że jakaś część mojego raportu działa wolniej, niż tamta łatana hybryda diabła z motopompą, to mnie ambicja boli

-
- Posty: 997
- Rejestracja: pt mar 14, 2008 12:51 pm
- Has thanked: 70 times
- Been thanked: 285 times
Re: Usuń wpisy z itab1 których nie ma w itab2
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.
-
- Posty: 8026
- Rejestracja: wt kwie 03, 2007 4:05 pm
- Has thanked: 1759 times
- Been thanked: 1383 times
Re: Usuń wpisy z itab1 których nie ma w itab2
Z czym dokładnie masz problem przy eliminacji podczas odczytu z logicznej bazy danych? Opisz szczegóły, to spróbujemy pomóc.emil pisze: ↑pn gru 19, 2022 2:28 pmTak też próbowałem, wynik nie jest zadowalającydominik.tylczynski pisze: ↑pn gru 19, 2022 2:06 pm To może eliminuj wpisy pobierane z logicznej bazy na bieżąco w trakcie selekcji?![]()
-
- Posty: 8026
- Rejestracja: wt kwie 03, 2007 4:05 pm
- Has thanked: 1759 times
- Been thanked: 1383 times
Re: Usuń wpisy z itab1 których nie ma w itab2
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.