Hola.
Yo lo primero que haría sería intentar quitar ese SELECT... ENDSELECT. Y cambiarlo por un LOOP a una tabla interna, mas viendo la cantidad de registros a los que accede.
Pero... sin modificar mucho tu código de pongo un ejemplo de lo que puedes hacer.
Simplemente sería hacer paquetes de 5.000 registros, como por ejemplo...
RANGES r_matnr_tmp FOR r_matnr.
DATA: lf_lines TYPE i.
DATA: lf_desde TYPE i,
lf_hasta TYPE i.
DO.
CLEAR: r_matnr_tmp[], r_matnr_tmp.
lf_desde = lf_hasta + 1.
lf_hasta = 5000 + lf_hasta.
APPEND LINES OF r_matnr FROM lf_desde TO lf_hasta TO r_matnr_tmp.
DESCRIBE TABLE r_matnr_tmp LINES lf_lines.
IF lf_lines = 0.
EXIT.
ENDIF.
SELECT * FROM cdhdr WHERE objectclas EQ 'MATERIAL'
AND objectid IN r_matnr_tmp.
CHECK cdhdr-change_ind = 'U'.
CHECK cdhdr-udate IN s_laeda.
MOVE-CORRESPONDING cdhdr TO i_cdhdr.
APPEND i_cdhdr.
ENDSELECT.
ENDDO.