[Performance Tuning] Select from QMEL
Hi experts,
I have a problem with regards with the select from QMEL table, it takes too long to execute. Your input is very much appreciated.
IF i_sales_orders[] IS NOT INITIAL.
SELECT qmnum
vbeln
FROM viqmel
INTO TABLE i_viqmel
FOR ALL ENTRIES IN i_sales_orders
WHERE vbeln EQ i_sales_orders-vbeln.
ENDIF.
Regard,
Ng
Table QMEL appears to have an index by cuatomer/sales org/distrib channel/division/...etc (index MCK).
If what you are looking for is sales order data, then you should be able to read these fields from VBAK into your i_sales_order internal table first (primary key - should be quick), and then read a smaller volume of data from QMEL:
IF i_sales_orders[] IS NOT INITIAL.
SELECT qmnum
vbeln
FROM qmel
INTO TABLE i_viqmel
FOR ALL ENTRIES IN i_sales_orders
WHERE kumun = i_sales_orders-kunnr
AND vkorg = i_sales_orders-vkorg
AND vtweg = i_sales_orders-vtweg
AND spart = i_sales_orders-spart
AND vbeln EQ i_sales_orders-vbeln.
ENDIF.
Similar Messages
-
Performance tuning SELECTs: Can I force a TRUE db read every time?
Good day everyone!
I've been programming in ABAP for almost 6 years now, and I'd like to begin learning more about performance tuning with respect to database performance.
More specifically, I'm testing some things in a particular SELECT in a report program we have that is timing out in the foreground because of the SELECT. When I first run the program, the SELECT goes against the database, as we all know. Subsequent runs, however, use the buffered data, so the response is a lot quicker and doesn't really reflect that first, initial database read.
Am I correct in assuming that I should be testing my various approaches and collecting performance runtimes against that initial, "true" database read? If that's the case, is there any way I can force the system to actually read the database instead of the buffered data? For those experienced with this kind of performance analysis and tuning, what's the best approach for someone very new to this area such as myself?
Thank you,
DaveHi Dave and Rob,
Just my two cents (and yes, I know this is already answered, but..).
I think you might be confusing 2 things: one is SAP buffering, and another one is caching at other levels (database, operating system, etc).
From what I understood Rob was talking mainly about SAP buffering. In that context it is true that if there is a first execution that loads the buffers (for example, some not so small fully buffered tables) then that is an atypical execution, and should be discarded. In real life you will never have execution times like those, except maybe on the very first execution on a monday morning.
Another thing is database caching. If you execute a report twice with exactly the same parameters then you might not be actually making physical reads in the second execution. This second execution will be very fast, but that will not be simulating real life: no user wants a report to be fast the second time you execute it with exactly the same parameters.
To avoid this in Oracle you can empty the so-called SGA, but that is not so useful and it will probably not get you closer to what happens in the real life.
So what to do? In doubt, measure it several times, with different parameters, and probably exclude the extreme values.
Regards,
Rui Dantas -
[Performance Issue] Select from MSEG
Hi experts,
Need your help on how to improve the performance in the select from MSEG, it takes about 30 minutes to just finish the select. Thanks!
SELECT mblnr
mjahr
zeile
bwart
matnr
werks
lgort
charg
shkzg
menge
ummat
lgpla
FROM mseg
INTO CORRESPONDING FIELDS OF TABLE i_mseg2
FOR ALL ENTRIES IN i_likp
WHERE bwart IN ('601','602','653','654')
AND matnr IN s_matnr
AND werks IN s_werks
AND lgort IN s_sloc
AND lgpla EQ i_likp-vbeln.store all the vbeln to ranges.
ranges:r_vbeln for i_likp-vbeln.
r_vbeln-option = 'EQ'.
r_vbeln-sign = 'I'.
loop at i_likp.
r_vbeln-low = i_likp-vbeln.
append r_vbeln.
endloop.
sort r_vbeln ascending
delete adjacent duplicates from r_vbeln.
then modify the fetch as below.
donot use a loop to fetch data from mseg.
SELECT mblnr mjahr zeile bwart matnr werks lgort charg shkzg menge ummat lgpla
FROM mseg client specified INTO CORRESPONDING FIELDS OF TABLE i_mseg2
FOR ALL ENTRIES IN i_likp
where mandt = sy-mandt
and (bwart = '601' or bwart = '602' or bwart = '653' or bwart = '654' )
AND matnr IN s_matnr
AND werks IN s_werks
AND lgort IN s_sloc
AND lgpla in r_vbeln.
there is another table where u can get this data...i,ll let u know shortly...
try with this if useful
reward points.... -
Performance Issue: Select From BSEG & BKPF
Hi experts,
Performance issue on the select statements; how can I improve the performance?
Select Company Code (BUKRS)
Accounting Document Number (BELNR)
Document Type (BLART)
Posting Date in the Document (BUDAT)
Document Status (BSTAT)
Reversal Document or Reversed Document Indicator (XREVERSAL)
From Accounting Document Header (BKPF)
Into I_BKPF
Where BKPF-BUKRS = I_VBAK-BUKRS_VF
BKPF-BLART = KI
BKPF-BUDAT = SY-DATUM 2 days
BKPF-BSTAT = Initial
BKPF-XREVERSAL <> 1 or 2
Select Company Code (BUKRS)
Accounting Document Number (BELNR)
Assignment Number (ZUONR)
Sales Document (VBEL2)
Sales Document Item (POSN2)
P & L Statement Account Type (GVTYP)
From Accounting Document Segment (BSEG)
Into I_BSEG
Where BSEG-BUKRS = I_VBAK-BUKRS
BSEG-VBELN = I_VBAK-VBEL2
BSEG-POSN2 = I_VBAP-POSNR
BSEG-BELNR = I_BKPF-BELNR
P & L Statement Account Type (GVTYP) = XHi,
to improve the performance, you can use the secondary indices viz., BSIK / BSAK, BSID / BSAD, BSIS.
Hope this helps.
Best Regards, Murugesh AS -
How to perform multiple selection from dropdown list
Hi,
I have developed one application in which i have taken one dropdownbyindex and entered some values in it, now i need to have multiple selection of entries, can any one please suggest how to do these
Regards,
PrasannaA drop-down list is by definition a 1-from-many selector.
Armin -
Performance Tuning "Select All" vs "Select Then Delete"
Dear Experts,
Please tell me which one has better prefromance between
SELECT a~vbeln
a~kunnr
a~bukrs_vf
a~vkorg
a~vtweg
a~spart
a~augru
a~vbtyp
a~auart
a~bstnk
b~kunnr
INTO TABLE ivbak
FROM vbak AS a
INNER JOIN vbpa AS b
ON bvbeln EQ avbeln
AND b~parvw EQ c_shipto
WHERE a~kunnr IN s_kunnr AND
a~vkorg EQ p_vkorg AND
a~vtweg IN s_vtweg AND
a~spart IN s_spart and
a~auart in s_auart .
DELETE ivbak WHERE NOT (
vbeln IN s_vbeln AND
augru EQ space AND
vbtyp EQ s_order AND
kunno IN s_kunev ).
DELETE ivbak WHERE auart EQ ordertype2
OR auart EQ ordertype1.
DELETE ADJACENT DUPLICATES FROM ivbak COMPARING ALL FIELDS.
AND
SELECT a~vbeln
a~kunnr
a~bukrs_vf
a~vkorg
a~vtweg
a~spart
a~augru
a~vbtyp
a~auart
a~bstnk
b~kunnr
INTO TABLE i_vbak
FROM vbak AS a
INNER JOIN vbpa AS b
ON bvbeln EQ avbeln
AND b~parvw EQ c_shipto
WHERE a~kunnr IN s_kunnr AND
a~vkorg EQ p_vkorg AND
a~vtweg IN s_vtweg AND
a~spart IN s_spart AND
a~auart in s_auart AND
a~vbeln NOT IN s_vbeln AND
a~augru NE SPACE AND
a~vbtyp NE s_order OR
(auart EQ ordertype2
OR auart EQ ordertype1)as a general recommendation, I would say that the second one should be faster.
But every rule has exceptions and your case could be such an exception. You really have to try booth version is a small test programm,
execute them with GET RUNTIME FIELD start and stop.
And check the SQL Trace. It can happen that version gets a different access path with different indexes. This can take much longer than the delete.
Siegfried -
Selecting from a SQL Server 2005 with long column names ( 30 chars)
Hi,
I was able to set up a db link from Oracle 11.2.0.1 to SQL Server 2005 using DG4ODBC.
My problem is that some column names in the Sql Server are longer than 30 chars and trying to select them gives me the ORA-00972: identifier is too long error.
If I omit these columns the select succeeds.
I know I can create a view in the sql server and query it instead of the original table, but I was wondering if there's a way to overcome it with sql.
My select looks like this:
select "good_column_name" from sometable@sqlserver_dblink -- this works
select "good_column_name","very_long_column_name>30 chars" from sometable@sqlserver_dblink -- ORA-00972ThanksI tried creating a view with shorter column names but selecting from the view still returns an error.
create view v_Boards as (select [9650_BoardId] as BoardId, [9651_BoardType] as BoardType, [9652_HardwareVendor] as
HardwareVendor, [9653_BoardVersion] as BoardVersion, [9654_BoardName] as BoardName, [9655_BoardDescription] as BoardDescription,
[9656_SlotNumber] as SlotNumber, [9670_SegmentId] as SegmentId, [MasterID] as MasterID, [9657_BoardHostName] as BoardHostName,
[9658_BoardManagementUsername] as BoardManagementUsername, [9659_BoardManagementPassword] as BoardManagementPassword,
[9660_BoardManagementVirtualAddress] as BoardManagementVirtualAddress, [9661_BoardManagementTelnetLoginPrompt] as
MANAGEMENTTELNETLOGINPROMPT, [9662_BoardManagementTelnetPasswordPrompt] as MANAGEMENTTELNETPASSPROMPT,
[9663_BoardManagementTelnetCommandPrompt] as MANAGEMENTTELNETCOMMANDPROMPT FROM Boards)performing a select * from this view in sqlserver works and show the short column names
this is the error i'm getting for performing a select * from v_boards@sqlserver_dblink
ORA-28500: connection from ORACLE to a non-Oracle system returned this message:
[Microsoft][SQL Native Client][SQL Server]Invalid column name 'BoardManagementTelnetLoginProm'. {42S22,NativeErr = 207}[Microsoft]
[SQL Native Client][SQL Server]Invalid column name 'BoardManagementTelnetPasswordP'. {42S22,NativeErr = 207}[Microsoft][SQL Native
Client][SQL Server]Invalid column name 'BoardManagementTelnetCommandPr'. {42S22,NativeErr = 207}[Microsoft][SQL Native Client][SQL
Server]Statement(s) could not be prepared. {42000,NativeErr = 8180}
ORA-02063: preceding 2 lines from sqlserver_dblinkI also tried replacing the * with specific column names but it fails on the columns that have a long name (it doesn't recognize the short names from the view)
what am I doing wrong?
Edited by: Pyrocks on Dec 22, 2010 3:58 PM -
Performance Tuning -To find the execution time for Select Statement
Hi,
There is a program that takes 10 hrs to execute. I need tune its performance. The program is basically reading few tables like KNA1,ANLA,ANLU,ADRC etc and updates to Custom table. I did my analysis and found few performance techniques for ABAP coding.
Now my problem is, to get this object approved I need to submit the execution statistics to client.I checked both ST05 and SE30. I heard of a Tcode where we can execute a select statement and note its time, then modify and find its improved Performance. Can anybody suggest me on this.
Thanks,
Rajani.Hi,
This is documentation regarding performance analysis. Hope this will be useful
It is a general practice to use Select * from <database> This statement populates all the values of the structure in the database.
The effect is many fold:-
It increases the time to retrieve data from database
There is large amount of unused data in memory
It increases the processing time from work area or internal tables
It is always a good practice to retrieve only the required fields. Always use the syntax Select f1 f2 fn from <database>
e.g. Do not use the following statement:-
Data: i_mara like mara occurs 0 with header line.
Data: i_marc like marc occurs 0 with header line.
Select * from mara
Into table i_mara
Where matnr in s_matnr.
Select * from marc
Into table i_marc
For all entries in i_mara
Where matnr eq i_mara-matnr.
Instead use the following statement:-
Data: begin of i_mara occurs 0,
Matnr like mara-matnr,
End of i_mara.
Data: begin of i_marc occurs 0,
Matnr like marc-matnr,
Werks like marc-werks,
End of i_marc.
Select matnr from mara
Into table i_mara
Where matnr in s_matnr. -
VAL_FIELD selection to determine RSDRI or MDX query: performance tuning
according to on of the HTG I am working on performance tuning. one of the tip is to try to query base members by using BAS(xxx) in the expension pane of BPC report.
I did so and found an interesting issue in one of the COPA report.
with income statement, when I choose one node gross_profit, saying BAS(GROSS_PROFIT), it generates RSDRI query as I can see in UJSTAT. when I choose its parent, BAS(DIRECT_INCOME), it generates MDX query!
I checked DIRECT_INCOME has three members, GROSS_PROFIT, SGA, REV_OTHER. , none of them has any formulars.
in stead of calling BAS(DIRECT_INCOME), I called BAS(GROSS_PROFIT),BAS(SGA),BAS(REV_OTHER), I got RSDRI query again.
so in smmary,
BAS(PARENT) =>MDX query.
BAS(CHILD1)=>RSDRI query.
BAS(CHILD2)=>RSDRI query.
BAS(CHILD3)=>RSDRI query.
BAS(CHILD1),BAS(CHILD2),BAS(CHILD3)=>RSDRI query
I know VAL_FIELD is SAP reserved name for BPC dimensions. my question is why BAS(PARENT) =>MDX query.?
interestingly I can repeat this behavior in my system. my intention is to always get RSDRI query,
GeorgeOk - it turns out that Crystal Reports disregards BEx Query variables when put in the Default Values section of the filter selection.
I had mine there and even though CR prompted me for the variables AND the SQL statement it generated had an INCLUDE statement with hose variables I could see by my result set that it still returned everything in the cube as if there was no restriction on Plant for instance.
I should have paid more attention to the Info message I got in the BEx Query Designed. It specifically states that the "Variable located in Default Values will be ignored in the MDX Access".
After moving the variables to the Characteristic Restrictions my report worked as expected. The slow response time is still an issue but at least it's not compounded by trying to retrieve all records in the cube while I'm expecting less than 2k.
Hope this helps someone else -
Performance tuning from Basis point of View ?
Hi,
Can anybody help me in doing the performance tuning from Basis point of view.
What all parameters are involved in it and what are the values need to be initially assigned and what all factors need to be kept in mind.?
Thanks in advance.wrong forum??
not a security related question?? -
Performance problem with select from _DIFF view
Hi,
we have a versioned table with more then one million records. We use the DBMS_WM.SetDiffVersions procedure and select from DIFF view to get data differences between two workspaces. The problem is that the select from the DIFF view is very slow. I takes more than 15 minutes. Has anybody an idea why it consumes so much time? Is there any way how to improve it?
Thanks and regards
OndrejHi,
This can be due to any number of things, but is typically caused by an inefficient optimizer plan. Make sure that statistics on the _LT table have been recently analyzed.
Also the following information would be useful:
1. What is the relationship of the workspaces that you are trying to compare (parent/child, children of the same parent, etc) ?
2. How many and of what type dml are being performed in the workspaces ?
3. What version of Workspace Manager are you using and what is the version of the database ?
4. What is the time needed to select from the _DIFF view based on the primary key ?
Regards,
Ben -
[ADF-11.1.2] Proof of view performance tuning in oracle adf
Hello,
Take an example of : http://www.gebs.ro/blog/oracle/adf-view-object-performance-tuning-analysis/
It tells me perfectly how to tune VO to achieve performance, but how to see it working ?
For example: I Set Fetch size of 25, 'in Batch of' set to 1 or 26 I see following SQL Statement in Log
[1028] SELECT Company.COMPANY_ID, Company.CREATED_DATE, Company.CREATED_BY, Company.LAST_MODIFY_DATE, Company.LAST_MODIFY_BY, Company.NAME FROM COMPANY Companyas if it is fetching all the records from table at a time no matter what's the size of Batch. If I am seeing 50 records on UI at a time, then I would expect at least 2 SELECT statement fetching 26 records by each statement if I set Batch Size to 26... OR at least 50 SELECT statement for Batch size set to '1'.
Please tell me how to see view performance tuning working ? How one can say that setting batch size = '1' is bad for performance?Anandsagar,
why don't you just read up on http://download.oracle.com/docs/cd/E21764_01/core.1111/e10108/adf.htm#CIHHGADG
there are more factors influencing performance than just query. Btw, indexing your queries also helps to tune performance
Frank -
Performance tuning of this report
Hello friends iam attaching my report give the performance tuning for this report to avoid nested endloops. how to do without using nested endloops.
give me the reply urgent.
REPORT ZDEMO9 NO STANDARD PAGE HEADING
LINE-SIZE 250
LINE-COUNT 22(3). .
TABLES DECLARATION *
TABLES : MARA, "general material data
MAKT, "material description
MARC, "plant data for material
VBAP, "sales document for item data
EKKO, "purchasing document header
EKPO, "purchasing document item
KNA1. "customer master details
INTERNAL TABLE DECLARATION *
DATA : BEGIN OF T_MARA OCCURS 0,
MATNR LIKE MARA-MATNR,
MTART LIKE MARA-MTART,
MEINS LIKE MARA-MEINS,
END OF T_MARA.
DATA : BEGIN OF T_MAKT OCCURS 0,
MATNR LIKE MAKT-MATNR,
MAKTX LIKE MAKT-MAKTX,
SPRAS LIKE MAKT-SPRAS,
END OF T_MAKT.
DATA : BEGIN OF T_MARC OCCURS 0,
MATNR LIKE MARC-MATNR,
WERKS LIKE MARC-WERKS,
END OF T_MARC.
DATA : BEGIN OF T_KNA1 OCCURS 0,
KUNNR LIKE KNA1-KUNNR,
NAME1 LIKE KNA1-NAME1,
LAND1 LIKE KNA1-LAND1,
END OF T_KNA1.
DATA : BEGIN OF T_VBAP OCCURS 0,
MATNR LIKE VBAP-MATNR,
POSNR LIKE VBAP-POSNR,
MATKL LIKE VBAP-MATKL,
VBELN LIKE VBAP-VBELN,
END OF T_VBAP.
DATA : BEGIN OF T_EKPO OCCURS 0,
EBELN LIKE EKPO-EBELN,
EBELP LIKE EKPO-EBELP,
BUKRS LIKE EKPO-BUKRS,
WERKS LIKE EKPO-WERKS,
LGORT LIKE EKPO-LGORT,
MATNR LIKE EKPO-MATNR,
MANDT LIKE EKPO-MANDT,
END OF T_EKPO.
FINAL INTERNAL TABLE *
DATA : BEGIN OF T_FINAL OCCURS 0,
MATNR LIKE MARA-MATNR,
MTART LIKE MARA-MTART,
MEINS LIKE MARA-MEINS,
WERKS LIKE MARC-WERKS,
MAKTX LIKE MAKT-MAKTX,
SPRAS LIKE MAKT-SPRAS,
VBELN LIKE VBAP-VBELN,
POSNR LIKE VBAP-POSNR,
MATKL LIKE VBAP-MATKL,
EBELN LIKE EKPO-EBELN,
EBELP LIKE EKPO-EBELP,
BUKRS LIKE EKPO-BUKRS,
KUNNR LIKE KNA1-KUNNR,
LAND1 LIKE KNA1-LAND1,
NAME1 LIKE KNA1-NAME1,
LGORT LIKE EKPO-LGORT,
END OF T_FINAL.
*DATA: BEGIN OF V_matnr OCCURS 0,
matnr LIKE mara-matnr,
END OF t_matnr.
data:
a(32) type c.
a = 'IBT000000000000000001000000000000000050'.
SELECTION SCREEN *
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS : S_BUKRS FOR EKPO-BUKRS,
S_KUNNR FOR KNA1-KUNNR,
S_WERKS FOR MARC-WERKS,
S_MATNR FOR MARA-MATNR obligatory.
SELECTION-SCREEN END OF BLOCK B1.
START OF SELECTION *
START-OF-SELECTION.
SELECT MATNR mtart meins
FROM MARA
INTO CORRESPONDING FIELDS OF TABLE T_MARA
WHERE MATNR IN S_MATNR.
SELECT MATNR WERKS
FROM MARC
INTO CORRESPONDING FIELDS OF TABLE T_MARC
FOR ALL ENTRIES IN T_MARA
WHERE MATNR = T_MARA-MATNR
and werks in s_werks.
select matnr maktx spras
from makt
into corresponding fields of table t_makt
for all entries in t_mara
where matnr = t_mara-matnr
and spras = sy-langu.
select matnr posnr matkl vbeln
from vbap
into corresponding fields of table t_vbap
for all entries in t_mara
where matnr = t_mara-matnr.
select matnr werks bukrs ebeln ebelp lgort
from ekpo
into corresponding fields of table t_ekpo
for all entries in t_mara
where matnr = t_mara-matnr
and werks in s_werks.
LOOP AT T_MARA.
MOVE T_MARA-matnr TO T_FINAL-matnr.
move t_mara-mtart to t_final-mtart.
move t_mara-meins to t_final-meins.
loop at t_marc where matnr eq t_mara-matnr.
move t_marc-werks to t_final-werks.
loop at t_makt.
move t_makt-maktx to t_final-maktx.
move t_makt-spras to t_final-spras.
loop at t_vbap.
move t_vbap-posnr to t_final-posnr.
move t_vbap-matkl to t_final-matkl.
move t_vbap-vbeln to t_final-vbeln.
loop at t_ekpo.
move t_ekpo-bukrs to t_final-bukrs.
move t_ekpo-ebeln to t_final-ebeln.
move t_ekpo-ebelp to t_final-ebelp.
move t_ekpo-lgort to t_final-lgort.
append t_final.
endloop.
endloop.
endloop.
endloop.
endloop.
SELECT werks KUNNR LAND1 NAME1
INTO CORRESPONDING FIELDS OF TABLE T_KNA1
FROM KNA1.
WHERE WERKS in s_werks.
loop at t_kna1.
move t_kna1-kunnr to t_final-kunnr.
move t_kna1-name1 to t_final-name1.
move t_kna1-land1 to t_final-land1.
append t_final.
endloop.
"endloop.
loop at t_final.
write : 4 t_final-matnr,
20 t_final-mtart,
28 t_final-meins,
46 t_final-werks,
58 t_final-maktx,
71 t_final-spras,
78 t_final-posnr,
100 t_final-matkl,
115 t_final-vbeln,
130 t_final-kunnr,
142 t_final-name1,
156 t_final-land1,
168 t_final-bukrs,
190 t_final-ebeln,
205 t_final-ebelp,
208 t_final-lgort.
endloop.
TOP-OF-PAGE *
top-of-page.
uline.
write : /60 'G E N E R A L D E T A I L S' COLOR 2 INVERSE OFF.
ULINE.
write :/ SY-VLINE, 'MATERIAL' COLOR 4, "12 SY-VLINE,
13 SY-VLINE, 'IND SECTOR',
28 SY-VLINE, 'UNITS',
43 SY-VLINE, 'PLANT',
55 SY-VLINE, 'MAT DESC',
68 SY-VLINE, 'LANGU',
70 SY-VLINE, 'SALES DOC ITEM',
95 SY-VLINE, 'MAT GROUP',
110 SY-VLINE, 'SALES DOC',
125 SY-VLINE, 'CUST ID',
140 SY-VLINE, 'NAME',
155 SY-VLINE, 'COUNTRY',
165 sy-vline, 'company code',
205 sy-vline, 'storge loc'.*& Report YTESTCHA *
REPORT ytestcha NO STANDARD PAGE HEADING
LINE-SIZE 250
LINE-COUNT 22(3). .
TABLES DECLARATION *
TABLES : mara, "general material data
makt, "material description
marc, "plant data for material
vbap, "sales document for item data
ekko, "purchasing document header
ekpo, "purchasing document item
kna1. "customer master details
INTERNAL TABLE DECLARATION *
*DECLARE TYPES FIRST AND THE INTERNAL TABLES
*DONT USE MATNR LIKE MARA-MATNR ,INSTEAD USE MARA TYPE MATNR WHERE MATNR
*IS THE DATA ELEMENT FOR FIELD MATNR.
TYPES: BEGIN OF ty_mara,
matnr TYPE matnr,
mtart TYPE mtart,
meins TYPE meins,
kunnr TYPE wettb,
END OF ty_mara.
TYPES: BEGIN OF ty_makt,
matnr TYPE matnr,
maktx TYPE maktx,
spras TYPE spras,
END OF ty_makt.
TYPES: BEGIN OF ty_marc,
matnr TYPE matnr,
werks TYPE werks_d,
END OF ty_marc.
TYPES : BEGIN OF ty_kna1,
kunnr TYPE kunnr,
name1 TYPE name1_gp,
land1 TYPE land1_gp,
END OF ty_kna1.
TYPES: BEGIN OF ty_vbap,
matnr TYPE matnr,
posnr TYPE posnr_va,
matkl TYPE matkl,
vbeln TYPE vbeln_va,
END OF ty_vbap.
TYPES: BEGIN OF ty_ekpo,
ebeln TYPE ebeln,
ebelp TYPE ebelp,
bukrs TYPE bukrs,
werks TYPE werks_d,
lgort TYPE lgort_d,
matnr TYPE matnr,
mandt TYPE mandt,
END OF ty_ekpo.
DATA:t_mara TYPE TABLE OF ty_mara WITH HEADER LINE,
t_makt TYPE TABLE OF ty_makt WITH HEADER LINE,
t_marc TYPE TABLE OF ty_marc WITH HEADER LINE,
t_kna1 TYPE TABLE OF ty_kna1 WITH HEADER LINE,
t_vbap TYPE TABLE OF ty_vbap WITH HEADER LINE,
t_ekpo TYPE TABLE OF ty_ekpo WITH HEADER LINE.
FINAL INTERNAL TABLE *
TYPES: BEGIN OF ty_final,
matnr TYPE matnr,
mtart TYPE mtart,
meins TYPE meins,
werks TYPE werks_d,
maktx TYPE maktx,
spras TYPE spras,
vbeln TYPE vbeln_va,
posnr TYPE posnr_va,
matkl TYPE matkl,
ebeln TYPE ebeln,
ebelp TYPE ebelp,
bukrs TYPE bukrs,
kunnr TYPE kunnr,
land1 TYPE land1_gp,
name1 TYPE name1_gp,
lgort TYPE lgort_d,
END OF ty_final.
DATA : t_final TYPE TABLE OF ty_final WITH HEADER LINE.
*DATA: BEGIN OF V_matnr OCCURS 0,
matnr LIKE mara-matnr,
END OF t_matnr.
DATA:
a(32) TYPE c.
a = 'IBT000000000000000001000000000000000050'.
SELECTION SCREEN *
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
SELECT-OPTIONS : s_bukrs FOR ekpo-bukrs,
s_kunnr FOR kna1-kunnr,
s_werks FOR marc-werks,
s_matnr FOR mara-matnr OBLIGATORY.
SELECTION-SCREEN END OF BLOCK b1.
START OF SELECTION *
START-OF-SELECTION.
*USE SUBROUTINES
*get data
PERFORM get_data.
*populate final table
PERFORM populate_final_table.
END-OF-SELECTION.
*display output
PERFORM display_output.
TOP-OF-PAGE *
TOP-OF-PAGE.
ULINE.
WRITE : /60 'G E N E R A L D E T A I L S' COLOR 2 INVERSE OFF.
ULINE.
WRITE :/ sy-vline, 'MATERIAL' COLOR 4, "12 SY-VLINE,
13 sy-vline, 'IND SECTOR',
28 sy-vline, 'UNITS',
43 sy-vline, 'PLANT',
55 sy-vline, 'MAT DESC',
68 sy-vline, 'LANGU',
70 sy-vline, 'SALES DOC ITEM',
95 sy-vline, 'MAT GROUP',
110 sy-vline, 'SALES DOC',
125 sy-vline, 'CUST ID',
140 sy-vline, 'NAME',
155 sy-vline, 'COUNTRY',
165 sy-vline, 'company code',
205 sy-vline, 'storge loc'.
*& Form GET_DATA
text
--> p1 text
<-- p2 text
*TRY TO CLEAR AND REFRESH TABLES BEFORE SELECT
FORM get_data .
CLEAR t_mara.
REFRESH t_mara.
SELECT matnr
mtart
meins
kunnr
FROM mara
INTO TABLE t_mara
WHERE matnr IN s_matnr.
IF NOT t_mara[] IS INITIAL.
CLEAR t_marc.
REFRESH t_marc.
SELECT matnr
werks
FROM marc
INTO TABLE t_marc
FOR ALL ENTRIES IN t_mara
WHERE matnr = t_mara-matnr
AND werks IN s_werks.
CLEAR t_makt.
REFRESH t_makt.
SELECT matnr
maktx
spras
FROM makt
INTO TABLE t_makt
FOR ALL ENTRIES IN t_mara
WHERE matnr = t_mara-matnr
AND spras = sy-langu.
CLEAR t_vbap.
REFRESH t_vbap.
SELECT matnr
posnr
matkl
vbeln
FROM vbap
INTO TABLE t_vbap
FOR ALL ENTRIES IN t_mara
WHERE matnr = t_mara-matnr.
CLEAR t_ekpo.
REFRESH t_ekpo.
SELECT ebeln
ebelp
bukrs
werks
lgort
matnr
mandt
FROM ekpo
INTO TABLE t_ekpo
FOR ALL ENTRIES IN t_mara
WHERE matnr = t_mara-matnr
AND werks IN s_werks.
ENDIF.
CLEAR t_kna1.
REFRESH t_kna1.
SELECT kunnr
land1
name1
INTO TABLE t_kna1
FROM kna1.
WHERE WERKS in s_werks.
ENDFORM. " GET_DATA
*& Form POPULATE_FINAL_TABLE
text
--> p1 text
<-- p2 text
FORM populate_final_table .
*AVOID LOOPS AND TRY TO USE READ
CLEAR t_final.
REFRESH t_final.
LOOP AT t_mara.
MOVE t_mara-matnr TO t_final-matnr.
MOVE t_mara-mtart TO t_final-mtart.
MOVE t_mara-meins TO t_final-meins.
READ TABLE t_marc WITH KEY matnr = t_mara-matnr.
MOVE t_marc-werks TO t_final-werks.
READ TABLE t_makt WITH KEY matnr = t_mara-matnr.
MOVE t_makt-maktx TO t_final-maktx.
MOVE t_makt-spras TO t_final-spras.
READ TABLE t_vbap WITH KEY matnr = t_mara-matnr.
MOVE t_vbap-posnr TO t_final-posnr.
MOVE t_vbap-matkl TO t_final-matkl.
MOVE t_vbap-vbeln TO t_final-vbeln.
READ TABLE t_ekpo WITH KEY matnr = t_mara-matnr.
MOVE t_ekpo-bukrs TO t_final-bukrs.
MOVE t_ekpo-ebeln TO t_final-ebeln.
MOVE t_ekpo-ebelp TO t_final-ebelp.
MOVE t_ekpo-lgort TO t_final-lgort.
READ TABLE t_kna1 WITH KEY kunnr = t_mara-kunnr.
MOVE t_kna1-kunnr TO t_final-kunnr.
MOVE t_kna1-name1 TO t_final-name1.
MOVE t_kna1-land1 TO t_final-land1.
APPEND t_final.
CLEAR :t_final,t_mara,t_marc,t_makt,t_ekpo,t_vbap.
ENDLOOP.
ENDFORM. " POPULATE_FINAL_TABLE
*& Form DISPLAY_OUTPUT
text
--> p1 text
<-- p2 text
FORM display_output .
LOOP AT t_final.
WRITE : 4 t_final-matnr,
20 t_final-mtart,
28 t_final-meins,
46 t_final-werks,
58 t_final-maktx,
71 t_final-spras,
78 t_final-posnr,
100 t_final-matkl,
115 t_final-vbeln,
130 t_final-kunnr,
142 t_final-name1,
156 t_final-land1,
168 t_final-bukrs,
190 t_final-ebeln,
205 t_final-ebelp,
208 t_final-lgort.
ENDLOOP.
ENDFORM. " DISPLAY_OUTPUT -
Hi All,
I had given a task to tune oracle 10g database. I am really new in memory tuning although I had some SQL Tuning earlier. My server is in remote location and I can not login to Enterprise Manager GUI. I will be using SQL Developer or PL/SQL Developer for this. My application is web based application.
I have following queries with this respect:
- How should I start... Should I use tkprof or AWR.
- How to enable these tools.
- How to view its reports
- What should I check in these reports
- Will just increasing RAM improves performance or should we also increase Hard Disk?
- What is CPU Cost and I/O?
Please help.
Thanks & Regards.dbdan wrote:
Hi All,
I had given a task to tune oracle 10g database. I am really new in memory tuning although I had some SQL Tuning earlier. My server is in remote location and I can not login to Enterprise Manager GUI. I will be using SQL Developer or PL/SQL Developer for this. My application is web based application.
I have following queries with this respect:
- How should I start... Should I use tkprof or AWR.
- How to enable these tools.
- How to view its reports
- What should I check in these reports
- Will just increasing RAM improves performance or should we also increase Hard Disk?
- What is CPU Cost and I/O?
Please help.
Thanks & Regards.Here is something you might try as a starting point:
Capture the output of the following (to a table, send to Excel, or spool to a file):
SELECT
STAT_NAME,
VALUE
FROM
V$OSSTAT
ORDER BY
STAT_NAME;
SELECT
STAT_NAME,
VALUE
FROM
V$SYS_TIME_MODEL
ORDER BY
STAT_NAME;
SELECT
EVENT,
TOTAL_WAITS,
TOTAL_TIMEOUTS,
TIME_WAITED
FROM
V$SYSTEM_EVENT
WHERE
WAIT_CLASS != 'Idle'
ORDER BY
EVENT;Wait a known amount of time (5 minutes or 10 minutes)
Execute the above SQL statements again.
Subtract the starting values from the ending values, and post the results for any items where the difference is greater than 0. The Performance Tuning Guide (especially the 11g version) will help you understand what each item means.
To repeat what Ed stated, do not randomly change parameters (even if someone claims that they have successfully made the parameter change 100s of times).
You could also try a Statspack report, but it might be better to start with something which produces less than 70 pages of output.
Charles Hooper
IT Manager/Oracle DBA
K&M Machine-Fabricating, Inc. -
Regarding to perform in select query
could any tell the select query in this piece of code would affect the performance of the programe
DATA: BEGIN OF OUTREC,
BANKS LIKE BNKA-BANKS,
BANKL LIKE BNKA-BANKL,
BANKA LIKE BNKA-BANKA,
PROVZ LIKE BNKA-PROVZ, "Region (State, Province, County)
BRNCH LIKE BNKA-BRNCH,
STRAS LIKE BNKA-STRAS,
ORT01 LIKE BNKA-ORT01,
SWIFT LIKE BNKA-SWIFT,
END OF OUTREC.
OPEN DATASET P_OUTPUT FOR OUTPUT IN TEXT MODE.
IF SY-SUBRC NE 0. EXIT. ENDIF.
SELECT * FROM BNKA
WHERE BANKS EQ P_BANKS
AND LOEVM NE 'X'
AND XPGRO NE 'X'
ORDER BY BANKS BANKL.
PERFORM TRANSFER_DATA.
ENDSELECT.
CLOSE DATASET P_OUTPUT.
*& Transfer the data to the output file
FORM TRANSFER_DATA.
OUTREC-BANKS = BNKA-BANKS.
OUTREC-BANKL = BNKA-BANKL.
OUTREC-BANKA = BNKA-BANKA.
OUTREC-PROVZ = BNKA-PROVZ.
OUTREC-BRNCH = BNKA-BRNCH.
OUTREC-STRAS = BNKA-STRAS.
OUTREC-ORT01 = BNKA-ORT01.
OUTREC-SWIFT = BNKA-SWIFT.
TRANSFER OUTREC TO P_OUTPUT.
ENDFORM. " READ_IN_DATAHi
Ways 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.
Points # 1/2
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
2. Select all the records in a single shot using into table clause of select statement rather than to use Append statements.
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.
4. For testing existence , use Select.. Up to 1 rows statement instead of a Select-Endselect-loop with an Exit.
5. Use Select Single if all primary key fields are supplied in the Where condition .
Point # 1
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.
Point # 2
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'.
Point # 3
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.
Point # 4
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.
Point # 5
If all primary key fields are supplied in the Where condition you can even use Select Single.
Select Single requires one communication with the database system, whereas Select-Endselect needs two.
Select Statements contd.. SQL Interface
1. Use column updates instead of single-row updates
to update your database tables.
2. For all frequently used Select statements, try to use an index.
3. Using buffered tables improves the performance considerably.
Point # 1
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.
Point # 2
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.
Point # 3
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 contd 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 contd 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 contd Select Over more than one Internal table
1. Its better to use a views instead of nested Select statements.
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.
3. Instead of using nested Select loops it is often better to use subqueries.
Point # 1
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
Point # 2
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.
Point # 3
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.
2. Always try to use binary search instead of linear search. But dont forget to sort your internal table before that.
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.
6. Modifying selected components using MODIFY itab TRANSPORTING f1 f2.. accelerates the task of updating a line of an internal table.
Point # 2
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 ) ).
Point # 3
READ TABLE ITAB INTO WA WITH KEY K = 'X'. IS FASTER THAN USING
READ TABLE ITAB INTO WA WITH KEY (NAME) = 'X'.
Point # 5
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.
Point # 6
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
8. If collect semantics is required, it is always better to use to COLLECT rather than READ BINARY and then ADD.
9. "APPEND LINES OF itab1 TO itab2" accelerates the task of appending a table to another table considerably as compared to LOOP-APPEND-ENDLOOP.
10. DELETE ADJACENT DUPLICATES accelerates the task of deleting duplicate entries considerably as compared to READ-LOOP-DELETE-ENDLOOP.
11. "DELETE itab FROM ... TO ..." accelerates the task of deleting a sequence of lines considerably as compared to DO -DELETE-ENDDO.
Point # 7
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.
Point # 8
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)) .
Point # 9
APPEND LINES OF ITAB1 TO ITAB2.
This is more optimized as compared to
LOOP AT ITAB1 INTO WA.
APPEND WA TO ITAB2.
ENDLOOP.
Point # 10
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.
Point # 11
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.
13. Specify the sort key as restrictively as possible to run the program faster.
Point # 12
ITAB2[] = ITAB1[].
This is much more optimized as compared to
REFRESH ITAB2.
LOOP AT ITAB1 INTO WA.
APPEND WA TO ITAB2.
ENDLOOP.
Point # 13
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.
Maybe you are looking for
-
Creative Cloud Installation Failure
Second night with the same issue, creative cloud for desktop on Windows 7 wants to update again. It starts, downloads, and fails again. Last night I went through the effort of trying to repair it via the other forum topics. I ended up uninstalling
-
Hi All, The field Batch that is available in the sales order UI under Item. I want to add the same field in the Claims UI in the item level. I'm aware that I can use AET and EEWB. Here is the scenoria. How do I tie the batch field of the sales order
-
Where's the repeat button on the new version of iTunes?
I recently downloaded the new iTunes, and it was there. Then I pressed it for a song, and then it was gone. I've closed iTunes, but it hasn't come out. (Sorry if this is an easy fix, but I use this feature a lot!) Thanks!
-
PI 7.0 - UDF to access runtime constants
Hi experts, I've created some user-defined functions to use in my Message Mappings. I'm particularly interested in having Message Mappings that allow me to send error e-mails everytime an integration process fails. So, in every Message Mapping I've c
-
I would like my music to appear organized in the same way on my iPad as I have done it on my Mac Book. (and on my iPhone as well) Since it is in the cloud, why does it not appear the same way in all devices?