Tablice CFMK i CFMP mają tendencję do szybkiego rozrastania się. W jednym z systemów SAP ERP tablica CFMP urosła do ponad 300 milionów rekordów po niespełna pół roku pracy produktywnej. To na prawdę imponujący rezultat. Tak duża wielkość tej tablicy m.in. efektywnie uniemożliwiła wykonanie kopii mandanta oraz zaczęła zagrażać brakiem miejsca na dyskach. W poniższym artykule przedstawiam metodę na szybką i efektywną redukcję rozmiaru tych tablic.
Po przekopaniu zasobów Internetu i przeanalizowaniu tych tablic okazało się, że przytłaczająca większość wpisów wynikała z logów przetwarzania informacji wyjściowych, np. wydruków. W systemie dostępny jest raport RSCLCMFP, który usuwa zbędne logi przetwarzania informacji wyjściowych. Ten raport usuwa wszystkie rekordy z tablic CMFK i CMFP, dla których:
- CMFK-APLID = ‘WFMC’
- Dla rekordu z tablicy CMFK, nie istnieje rekord w tablicy NAST. Rekordy z tablicy NAST są wyszukiwane wg warunku NAST-CMFPNR = CMFK-NR.
Raport RSCLCMFP jest opisany w nocie 52114 – Table CMFP has too many entries for APLID=’WFMC’. Niestety nie radzi sobie z dużymi ilościami danych w tablicach CMFK i CMFP, nawet po implementacji noty 540266 – RSCLCMFP: Poor performance. Podstawowym problemem tego raportu jest to, że najpierw wczytuje do tablicy wewnętrznej wszystkie logi, które mają zostać usunięte. Przy bardzo dużych rozmiarach tablic CFMK i CFMP, jak w moim przypadku, powoduje to przerwanie działania programu i short dump.
W związku z tym przygotowałem własną wersję tego narzędzia. Składa się ona z dwóch raportów:
Analiza tablicy CMFK w stosunku do NAST i zapisanie numerów zbędnych rekordów do tymczasowego pliku:
REPORT ZPROG01. DATA: lt_nast TYPE HASHED TABLE OF na_cmf_nr WITH UNIQUE DEFAULT KEY, lv_nr TYPE na_cmf_nr, file TYPE string VALUE '/tmp/cmfk'. START-OF-SELECTION. OPEN DATASET file FOR OUTPUT IN TEXT MODE ENCODING DEFAULT. SELECT DISTINCT cmfpnr INTO TABLE lt_nast FROM nast. SELECT nr INTO lv_nr FROM cmfk WHERE aplid = 'WFMC'. READ TABLE lt_nast TRANSPORTING NO FIELDS FROM lv_nr. IF sy-subrc <> 0. TRANSFER lv_nr TO file. ENDIF. ENDSELECT. CLOSE DATASET file.
Usunięcie zbędnych rekordów z CMFK i CMFP na podstawie danych z pliku tymczasowego:
REPORT ZPROG02. DATA: lv_nr TYPE na_cmf_nr, file TYPE string VALUE '/tmp/cmfk'. START-OF-SELECTION. OPEN DATASET file FOR INPUT IN TEXT MODE ENCODING DEFAULT. DO. READ DATASET file INTO lv_nr. IF sy-subrc <> 0. EXIT. ENDIF. DELETE FROM cmfk WHERE aplid = 'WFMC' AND nr = lv_nr. DELETE FROM cmfp WHERE aplid = 'WFMC' AND nr = lv_nr. COMMIT WORK. ENDDO. CLOSE DATASET file.
Wykorzystując te dwa raporty udało się odzyskać ponad 70GB miejsca na dysku, redukując ilość wpisów w tablicy CMFP do ok. 160 tysięcy z ponad 300 milionów.