Performance of a report over a multicube?
Hi,
I have a report built on a multiprovider which sits over 3 ODS.This query takes a long time to run.
To improve the performance...i was thinking of changing the indexes for ODS..
And i cannot think of changing the query design..cuz i dont have an idea of query requirement..
I am only here for Tuning..
So r there anyother ways of improving the performance..
Thanks,
Sai.
Hi.
Creating index enhances the performance. Also since it is ODs, check in settings whether Bex reporting is ticked.. If not selected.. and you are running reports.. it creats SIDs at the time of reporting and the performance gets affected.
Also go thru this How to build an efficient queries on multiprovider.this is a general document for the queries either Infocube/ODS built on multiprovider.
https://websmp202.sap-ag.de/~sapdownload/011000358700009385892004E/HowToMultiProvider.pdf
Hope it helps. Plz assign points if it is helpful for u.
Thanks & Regarda,
Pradeep.E
Similar Messages
-
Unable to print crystal report over web using ActiveX Control
Post Author: jimmyp
CA Forum: General
We have a problem with printing crystal report over web using ActiveX Control. When clicking print button, it only shows a blank dialog web crystal viewer page without any error. The page just simply hangs. We installed the PrintControl DLL and enable all the security setting for ActiveX Control for IE. It still does not print. Does anyone know why?
Environment.
Bundle Crystal Report v10
Asp.net 2.0
IE 6.0 or higher.
Appreciate for your help.
JimmyPost Author: Ian Kulmatycki
CA Forum: General
A team member here found this, I haven't read it, I'm not sure if our problems are related to this, but hopefully it helps someone:
-ian
When Secure Sockets Layer (SSL) is enabled, using the ActiveX control to print reports from a Crystal 10 DHTML viewer results in the following error message:
"A communication error occurred, printing will be stopped."
How can this error message be resolved?
Resolution
This is a known issue with Crystal Reports 10 and Crystal Enterprise 10 viewers and has been tracked. The Track ID is ADAPT00282199.
This error occurs due to the receiving application performing a case-sensitive check for the HTTPS request header value "ON". When a sender application sends the value as "on" in lower case, the error occurs. The update below changes the receiving application to be case-insensitive.
Hot Fixes or Service Packs address this issue as indicated below. With the updates, this issue is resolved.
Unless indicated otherwise, Weekly Hot Fix updates from our FTP site have only been tested with English versions of products.
For Crystal Reports 10 and Crystal Enterprise 10, the update for this issue is included in the Crystal 10 Viewers Weekly Hot Fix (WHF). This is available in English only at the following location:
ftp://ftp.crystaldecisions.com/outgoing/EHF/viewers10win_en.zip
This issue is addressed in the following components (and later versions):
PageObjectModel.dll, version 10.0.5.785, dated 8/25/2004
ReportRenderer.dll, version 10.0.5.785, dated 8/25/2004
WebReporting.dll, version 10.0.5.785, dated 8/25/2004 -
Plz increase performance of this report
hi all
i want to know how can i improve the performance of my report.
the code is given below and it takes so much time on production even for single record
plz help
HERE COMES THE CODE
*& Report ZGRSTATUS
REPORT ZGRSTATUS.
TYPE-POOLS slis.
TABLES: mseg, qamb, mkpf, rseg.
DATA : BEGIN OF itab OCCURS 0,
mblnr LIKE mseg-mblnr,
zeile LIKE mseg-zeile,
uom LIKE mseg-erfme,
matnr LIKE mseg-matnr,
recqty LIKE mseg-erfmg,
qcins LIKE mseg-insmk, "INSPECTION SIGN
ebeln LIKE mseg-ebeln,
ebelp LIKE mseg-ebelp,
lifnr LIKE mseg-lifnr,
budat LIKE mkpf-budat,
txz01 LIKE ekpo-txz01,
name1 LIKE lfa1-name1,
accqty LIKE mseg-erfmg,
rejqty LIKE mseg-erfmg,
belnr LIKE rseg-belnr,
dqty LIKE mseg-menge,
cqty LIKE mseg-menge,
qcdat like mkpf-budat,
miro_budat like rbkp-budat,
accuom like mseg-erfme,
rejuom like mseg-erfme,
qcstat like mseg-insmk,
acstat(1) type c,
crnote(1) type c,
END OF itab.
DATA : BEGIN OF itab1 OCCURS 0,
mblnr LIKE mseg-mblnr,
zeile LIKE mseg-zeile,
mjahr LIKE mseg-mjahr,
prueflos like qamb-prueflos,
END OF itab1.
DATA: BEGIN OF imiro OCCURS 0,
belnr LIKE rseg-belnr,
lfbnr LIKE rseg-lfbnr, "DOCMENT NO SAME AS MBLRN
shkzg LIKE rseg-shkzg, "DEBIT CREDIT SIGN
menge LIKE rseg-menge,
ebeln LIKE rseg-ebeln,
ebelp LIKE rseg-ebelp,
budat LIKE rbkp-budat,
END OF imiro.
data: begin of iins occurs 0, "NEW INTERNAL TABLE DECLARED for inspection lot numbers
mblnr like mseg-mblnr,
zeile like mseg-zeile,
prueflos like qamb-prueflos,
mjahr like qamb-mjahr,
end of iins.
****************************CODE FOR SELECTION SCREEN****************************
selection-screen begin of block par1 WITH FRAME TITLE TEXT-001.
PARAMETERS : plant LIKE mseg-werks OBLIGATORY DEFAULT 'MFPL'.
PARAMETERS: year LIKE mseg-mjahr OBLIGATORY DEFAULT '2007'.
SELECT-OPTIONS : grno FOR mseg-mblnr,
grdate FOR mkpf-budat,
vendor FOR mseg-lifnr,
item for mseg-matnr.
SELECTION-SCREEN END OF BLOCK par1.
***************************END OF CODE FOR SELECTION SCREEN**********************
*************************FETCHING OF GR INFORMATION FROM MSEG AND MKPF*************************
SELECT amblnr zeile aerfme amatnr aerfmg ainsmk aebeln aebelp alifnr bbudat ctxz01 d~name1
FROM mseg AS a
INNER JOIN mkpf AS b ON amblnr = bmblnr AND amjahr = bmjahr
INNER JOIN ekpo AS c ON aebeln = cebeln AND aebelp = cebelp
INNER JOIN lfa1 as d ON dlifnr = alifnr
INTO TABLE itab
WHERE awerks = plant AND amblnr IN grno AND bwart = '101' AND a~mjahr = year
AND btcode2 = 'MIGO_GR' AND bbudat IN grdate AND alifnr IN vendor and amatnr IN item.
*************************END OF RETERIEVEL***************************************
if sy-subrc <> 0.
Message 'NO RECORD FOUND' type 'E'.
endif.
*******************************SELECTING THE INSPECTED DOC NUMBERS AND CORROSPONDING INSPECTION LOT********************************
select mblnr zeile mjahr prueflos
from qamb into table itab1 for all entries in itab where mblnr = itab-mblnr and zeile = itab-zeile.
**********************************END OF SELECTING THE INSPECTED DOC. NUMBERS & INSPECTION LOTS************************************
**************************SELECTING THE DOC NO FOR ACCEPTED AND REJECTED QTY ACCORDING TO INSPECTION LOT***************************
select mblnr zeile prueflos mjahr into table iins from qamb
for all entries in itab1 where prueflos = itab1-prueflos and mblnr <> itab1-mblnr.
**************************END OF SELECTING ACCEPTED AND REJECTED QTY DOCUMENTS****************************************************
**********************************SELECTING THE DEBIT AND CREDIT QTY FOR THE MIRO TCODE*******************************************
SELECT abelnr lfbnr shkzg menge ebeln ebelp bbudat INTO table imiro
FROM rseg as a
inner join rbkp as b on abelnr = bbelnr
for all entries in itab where a~lfbnr = itab-mblnr.
DATA : v_qcidoc LIKE qamb-prueflos,
v_qcdoc LIKE mseg-mblnr,
v_qcdoc1 LIKE mseg-zeile,
v_qty LIKE mseg-menge,
v_bwart LIKE mseg-bwart,
v_name1 LIKE lfa1-name1,
v_budat like mkpf-budat,
v_newrejqty like mseg-menge,
v_newaccqty like mseg-menge,
CMPACCQTY LIKE MSEG-MENGE,
CMPREJQTY LIKE MSEG-MENGE,
aa TYPE c.
data: begin of iartab occurs 0,
mblnr like mseg-mblnr,
bwart like mseg-bwart,
qty like mseg-menge,
erfme like mseg-erfme,
zeile like mseg-zeile,
budat like mkpf-budat,
end of iartab.
clear iartab.
refresh iartab.
****************************************table for accept and reject qty************************************
SELECT a~mblnr bwart erfmg erfme zeile budat into table iartab
FROM mseg as a
inner join mkpf as b on amblnr = bmblnr
for all entries in iins
WHERE amblnr = iins-mblnr AND azeile = iins-zeile AND xauto <> 'X' AND a~mjahr = iins-mjahr.
******************************************END OF ACCEPT AND REJECTED QTY.***********************************
LOOP AT itab.
clear: itab-accuom, itab-rejuom.
SELECT SINGLE name1 FROM lfa1 INTO itab-name1 WHERE lifnr = itab-lifnr.
**********************GETTING THE ACCEPTED AND REJECTED QTY FROM MSEG FOR ALL RECORDS OF ITAB*********************
IF itab-qcins = 'X'.
clear v_qcidoc.
clear: v_bwart, v_qty, v_budat.
read table itab1 with key mblnr = itab-mblnr zeile = itab-zeile.
if sy-subrc = 0.
v_qcidoc = itab1-prueflos.
endif.
LOOP AT itab1 where prueflos = v_qcidoc and mblnr <> itab-mblnr .
LOOP AT iins where prueflos = v_qcidoc. " and mblnr <> itab-mblnr .
v_qty = 0.
SELECT single bwart erfmg budat
INTO (v_bwart, v_qty, v_budat)
FROM mseg as a
inner join mkpf as b on amblnr = bmblnr
WHERE amblnr = itab1-mblnr AND azeile = itab1-zeile AND xauto <> 'X' AND a~mjahr = itab1-mjahr.
WHERE amblnr = iins-mblnr AND azeile = iins-zeile AND xauto <> 'X' AND a~mjahr = iins-mjahr.
read table iartab with key mblnr = iins-mblnr zeile = iins-zeile.
if sy-subrc = 0.
v_bwart = iartab-bwart.
v_qty = iartab-qty.
v_budat = iartab-budat.
endif.
IF v_bwart = '321'.
v_newaccqty = v_newaccqty + v_qty.
itab-accqty = v_newaccqty.
itab-qcdat = v_budat.
itab-accuom = iartab-erfme.
ELSEIF v_bwart = '122'.
itab-qcdat = v_budat.
v_newrejqty = v_newrejqty + v_qty.
itab-rejqty = v_newrejqty.
itab-rejuom = iartab-erfme.
ENDIF.
ENDLOOP. "*********END OF LOOP FOR ITAB1**************
clear: v_newaccqty, v_newrejqty.
ENDIF. "**********END OF MAIN ENDIF***********************
*****************END OF CODE FOR ACCEPTED AND REJECTED QTY************************************
****************************GETTING DEBIT AND CREDIT QTY******************************************
LOOP AT imiro WHERE lfbnr = itab-mblnr AND ebeln = itab-ebeln AND ebelp = itab-ebelp.
ITAB-MIRO_BUDAT = IMIRO-BUDAT.
itab-belnr = imiro-belnr.
IF imiro-shkzg = 'S'.
itab-dqty = imiro-menge.
ELSEIF imiro-shkzg = 'H'.
itab-cqty = imiro-menge.
ENDIF.
ENDLOOP.
*****************************END OF CODE FOR DEBIT AND CREDIT QTY*******************************
data v_sumqty like mseg-menge.
CLEAR V_SUMQTY.
if itab-qcins = 'X'.
clear: cmpaccqty, cmprejqty.
cmpaccqty = itab-accqty.
cmprejqty = itab-rejqty.
IF ITAB-UOM <> ITAB-ACCUOM AND ITAB-ACCUOM <> SPACE.
CALL FUNCTION 'ZCONVERT_UOM_QTY'
EXPORTING
P_FR_UOM = ITAB-UOM
P_TO_UOM = ITAB-ACCUOM
P_QTY = ITAB-ACCQTY
IMPORTING
P_RETVAL = CMPACCQTY.
ELSEIF ITAB-UOM <> ITAB-REJUOM AND ITAB-REJUOM <> SPACE.
CALL FUNCTION 'ZCONVERT_UOM_QTY'
EXPORTING
P_FR_UOM = ITAB-UOM
P_TO_UOM = ITAB-REJUOM
P_QTY = ITAB-REJQTY
IMPORTING
P_RETVAL = CMPREJQTY.
ENDIF.
v_sumqty = CMPACCQTY + CMPREJQTY.
if ( v_sumqty = itab-recqty ).
itab-qcstat = 'C'.
modify itab.
ELSE.
ITAB-QCSTAT = 'P'.
endif.
ELSE.
ITAB-QCSTAT = 'C'.
endif.
IF ITAB-QCSTAT = 'C'.
IF ITAB-DQTY = ITAB-RECQTY.
ITAB-ACSTAT = 'C'.
ELSE.
ITAB-ACSTAT = 'P'.
ENDIF.
ELSEIF ITAB-QCSTAT = 'P'.
IF ITAB-RECQTY = ITAB-DQTY.
ITAB-ACSTAT = 'O'.
ENDIF.
ENDIF.
IF ITAB-REJQTY > 0.
IF ITAB-ACSTAT = 'C' AND ITAB-REJQTY > ITAB-CQTY.
ITAB-CRNOTE = 'P'.
ELSEIF ITAB-ACSTAT = 'C' AND ITAB-REJQTY < ITAB-CQTY.
ITAB-CRNOTE = 'W'.
ELSEIF ITAB-ACSTAT = 'C' AND ITAB-REJQTY = ITAB-CQTY.
ITAB-CRNOTE = 'C'.
ENDIF.
ELSE.
ITAB-CRNOTE = 'N'.
ENDIF.
MODIFY itab.
ENDLOOP. "*********************************************"END OF MAINT LOOP FOR ITAB.***********************
DATA: it_fieldcat TYPE slis_t_fieldcat_alv,
wa_fieldcat TYPE slis_fieldcat_alv,
wa_layout TYPE slis_layout_alv.
PERFORM f_layout.
PERFORM f_fieldcat.
PERFORM display.
*& Form F_LAYOUT
text
FORM f_layout.
wa_layout-colwidth_optimize = 'X'.
wa_layout-no_subchoice = 'X'.
wa_layout-zebra = 'X'.
ENDFORM. "F_LAYOUT
*& Form F_FIELDCAT
text
FORM f_fieldcat.
DATA wa_col TYPE i VALUE 1.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-seltext_l = 'GR. NO'.
wa_fieldcat-fieldname = 'MBLNR'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-seltext_l = 'GR DATE'.
wa_fieldcat-fieldname = 'BUDAT'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-seltext_l = 'PO NO'.
wa_fieldcat-fieldname = 'EBELN'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-no_zero = 'X'.
wa_fieldcat-seltext_l = 'PARTY ID'.
wa_fieldcat-fieldname = 'LIFNR'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-seltext_l = 'PARTY NAME'.
wa_fieldcat-fieldname = 'NAME1'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-no_zero = 'X'.
wa_fieldcat-outputlen = '18'.
wa_fieldcat-seltext_l = 'ITEM ID'.
wa_fieldcat-fieldname = 'MATNR'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-seltext_l = 'DESCRIPTION'.
wa_fieldcat-fieldname = 'TXZ01'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-seltext_l = 'UOM'.
wa_fieldcat-fieldname = 'UOM'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-seltext_l = 'INS REQ'.
wa_fieldcat-fieldname = 'QCINS'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-no_zero = 'X'.
wa_fieldcat-seltext_l = 'GR QTY'.
wa_fieldcat-fieldname = 'RECQTY'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-seltext_l = 'QC DATE'.
wa_fieldcat-fieldname = 'QCDAT'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-no_zero = 'X'.
wa_fieldcat-seltext_l = 'ACC QTY'.
wa_fieldcat-fieldname = 'ACCQTY'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-no_zero = 'X'.
wa_fieldcat-seltext_l = 'ACC UOM'.
wa_fieldcat-fieldname = 'ACCUOM'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-no_zero = 'X'.
wa_fieldcat-seltext_l = 'REJ QTY'.
wa_fieldcat-fieldname = 'REJQTY'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-no_zero = 'X'.
wa_fieldcat-seltext_l = 'REJ UOM'.
wa_fieldcat-fieldname = 'REJUOM'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-seltext_l = 'MIRO NO'.
wa_fieldcat-fieldname = 'BELNR'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-seltext_l = 'MIRO DATE'.
wa_fieldcat-fieldname = 'MIRO_BUDAT'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-no_zero = 'X'.
wa_fieldcat-seltext_l = 'DB.QTY'.
wa_fieldcat-fieldname = 'DQTY'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-no_zero = 'X'.
wa_fieldcat-seltext_l = 'CR.QTY'.
wa_fieldcat-fieldname = 'CQTY'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat TO it_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-seltext_l = 'QC STATUS'.
wa_fieldcat-fieldname = 'QCSTAT'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat to it_fieldcat.
clear wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-seltext_l = 'A/C STATUS'.
wa_fieldcat-fieldname = 'ACSTAT'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat to it_fieldcat.
clear wa_fieldcat.
wa_fieldcat-col_pos = wa_col + 1.
wa_fieldcat-seltext_l = 'CR NOTE STATUS'.
wa_fieldcat-fieldname = 'CRNOTE'.
wa_fieldcat-tabname = itab.
APPEND wa_fieldcat to it_fieldcat.
clear wa_fieldcat.
ENDFORM. "F_FIELDCAT
*& Form DISPLAY
text
FORM display.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-repid
is_layout = wa_layout
I_CALLBACK_USER_COMMAND = 'HANDLE_USER_COMMAND'
it_fieldcat = it_fieldcat
TABLES
t_outtab = itab.
ENDFORM. "DISPLAY
FORM HANDLE_USER_COMMAND USING R_UCOMM LIKE SY-UCOMM
RS_SELFIELD TYPE SLIS_SELFIELD.
CASE R_UCOMM.
WHEN '&IC1'.
clear itab-ebeln.
IF RS_SELFIELD-FIELDNAME = 'EBELN'.
READ TABLE ITAB INDEX RS_SELFIELD-TABINDEX.
SET PARAMETER ID 'BES' FIELD ITAB-EBELN.
call transaction 'ME23N' AND SKIP FIRST SCREEN.
CLEAR RS_SELFIELD.
ELSEIF RS_SELFIELD-FIELDNAME = 'MBLNR'.
READ TABLE ITAB INDEX RS_SELFIELD-TABINDEX.
SET PARAMETER ID 'MBN' FIELD ITAB-MBLNR.
SET PARAMETER ID 'MJA' FIELD year.
call transaction 'MIGO' AND SKIP FIRST SCREEN.
CLEAR RS_SELFIELD.
ENDIF.
ENDCASE.
ENDFORM. "HANDLE_USER_COMMANDWays of Performance Tuning
1. Selection Criteria
2. Select Statements
Select Queries
SQL Interface
Aggregate Functions
For all Entries
Select Over more than one internal table
Selection Criteria
1. Restrict the data to the selection criteria itself, rather than filtering it out using the ABAP code using CHECK statement.
2. Select with selection list.
SELECT * FROM SBOOK INTO SBOOK_WA.
CHECK: SBOOK_WA-CARRID = 'LH' AND
SBOOK_WA-CONNID = '0400'.
ENDSELECT.
The above code can be much more optimized by the code written below which avoids CHECK, selects with selection list
SELECT CARRID CONNID FLDATE BOOKID FROM SBOOK INTO TABLE T_SBOOK
WHERE SBOOK_WA-CARRID = 'LH' AND
SBOOK_WA-CONNID = '0400'.
Select Statements Select Queries
1. Avoid nested selects
SELECT * FROM EKKO INTO EKKO_WA.
SELECT * FROM EKAN INTO EKAN_WA
WHERE EBELN = EKKO_WA-EBELN.
ENDSELECT.
ENDSELECT.
The above code can be much more optimized by the code written below.
SELECT PF1 PF2 FF3 FF4 INTO TABLE ITAB
FROM EKKO AS P INNER JOIN EKAN AS F
ON PEBELN = FEBELN.
Note: A simple SELECT loop is a single database access whose result is passed to the ABAP program line by line. Nested SELECT loops mean that the number of accesses in the inner loop is multiplied by the number of accesses in the outer loop. One should therefore use nested SELECT loops only if the selection in the outer loop contains very few lines or the outer loop is a SELECT SINGLE statement.
2. Select all the records in a single shot using into table clause of select statement rather than to use Append statements.
SELECT * FROM SBOOK INTO SBOOK_WA.
CHECK: SBOOK_WA-CARRID = 'LH' AND
SBOOK_WA-CONNID = '0400'.
ENDSELECT.
The above code can be much more optimized by the code written below which avoids CHECK, selects with selection list and puts the data in one shot using into table
SELECT CARRID CONNID FLDATE BOOKID FROM SBOOK INTO TABLE T_SBOOK
WHERE SBOOK_WA-CARRID = 'LH' AND
SBOOK_WA-CONNID = '0400'.
3. When a base table has multiple indices, the where clause should be in the order of the index, either a primary or a secondary index.
To choose an index, the optimizer checks the field names specified in the where clause and then uses an index that has the same order of the fields. In certain scenarios, it is advisable to check whether a new index can speed up the performance of a program. This will come handy in programs that access data from the finance tables.
4. For testing existence, use Select.. Up to 1 rows statement instead of a Select-Endselect-loop with an Exit.
SELECT * FROM SBOOK INTO SBOOK_WA
UP TO 1 ROWS
WHERE CARRID = 'LH'.
ENDSELECT.
The above code is more optimized as compared to the code mentioned below for testing existence of a record.
SELECT * FROM SBOOK INTO SBOOK_WA
WHERE CARRID = 'LH'.
EXIT.
ENDSELECT.
5. Use Select Single if all primary key fields are supplied in the Where condition .
If all primary key fields are supplied in the Where conditions you can even use Select Single.
Select Single requires one communication with the database system, whereas Select-Endselect needs two.
Select Statements SQL Interface
1. Use column updates instead of single-row updates
to update your database tables.
SELECT * FROM SFLIGHT INTO SFLIGHT_WA.
SFLIGHT_WA-SEATSOCC =
SFLIGHT_WA-SEATSOCC - 1.
UPDATE SFLIGHT FROM SFLIGHT_WA.
ENDSELECT.
The above mentioned code can be more optimized by using the following code
UPDATE SFLIGHT
SET SEATSOCC = SEATSOCC - 1.
2. For all frequently used Select statements, try to use an index.
SELECT * FROM SBOOK CLIENT SPECIFIED INTO SBOOK_WA
WHERE CARRID = 'LH'
AND CONNID = '0400'.
ENDSELECT.
The above mentioned code can be more optimized by using the following code
SELECT * FROM SBOOK CLIENT SPECIFIED INTO SBOOK_WA
WHERE MANDT IN ( SELECT MANDT FROM T000 )
AND CARRID = 'LH'
AND CONNID = '0400'.
ENDSELECT.
3. Using buffered tables improves the performance considerably.
Bypassing the buffer increases the network considerably
SELECT SINGLE * FROM T100 INTO T100_WA
BYPASSING BUFFER
WHERE SPRSL = 'D'
AND ARBGB = '00'
AND MSGNR = '999'.
The above mentioned code can be more optimized by using the following code
SELECT SINGLE * FROM T100 INTO T100_WA
WHERE SPRSL = 'D'
AND ARBGB = '00'
AND MSGNR = '999'.
Select Statements Aggregate Functions
If you want to find the maximum, minimum, sum and average value or the count of a database column, use a select list with aggregate functions instead of computing the aggregates yourself.
Some of the Aggregate functions allowed in SAP are MAX, MIN, AVG, SUM, COUNT, COUNT( * )
Consider the following extract.
Maxno = 0.
Select * from zflight where airln = LF and cntry = IN.
Check zflight-fligh > maxno.
Maxno = zflight-fligh.
Endselect.
The above mentioned code can be much more optimized by using the following code.
Select max( fligh ) from zflight into maxno where airln = LF and cntry = IN.
Select Statements For All Entries
The for all entries creates a where clause, where all the entries in the driver table are combined with OR. If the number of entries in the driver table is larger than rsdb/max_blocking_factor, several similar SQL statements are executed to limit the length of the WHERE clause.
The plus
Large amount of data
Mixing processing and reading of data
Fast internal reprocessing of data
Fast
The Minus
Difficult to program/understand
Memory could be critical (use FREE or PACKAGE size)
Points to be must considered FOR ALL ENTRIES
Check that data is present in the driver table
Sorting the driver table
Removing duplicates from the driver table
Consider the following piece of extract
Loop at int_cntry.
Select single * from zfligh into int_fligh
where cntry = int_cntry-cntry.
Append int_fligh.
Endloop.
The above mentioned can be more optimized by using the following code.
Sort int_cntry by cntry.
Delete adjacent duplicates from int_cntry.
If NOT int_cntry[] is INITIAL.
Select * from zfligh appending table int_fligh
For all entries in int_cntry
Where cntry = int_cntry-cntry.
Endif.
Select Statements Select Over more than one Internal table
1. Its better to use a views instead of nested Select statements.
SELECT * FROM DD01L INTO DD01L_WA
WHERE DOMNAME LIKE 'CHAR%'
AND AS4LOCAL = 'A'.
SELECT SINGLE * FROM DD01T INTO DD01T_WA
WHERE DOMNAME = DD01L_WA-DOMNAME
AND AS4LOCAL = 'A'
AND AS4VERS = DD01L_WA-AS4VERS
AND DDLANGUAGE = SY-LANGU.
ENDSELECT.
The above code can be more optimized by extracting all the data from view DD01V_WA
SELECT * FROM DD01V INTO DD01V_WA
WHERE DOMNAME LIKE 'CHAR%'
AND DDLANGUAGE = SY-LANGU.
ENDSELECT
2. To read data from several logically connected tables use a join instead of nested Select statements. Joins are preferred only if all the primary key are available in WHERE clause for the tables that are joined. If the primary keys are not provided in join the Joining of tables itself takes time.
SELECT * FROM EKKO INTO EKKO_WA.
SELECT * FROM EKAN INTO EKAN_WA
WHERE EBELN = EKKO_WA-EBELN.
ENDSELECT.
ENDSELECT.
The above code can be much more optimized by the code written below.
SELECT PF1 PF2 FF3 FF4 INTO TABLE ITAB
FROM EKKO AS P INNER JOIN EKAN AS F
ON PEBELN = FEBELN.
3. Instead of using nested Select loops it is often better to use subqueries.
SELECT * FROM SPFLI
INTO TABLE T_SPFLI
WHERE CITYFROM = 'FRANKFURT'
AND CITYTO = 'NEW YORK'.
SELECT * FROM SFLIGHT AS F
INTO SFLIGHT_WA
FOR ALL ENTRIES IN T_SPFLI
WHERE SEATSOCC < F~SEATSMAX
AND CARRID = T_SPFLI-CARRID
AND CONNID = T_SPFLI-CONNID
AND FLDATE BETWEEN '19990101' AND '19990331'.
ENDSELECT.
The above mentioned code can be even more optimized by using subqueries instead of for all entries.
SELECT * FROM SFLIGHT AS F INTO SFLIGHT_WA
WHERE SEATSOCC < F~SEATSMAX
AND EXISTS ( SELECT * FROM SPFLI
WHERE CARRID = F~CARRID
AND CONNID = F~CONNID
AND CITYFROM = 'FRANKFURT'
AND CITYTO = 'NEW YORK' )
AND FLDATE BETWEEN '19990101' AND '19990331'.
ENDSELECT.
1. Table operations should be done using explicit work areas rather than via header lines.
READ TABLE ITAB INTO WA WITH KEY K = 'X BINARY SEARCH.
IS MUCH FASTER THAN USING
READ TABLE ITAB INTO WA WITH KEY K = 'X'.
If TAB has n entries, linear search runs in O( n ) time, whereas binary search takes only O( log2( n ) ).
2. Always try to use binary search instead of linear search. But dont forget to sort your internal table before that.
READ TABLE ITAB INTO WA WITH KEY K = 'X'. IS FASTER THAN USING
READ TABLE ITAB INTO WA WITH KEY (NAME) = 'X'.
3. A dynamic key access is slower than a static one, since the key specification must be evaluated at runtime.
4. A binary search using secondary index takes considerably less time.
5. LOOP ... WHERE is faster than LOOP/CHECK because LOOP ... WHERE evaluates the specified condition internally.
LOOP AT ITAB INTO WA WHERE K = 'X'.
ENDLOOP.
The above code is much faster than using
LOOP AT ITAB INTO WA.
CHECK WA-K = 'X'.
ENDLOOP.
6. Modifying selected components using MODIFY itab TRANSPORTING f1 f2.. accelerates the task of updating a line of an internal table.
WA-DATE = SY-DATUM.
MODIFY ITAB FROM WA INDEX 1 TRANSPORTING DATE.
The above code is more optimized as compared to
WA-DATE = SY-DATUM.
MODIFY ITAB FROM WA INDEX 1.
7. Accessing the table entries directly in a "LOOP ... ASSIGNING ..." accelerates the task of updating a set of lines of an internal table considerably
Modifying selected components only makes the program faster as compared to Modifying all lines completely.
e.g,
LOOP AT ITAB ASSIGNING <WA>.
I = SY-TABIX MOD 2.
IF I = 0.
<WA>-FLAG = 'X'.
ENDIF.
ENDLOOP.
The above code works faster as compared to
LOOP AT ITAB INTO WA.
I = SY-TABIX MOD 2.
IF I = 0.
WA-FLAG = 'X'.
MODIFY ITAB FROM WA.
ENDIF.
ENDLOOP.
8. If collect semantics is required, it is always better to use to COLLECT rather than READ BINARY and then ADD.
LOOP AT ITAB1 INTO WA1.
READ TABLE ITAB2 INTO WA2 WITH KEY K = WA1-K BINARY SEARCH.
IF SY-SUBRC = 0.
ADD: WA1-VAL1 TO WA2-VAL1,
WA1-VAL2 TO WA2-VAL2.
MODIFY ITAB2 FROM WA2 INDEX SY-TABIX TRANSPORTING VAL1 VAL2.
ELSE.
INSERT WA1 INTO ITAB2 INDEX SY-TABIX.
ENDIF.
ENDLOOP.
The above code uses BINARY SEARCH for collect semantics. READ BINARY runs in O( log2(n) ) time. The above piece of code can be more optimized by
LOOP AT ITAB1 INTO WA.
COLLECT WA INTO ITAB2.
ENDLOOP.
SORT ITAB2 BY K.
COLLECT, however, uses a hash algorithm and is therefore independent
of the number of entries (i.e. O(1)) .
9. "APPEND LINES OF itab1 TO itab2" accelerates the task of appending a table to another table considerably as compared to LOOP-APPEND-ENDLOOP.
APPEND LINES OF ITAB1 TO ITAB2.
This is more optimized as compared to
LOOP AT ITAB1 INTO WA.
APPEND WA TO ITAB2.
ENDLOOP.
10. DELETE ADJACENT DUPLICATES accelerates the task of deleting duplicate entries considerably as compared to READ-LOOP-DELETE-ENDLOOP.
DELETE ADJACENT DUPLICATES FROM ITAB COMPARING K.
This is much more optimized as compared to
READ TABLE ITAB INDEX 1 INTO PREV_LINE.
LOOP AT ITAB FROM 2 INTO WA.
IF WA = PREV_LINE.
DELETE ITAB.
ELSE.
PREV_LINE = WA.
ENDIF.
ENDLOOP.
11. "DELETE itab FROM ... TO ..." accelerates the task of deleting a sequence of lines considerably as compared to DO -DELETE-ENDDO.
DELETE ITAB FROM 450 TO 550.
This is much more optimized as compared to
DO 101 TIMES.
DELETE ITAB INDEX 450.
ENDDO.
12. Copying internal tables by using ITAB2[ ] = ITAB1[ ] as compared to LOOP-APPEND-ENDLOOP.
ITAB2[] = ITAB1[].
This is much more optimized as compared to
REFRESH ITAB2.
LOOP AT ITAB1 INTO WA.
APPEND WA TO ITAB2.
ENDLOOP.
13. Specify the sort key as restrictively as possible to run the program faster.
SORT ITAB BY K. makes the program runs faster as compared to SORT ITAB.
Internal Tables contd
Hashed and Sorted tables
1. For single read access hashed tables are more optimized as compared to sorted tables.
2. For partial sequential access sorted tables are more optimized as compared to hashed tables
Hashed And Sorted Tables
Point # 1
Consider the following example where HTAB is a hashed table and STAB is a sorted table
DO 250 TIMES.
N = 4 * SY-INDEX.
READ TABLE HTAB INTO WA WITH TABLE KEY K = N.
IF SY-SUBRC = 0.
ENDIF.
ENDDO.
This runs faster for single read access as compared to the following same code for sorted table
DO 250 TIMES.
N = 4 * SY-INDEX.
READ TABLE STAB INTO WA WITH TABLE KEY K = N.
IF SY-SUBRC = 0.
ENDIF.
ENDDO.
Point # 2
Similarly for Partial Sequential access the STAB runs faster as compared to HTAB
LOOP AT STAB INTO WA WHERE K = SUBKEY.
ENDLOOP.
This runs faster as compared to
LOOP AT HTAB INTO WA WHERE K = SUBKEY.
ENDLOOP. -
Interactive report over db_link never comes back
Hi,
I have an interactive report (over db_links) which takes 20 sec. to run in sql workshop, but it never comes back when I run it as an interactive report! I always get an error page due to timeout.
Any idea why?
Thanks.Hi
The interactive report will change the actual SQL executed even if you have no filters, aggregations etc on. If you look at a trace file you will see COUNT OVER() and the apex max row count stuff.
As the SQL text is different, the optimizer may choose a different execution plan which affects where the different parts of the work is performed (on the local site or the external site). This can change execution times vastly.
So run a 10046 trace without the interactive report and run one with the interactive report. Once you've done this you can determine the more desirable one and think about putting a
/*+ DRIVING_SITE(table_name) */hint in the interactive report query.
Hope this helps.
Cheers
Ben
http://www.munkyben.wordpress.com
Don't forget to mark replies helpful or correct ;) -
Performance issue in Report (getting time out error)
Hi experts,
I am doing Performance for a Report (getting time out error)
Please see the code below and .
while looping internal table IVBAP after 25 minutes its showing time out error at this poit ->
SELECT MAX( ERDAT ) .
please send alternate code for this .
Advance thanks
from
Nagendra
Get Sales Order Details
CLEAR IVBAP.
REFRESH IVBAP.
SELECT VBELN POSNR MATNR NETWR KWMENG WERKS FROM VBAP
INTO CORRESPONDING FIELDS OF TABLE IVBAP
FOR ALL ENTRIES IN IVBAK
WHERE VBELN = IVBAK-VBELN
AND MATNR IN Z_MATNR
AND WERKS IN Z_WERKS
AND ABGRU = ' '.
Check for Obsolete Materials - Get Product Hierarhy/Mat'l Description
SORT IVBAP BY MATNR WERKS.
CLEAR: WK_MATNR, WK_WERKS, WK_PRDHA, WK_MAKTX,
WK_BLOCK, WK_MMSTA, WK_MSTAE.
LOOP AT IVBAP.
CLEAR WK_INVDATE. "I6677.sn
SELECT MAX( ERDAT ) FROM VBRP INTO WK_INVDATE WHERE
AUBEL EQ IVBAP-VBELN AND
AUPOS EQ IVBAP-POSNR.
IF SY-SUBRC = 0.
MOVE WK_INVDATE TO IVBAP-INVDT.
MODIFY IVBAP.
ENDIF. "I6677.e n
SELECT SINGLE * FROM MBEW WHERE "I6759.sn
MATNR EQ IVBAP-MATNR AND
BWKEY EQ IVBAP-WERKS AND
BWTAR EQ SPACE.
IF SY-SUBRC = 0.
MOVE MBEW-STPRS TO IVBAP-STPRS.
IVBAP-TOT = MBEW-STPRS * IVBAP-KWMENG.
MODIFY IVBAP.
ENDIF. "I6759.en
IF IVBAP-MATNR NE WK_MATNR OR IVBAP-WERKS NE WK_WERKS.
CLEAR: WK_BLOCK, WK_MMSTA, WK_MSTAE, WK_PRDHA, WK_MAKTX.
MOVE IVBAP-MATNR TO WK_MATNR.
MOVE IVBAP-WERKS TO WK_WERKS.
SELECT SINGLE MMSTA FROM MARC INTO MARC-MMSTA
WHERE MATNR = WK_MATNR
AND WERKS = WK_WERKS.
IF NOT MARC-MMSTA IS INITIAL.
MOVE '*' TO WK_MMSTA.
ENDIF.
SELECT SINGLE LVORM PRDHA MSTAE MSTAV FROM MARA
INTO (MARA-LVORM, MARA-PRDHA, MARA-MSTAE, MARA-MSTAV)
WHERE MATNR = WK_MATNR.
IF ( NOT MARA-MSTAE IS INITIAL ) OR
( NOT MARA-MSTAV IS INITIAL ) OR
( NOT MARA-LVORM IS INITIAL ).
MOVE '*' TO WK_MSTAE.
ENDIF.
MOVE MARA-PRDHA TO WK_PRDHA.
SELECT SINGLE MAKTX FROM MAKT INTO WK_MAKTX
WHERE MATNR = WK_MATNR
AND SPRAS = SY-LANGU.
ENDIF.
IF Z_BLOCK EQ 'B'.
IF WK_MMSTA EQ ' ' AND WK_MSTAE EQ ' '.
DELETE IVBAP.
CONTINUE.
ENDIF.
ELSEIF Z_BLOCK EQ 'U'.
IF WK_MMSTA EQ '' OR WK_MSTAE EQ ''.
DELETE IVBAP.
CONTINUE.
ENDIF.
ELSE.
IF WK_MMSTA EQ '' OR WK_MSTAE EQ ''.
MOVE '*' TO WK_BLOCK.
ENDIF.
ENDIF.
IF WK_PRDHA IN Z_PRDHA. "I4792
MOVE WK_BLOCK TO IVBAP-BLOCK.
MOVE WK_PRDHA TO IVBAP-PRDHA.
MOVE WK_MAKTX TO IVBAP-MAKTX.
MODIFY IVBAP.
ELSE. "I4792
DELETE IVBAP. "I4792
ENDIF. "I4792
IF NOT Z_ALNUM[] IS INITIAL. "I9076
SELECT SINGLE * FROM MAEX "I9076
WHERE MATNR = IVBAP-MATNR "I9076
AND ALNUM IN Z_ALNUM. "I9076
IF SY-SUBRC <> 0. "I9076
DELETE IVBAP. "I9076
ENDIF. "I9076
ENDIF. "I9076
ENDLOOP.Hi Nagendra!
Get Sales Order Details
CLEAR IVBAP.
REFRESH IVBAP.
check ivbak is not initial
SELECT VBELN POSNR MATNR NETWR KWMENG WERKS FROM VBAP
INTO CORRESPONDING FIELDS OF TABLE IVBAP
FOR ALL ENTRIES IN IVBAK
WHERE VBELN = IVBAK-VBELN
AND MATNR IN Z_MATNR
AND WERKS IN Z_WERKS
AND ABGRU = ' '.
Check for Obsolete Materials - Get Product Hierarhy/Mat'l Description
SORT IVBAP BY MATNR WERKS.
CLEAR: WK_MATNR, WK_WERKS, WK_PRDHA, WK_MAKTX,
WK_BLOCK, WK_MMSTA, WK_MSTAE.
avoid select widin loop. instead do selection outside loop.u can use read statement......and then loop if required.
LOOP AT IVBAP.
CLEAR WK_INVDATE. "I6677.sn
SELECT MAX( ERDAT ) FROM VBRP INTO WK_INVDATE WHERE
AUBEL EQ IVBAP-VBELN AND
AUPOS EQ IVBAP-POSNR.
IF SY-SUBRC = 0.
MOVE WK_INVDATE TO IVBAP-INVDT.
MODIFY IVBAP.
ENDIF. "I6677.e n
SELECT SINGLE * FROM MBEW WHERE "I6759.sn
MATNR EQ IVBAP-MATNR AND
BWKEY EQ IVBAP-WERKS AND
BWTAR EQ SPACE.
IF SY-SUBRC = 0.
MOVE MBEW-STPRS TO IVBAP-STPRS.
IVBAP-TOT = MBEW-STPRS * IVBAP-KWMENG.
MODIFY IVBAP.
ENDIF. "I6759.en
IF IVBAP-MATNR NE WK_MATNR OR IVBAP-WERKS NE WK_WERKS.
CLEAR: WK_BLOCK, WK_MMSTA, WK_MSTAE, WK_PRDHA, WK_MAKTX.
MOVE IVBAP-MATNR TO WK_MATNR.
MOVE IVBAP-WERKS TO WK_WERKS.
SELECT SINGLE MMSTA FROM MARC INTO MARC-MMSTA
WHERE MATNR = WK_MATNR
AND WERKS = WK_WERKS.
IF NOT MARC-MMSTA IS INITIAL.
MOVE '*' TO WK_MMSTA.
ENDIF.
SELECT SINGLE LVORM PRDHA MSTAE MSTAV FROM MARA
INTO (MARA-LVORM, MARA-PRDHA, MARA-MSTAE, MARA-MSTAV)
WHERE MATNR = WK_MATNR.
IF ( NOT MARA-MSTAE IS INITIAL ) OR
( NOT MARA-MSTAV IS INITIAL ) OR
( NOT MARA-LVORM IS INITIAL ).
MOVE '*' TO WK_MSTAE.
ENDIF.
MOVE MARA-PRDHA TO WK_PRDHA.
SELECT SINGLE MAKTX FROM MAKT INTO WK_MAKTX
WHERE MATNR = WK_MATNR
AND SPRAS = SY-LANGU.
ENDIF.
IF Z_BLOCK EQ 'B'.
IF WK_MMSTA EQ ' ' AND WK_MSTAE EQ ' '.
DELETE IVBAP.
CONTINUE.
ENDIF.
ELSEIF Z_BLOCK EQ 'U'.
IF WK_MMSTA EQ '' OR WK_MSTAE EQ ''.
DELETE IVBAP.
CONTINUE.
ENDIF.
ELSE.
IF WK_MMSTA EQ '' OR WK_MSTAE EQ ''.
MOVE '*' TO WK_BLOCK.
ENDIF.
ENDIF.
IF WK_PRDHA IN Z_PRDHA. "I4792
MOVE WK_BLOCK TO IVBAP-BLOCK.
MOVE WK_PRDHA TO IVBAP-PRDHA.
MOVE WK_MAKTX TO IVBAP-MAKTX.
MODIFY IVBAP.
ELSE. "I4792
DELETE IVBAP. "I4792
ENDIF. "I4792
IF NOT Z_ALNUM[] IS INITIAL. "I9076
SELECT SINGLE * FROM MAEX "I9076
WHERE MATNR = IVBAP-MATNR "I9076
AND ALNUM IN Z_ALNUM. "I9076
IF SY-SUBRC 0. "I9076
DELETE IVBAP. "I9076
ENDIF. "I9076
ENDIF. "I9076
endloop.
U have used many select queries widin loop-endloop which is a big hindrance as far as performance is concerned.Avoid such practice.
Thanks
Deepika -
Performance of a Report Based On VirtualProvider
Dear BW experts,
We have created a new BEx 3.x report, which contains about 6 queries, and 2 pre queries.
The report runs very slowly, the upload time is about 40 seconds.
The report itself contains one tab with 11 tables.
The MultiProvider that the queries are based on is a virtual InfoCube, so we can't use aggregates.
Could someone advice us how to optimize the performance of the report?
Thanks you in advance.
Best Regards,
Inbal.Hi,
Query variables are not passed only to the virtual provider by default, i.e enter dataset of the extractor is pulled the data manager and then it is filtered out which could the issue for the long runtimes.
If the datasource of the virtual provider has selections then we could passed those from the query to the datasource while query execution at the inverse start routine and reduce the amount of data actual pulled by the virtual provider and hence improve the performance of the query.
Below is the link to the sap documentation on inverse routine.
http://help.sap.com/saphelp_erp60_sp/helpdata/en/45/f5af4a4db53482e10000000a1553f6/content.htm
Thanks,
Arun -
How to improve the query performance in to report level and designer level
How to improve the query performance in to report level and designer level......?
Plz let me know the detail view......first its all based on the design of the database, universe and the report.
at the universe Level, you have to check your Contexts very well to get the optimal performance of the universe and also your joins, keep your joins with key fields, will give you the best performance.
at the report level, try to make the reports dynamic as much as you can, (Parameters) and so on.
and when you create a paremeter try to get it match with the key fields in the database.
good luck
Amr -
Low Performance in the report with cell defition
Hi all,
In one of our queries (3.5), we had to use lots of cell definition. And after execution of the report, it stays in "Formatting Result Area" and "Retrieving Result from BW Server" for a very long time (about 30 minutes).
There is already aggregate on the infoprovider and report uses it.
Is there any way to increase reporting performance of a report with lots of cell definitions ?
Thanks
SPArun,
Can you please explain what is precalculation and how to use it in Bex?
Thanks in advance.
SP -
Performance issue in report programming..
Hi,
I am using one customized Function Module whithin a loop of internal table containing fields of PROJ table for about 200 records . And in the source code of function module there is set of select queries for different tables like COSS COSP , AUFK , PRPS , BPJA PRHI , AFPO , AFKO etc . so due to that my performance of a report is very low , So how can i improve it .
Is there any other way to change a code.
regards
ChetanHi John ,
I am using SAP ECC 6.0 .
The report is used to update a ztable which is already created for Project System plan data .
So i am calling function module which will return a internal table , I am appending this to other internal table and refreshing it , like this I am doing for each project within a loop of PROJ internal table , finaly by using the final itab I am modifying the ztable fields.
Code is as below..
select pspid from proj client specified into corresponding fields of
table t_itab1 where mandt = sy-mandt
and pspnr in s_pspnr
and vbukr = p_vbukr
and prctr in s_prctr.
loop at t_itab1.
l_pspid = t_itab1-pspid.
CALL FUNCTION 'ZPS_FUN_BUDGETS'
EXPORTING
L_PSPID = l_pspid
L_VBUKR = p_vbukr
TABLES
T_DATA = t_itab2 .
loop at t_itab2.
append t_itab2 to t_itab.
endloop.
clear : t_itab2.
refresh : t_itab2.
endloop.
LOOP AT t_itab.
***MODIFY ZTABLE.*****
ENDLOOP.
Regards
Chetan -
Hi Friends,
Can you please give me the exact answer for the below question.
Suppose my report program is taking long time to execute, what are the reasons that may effect the report.
and what are the remedies should i follow, please provide appropriate answer.
Advance thanks,
Chandra.hi,,
Go to tranx SE30 here you will get Tips and Trciks for the performance tuning.
Check it carefully and check whether you can do something for improving performance of you code.
It will help you a lot and will reduce your Execution time.
If you are using READ TABLE command in your program then you can check whether you can use HASHED TABLE it will improve performance of your code a lot but it has some restrictions.
I will explain some of the points to improve the performance of the report try to write code according to that ok.
SOME STEPS USED TO IMPROVE UR PERFORMANCE:
1. Avoid using SELECT...ENDSELECT... construct and use SELECT ... INTO TABLE.
2. Use WHERE clause in your SELECT statement to restrict the volume of data retrieved.
3. Design your Query to Use as much index fields as possible from left to right in your WHERE statement
4. Use FOR ALL ENTRIES in your SELECT statement to retrieve the matching records at one shot.
5. Avoid using nested SELECT statement, SELECT within LOOPs.
6. Avoid using INTO CORRESPONDING FIELDS OF TABLE. Instead use INTO TABLE.
7. Avoid using SELECT * and Select only the required fields from the table.
8. Avoid nested loops when working with large internal tables.
9. Use assign instead of into in LOOPs for table types with large work areas
10. When in doubt call transaction SE30 and use the examples and check your code
11. Whenever using READ TABLE use BINARY SEARCH addition to speed up the search. Be sure to sort the internal table before binary search. This is a general thumb rule but typically if you are sure that the data in internal table is less than 200 entries you need not do SORT and use BINARY SEARCH since this is an overhead in performance.
12. Use "CHECK" instead of IF/ENDIF whenever possible.
13. Use "CASE" instead of IF/ENDIF whenever possible.
14. Use "MOVE" with individual variable/field moves instead of "MOVE-
CORRESPONDING", creates more coding but is more effcient.
Reward points if helpful.
regards,
rekha -
Performance Issue Crystal Report and Oracle
Hello,
We have one procedure that takes 3 input parameters and returns Cursor from Procedure that is used to design the report. There is no caluculation involved here and cursor is opended dynamically. We are using Oracle Native connection.
When we click on preview button it takes lots of time ( >10 Mins) to show complete data. While we call the same procedure in application and generate HTML report using Cursor returned it is done in < 15 Seconds. Can some point me where to look into to improve the performance of Crystal Report.
DB: Oracle 10G
CR: Version XIHi Vadiraja
The performance of a report is related to:
External factors:
1. The amount of time the database server takes to process the SQL query.
( Crystal Reports send the SQL query to the database, the database process it, and returns the data set to Crystal Reports. )
2. Network traffics.
3. Local computer processor speed.
( When Crystal Reports receives the data set, it generates a temp file to further filter the data when necessary, as well as to group, sort, process formulas, ... )
4. The number of record returned
( If a sql query returns a large number of records, it will take longer to format and display than if was returning a smaller data set.)
Report design:
1. Where is the Record Selection evaluated.
Ensure your Record Selection Formula can be translated in SQL, so the data can be filter down on the server, otherwise the filtering will be done in a temp file on the local machine which will be much slower.
They have many functions that cannot be translated in SQL because they may not have a standard SQL for it.
For example, control structure like IF THEN ELSE cannot be translated into SQL. It will always be evaluated in Crystal Reports. But if you use an IF THEN ELSE on a parameter, it will convert the result of the condition to SQL, but as soon as uses database fileds in the conditions it will not be translated in SQL.
2. How many subreports the report contains and in section section they are located.
Minimise the number of subreports used, or avoid using subreports if possible because
subreports are reports within a report, and if you have a subreport in a details section, and the report returns 100 records, the subreport will be evaluated 100 times, so it will query the database 100 times. It is often the biggest factor why a report takes a long time to preview.
3. How many records will be returned to the report.
Large number of records will slow down the preview of the reports.
Ensure you only returns the necessary data on the report, by creating a Record Selection Formula, or basing your report off a Stored Procedure, or a Command Object that only returns the desired data set.
4. Do you use the special field "Page N of M", or "TotalPageCount"
When the special field "Page N of M" or "TotalPageCount" is used on a report, it will have to generate each page of the report before it displays the first page, therfore it will take more time to display the first page of the report.
If you want to improve the speed of a report, remove the special field "Page N of M" or "Total Page Count" or formula that uses the function "TotalPageCount". If those aren't use when you view a report it only format the page requested.
It won't format the whole report.
5. Link tables on indexed fields whenever possible.
6. Remove unused tables, unused formulas, unused running totals from the report.
7. Suppress unnecessary sections.
8. For summaries, use conditional formulas instead of running totals when possible.
9. Whenever possible, limit records through selection, not suppression.
10. Use SQL expressions to convert fields to be used in record selection instead of using formula functions.
For example, if you need to concatenate 2 fields together, instead of doing it in a formula, you can create a SQL Expression Field. It will concatenate the fields on the database server, instead of doing in Crystal Reports. SQL Expression Fields are added to the SELECT clause of the SQL Query send to the database.
11. Using one command as the datasource can be faster if you returns only the desired data set.
It can be faster if the SQL query written only return the desired data.
12. Perform grouping on server
This is only relevant if you only need to return the summary to your report but not the details. It will be faster as less data will be returned to the reports.
Regards
Girish Bhosale -
Performance issue webi report-BOXI3.1
Hi,
We have a requirement for a report where we will give user a set of objects (26 u2013 31) to do analysis using interactive viewing feature. Here we are facing severe performance issues and memory issues as the data that we are calling is huge( around 6 million records). At the report level we will be summarizing the data.
No of rows in the report is depending on the no of objects.
Mode of view : Interactive view.
Note:
1. Objects which are using in conditional level those have indexes.
2. No of report level variable are two.
3. Version of Business objects: BOXI3.1
4. OS: Sun Solaris
Please let me know if there are any means by which the memory requirements for the report can be minimized/ performance of the report can be improved.
Thanks,
SubashSubash,
At the report level we will be summarizing the data ... any means by which the memory requirements for the report can be minimized/ performance of the report can be improved
Is there any way that you can summarize this on the database side versus the report level? The database should be sized with memory and disk space properly to handle these types of summarizations versus expecting the application to perform it.
Thanks,
John -
Displaying report in .pdf format while Running oracle reports over the web
I am running a report over the web via IE. I am suing .pdf
format as the file type. The problem I am facing is that the
report comes out with a blank in acrobat reader if there are
just one or two records - i.e less thatn one pagefull. THe
reports displays output only when there ar more than one
pagefull of records.
Any explanation for this bezarre behavior and any suggestions?
I will very much appreciate your help.
Regards
Prasad.in R12 I found 2 choice
1) when submitting requests (if available) you can set the output format by using the Options button (upon sompletion section):
layout --> format --> select format you need (RTF/HTML/EXCEL/PDF)
2) in the request form (view->request) selecr the report you want to reprint in the Tools menu select print/republish, in the html page that pop up select output format you want, number of copies =1 submit
www2p -
How to optimize the performance of crystal report?
Hi,
-I have to design a crystal report with best possible optimization. Optimization is main concern since report will run against 1-2 million data set. Though I am using parameter to fetch only the required data, required data can go till 1 million records.
-Based on the input passed by the user I have to group the data in report. And for each selected parameter the Detail section I am printing is different. For example:-If user selects store then detail section is different and if user select Host then detail section will be different.
-Report can be grouped by Time Field also. So to full fill this requirement I would have to create a sub report since other parameters are of string type and can be used in one formula to get parameter based grouping in report. However If I try to return Time filed from the same formula I get the errors the "Return type should be of String typeu201D. This forces me to create sub report for Time based grouping. If user selects Time Field to be grouped on, all the information in the main report gets suppressed and only the sub report gets printed.
If user select store, Host and User in parameter to be grouped on, sub report gets suppressed.
Now with the above mentioned points I tried to optimize the report in following way.
-Printing 1 million records in the report does not make sense; hence we wanted to show the summary of all the records in chart section but wanted to print just 5000 records in detailed section. Suppressing detailed section after 5000 records does not help much since suppressing just saves the time in printing and does not limit the number of records to be fetched from the DB.I have a subreport also so it fetches the data 2 times from the DB hence makes the performance of the report worse.
To solve this problem I used command object and put the charts in the subreport and detail in main report.
In main report's Command Object I limited the number to records to be fetched from the DB to 5000 using rownum<5000 but in subreport's Command Object I did not set any limit in the query but I am doing all my aggregation in SQL which means do summary operation in DB and get only summarized data from DB.
-To solve section problem I am using Template object (new feature added in CR 2008).In which I am returning the field based on the "Group By" parameter selected by user.
-For time Field I have created two sub reports, one for chart and other one for details in the same way described in point one(Printing 1 million recordsu2026u2026).
After implementing these points my crystal reports performance improved drastically. The report that was taking 24 minute to come back now taking only 2 minutes.
However I want my report to come back with one minute. It returns if I remove the sub reports for Time Based Grouping but I can not do so.
My questions here are,
-Can I stop Subreport from fetching the data from DB if itu2019s suppressed?
-I believe using Conditional Template Object is a better option rather than having multiple detailed sections to print the data for a selected Group. However any suggestion here to improve the performance will be appreciable.
-since crystal report does not provide any option to limit the number of records to be fetched from DB, I am forced to use command object with rownum in where condition.
Please let me know about other option(s) to get this done...If there is any.
I am using Crystal report 2008.And we have developed our application the use JRC to export crystal report in PDF.
Regards,
Amrita
Edited by: Amrita Singh on May 12, 2009 11:36 AM1) I have to design a crystal report with best possible optimization. Optimization is main concern since report will run against 1-2 million data set. Though I am using parameter to fetch only the required data, required data can go till 1 million records.
2) Based on the input passed by the user I have to group the data in report. And for each selected parameter the Detail section I am printing is different. For example:-If user selects store then detail section is different and if user select Host then detail section will be different.
3) Report can be grouped by Time Field also. So to full fill this requirement I would have to create a sub report since other parameters are of string type and can be used in one formula to get parameter based grouping in report. However If I try to return Time filed from the same formula I get the errors the "Return type should be of String typeu201D. This forces me to create sub report for Time based grouping. If user selects Time Field to be grouped on, all the information in the main report gets suppressed and only the sub report gets printed.
If user select store, Host and User in parameter to be grouped on, sub report gets suppressed.
Now with the above mentioned points I tried to optimize the report in following way.
1) Printing 1 million records in the report does not make sense; hence we wanted to show the summary of all the records in chart section but wanted to print just 5000 records in detailed section. Suppressing detailed section after 5000 records does not help much since suppressing just saves the time in printing and does not limit the number of records to be fetched from the DB.I have a subreport also so it fetches the data 2 times from the DB hence makes the performance of the report worse.
To solve this problem I used command object and put the charts in the subreport and detail in main report.
In main report's Command Object I limited the number to records to be fetched from the DB to 5000 using rownum<5000 but in subreport's Command Object I did not set any limit in the query but I am doing all my aggregation in SQL which means do summary operation in DB and get only summarized data from DB.
2)To solve section problem I am using Template object (new feature added in CR 2008).In which I am returning the field based on the "Group By" parameter selected by user.
Edited by: Amrita Singh on May 12, 2009 12:26 PM -
Crystal reports over SAP r/3 tables
I am trying to write a Crystal report over SAP r/3 tables (BSIK and LFA1) with no success.
I have CRpts installed along with the "client side" SAP integration kit. When i try to create a new connection to my development ERP system i am asked to select an available system, but the dialogue box is empty. I can however connect to a SAP BW query successfully using the SAP toolbar that has been added when installing the integration kit.
Is there anywhere a set if instructions to successfully install and configure CRpts to report over SAP r/3 tables ?
Andrew FoxMake sure to define an environment variable called SAPLOGON_INI_FILE in the system your CR designer is installed on. The variable should contain the path to your SAPlogon.ini file including the file name. eg if saplogon.ini is found under c:\Windows then the variable shoud be set to c:\Windows\saplogon.ini . Restart the CR designer and try again.
If the system list remains empty then locate to saplogon.ini file, open it using Notepad and choose the Save as option. All you have to do is to overwrite the existing file (ie. do not change the name) after changing the encoding to UTF-8 (drop-down list at the bottom of the Save as window)
Regards,
Stratos
Maybe you are looking for
-
Values in CK13N not matching with cost element report
Dear SAP Experts, when I go to t code CK13N in the column (Itemization of column) I can see for the cost elemnt total values as 241023 with the Qty as 10000, but when I check in the material & the report FBL3N not sure from where its taking 241023. W
-
Ipod and Itrip failure!!??
I have a 4th gen iPod (i think, 20 gig, no buttons across the top not video??) I have been using an itrip with it for over a year and no probs. I recently updated to ipod driver/update 3.1 and the last two days I will plug the itrip in an dhit play a
-
What is maximum length of CAT5e cable that HH3 can...
The wireless signal is weak in our home office in the garden so I installed a CAT5e cable to give me a LAN connection to the computer. The cable is 30 m long and I have checked the connections (from the LAN connection lead into the router to the con
-
Flex and ColdFusion web services
I have a simple CFC created that encompasses a function that has a query. I want to be able to use the web service in my Flex app, but I am having issues with getting the information from the CFC. My function is simple: <cffunction name="listBySubjec
-
What's with the automatic country codes?
Upgraded and have had the unwanted facebook contact list added automatically. On top of this, all contacts' phone numbers have been automatically assigned a country code, which is not applicable. How does one get rid of all this unwanted stuff. I was