Unique Query Performance Challenge
Experts,
Please I need help in this area. I have a query written from a Multi-Provider. The query is using 98% of its data from 1 base cube. Currently it takes about 4 minutes to run and I want to bring it down to 1 minute.
This query is run off a web template and it is not static. The users can drilldown in any direction as required. The performance is more of a problem from the drilldown.
This query is a cost report with a lot of calculated and restricted key figures, and also a lot of excludes and includes all within the key figures.
The query has 13 restricted key figures and 5 calculated using the restricted, so 18 in all. Each restricted key figure resembles this example:
Cost Element (hierarchy restriction or singles values or ranges restriction)
Sender/Receiver
Version
Value Type
Amount
I believe the complex restrictions are slowing this report down. At the moment I am trying to speed up this report and it has proved a big challenge.
Has anybody experienced a similar challenge before?
Please do not point me to OSS notes or the standard performance documents. I have tried all that. Is there something else beyond those that can help here? Maybe a trick someone has tried?
Help!!
Thank you all for replying:
This Problem is still NOT solved but I have more Information.
This query Contains a heirarchy (Main CH in row) and a second object contains hierachy also but selected via Authorisation in the User Profile.
Acutually both hierarchies are selected in Authorisation from the User profile but once the User is in the report, the User can drilldown in the displayed hierarchy depending on thier authorisation.
But most users are at the highest level in both hierarchies so they drilldown on both hierarchies and this is done via a separate selection Section in the Web template.
I am trying to build the exact picture of my scenario.....pls any help.
With this new information, Can I still do the following:
Buffer Hier or Cache by Hier level???
Similar Messages
-
Update query performance - Challenging one
Hi All,
Below is the procedure I have created to update the five columns of one table. I have to update almost 9673533 records.
With the below procedure for updating 500 records it took around 1.5 hrs.
What would be the best strategy to enhance the performance of the procedure.. Please throw your ideas to make it in less time.
create or replace procedure test is
cursor cur_web_prd is
select rp_id
from dw_retl_prds t;
lc_short_brief varchar2(300);
lc_long_brief varchar2(2000);
ld_date_first_online date;
ld_date_sent date;
lc_rp_id varchar2(20);
lc_copos_ssl2 varchar2(40);
lc_qoslistid varchar2(40);
ln_web_prd_cnt number;
ln_copos_cnt number;
ln_qolist_cnt number;
begin
for i in cur_web_prd loop
select count(*)
into ln_web_prd_cnt
from dw_retl_prds t, web_prds@nrstp s
where t.rp_id = s.rp_rp_id
and t.rp_id = i.rp_id;
if ln_web_prd_cnt = 1 then
select t.rp_id,
s.short_brief,
s.long_brief,
s.date_first_online,
s.date_sent
into lc_rp_id,
lc_short_brief,
lc_long_brief,
ld_date_first_online,
ld_date_sent
from dw_retl_prds t, web_prds@nrstp s
where t.rp_id = s.rp_rp_id
and t.rp_id = i.rp_id;
select count(*)
into ln_copos_cnt
from dw_retl_prd_cat_val_us@dwenq t, dw_retl_prd_cat_vals@dwenq s
where t.rp_rp_id = i.rp_id
and trunc(sysdate) between t.dw_eftv_from and
nvl(t.dw_eftv_to, trunc(sysdate))
and s.pc_pc_id = 'COPOS_SSL2'
and trunc(sysdate) between s.dw_eftv_from and
nvl(s.dw_eftv_to, trunc(sysdate))
and t.pc_pc_id = s.pc_pc_id
and t.pcv_pcv_id = s.pcv_id;
if ln_copos_cnt = 1 then
select s.descr
into lc_copos_ssl2
from dw_retl_prd_cat_val_us@dwenq t, dw_retl_prd_cat_vals@dwenq s
where t.rp_rp_id = i.rp_id
and trunc(sysdate) between t.dw_eftv_from and
nvl(t.dw_eftv_to, trunc(sysdate))
and s.pc_pc_id = 'COPOS_SSL2'
and trunc(sysdate) between s.dw_eftv_from and
nvl(s.dw_eftv_to, trunc(sysdate))
and t.pc_pc_id = s.pc_pc_id
and t.pcv_pcv_id = s.pcv_id;
else
lc_copos_ssl2 := null;
end if;
select count(*)
into ln_qolist_cnt
from dw_retl_prd_cat_val_us@dwenq t, dw_retl_prd_cat_vals@dwenq s
where t.rp_rp_id = i.rp_id
and trunc(sysdate) between t.dw_eftv_from and
nvl(t.dw_eftv_to, trunc(sysdate))
and s.pc_pc_id = 'QOSLISTID'
and trunc(sysdate) between s.dw_eftv_from and
nvl(s.dw_eftv_to, trunc(sysdate))
and t.pc_pc_id = s.pc_pc_id
and t.pcv_pcv_id = s.pcv_id;
if ln_qolist_cnt = 1 then
select s.descr
into lc_qoslistid
from dw_retl_prd_cat_val_us@dwenq t, dw_retl_prd_cat_vals@dwenq s
where t.rp_rp_id = i.rp_id
and trunc(sysdate) between t.dw_eftv_from and
nvl(t.dw_eftv_to, trunc(sysdate))
and s.pc_pc_id = 'QOSLISTID'
and trunc(sysdate) between s.dw_eftv_from and
nvl(s.dw_eftv_to, trunc(sysdate))
and t.pc_pc_id = s.pc_pc_id
and t.pcv_pcv_id = s.pcv_id;
else
lc_qoslistid := null;
end if;
update dw_retl_prds t
set t.web_short_brief = lc_short_brief,
t.web_long_brief = lc_long_brief,
t.date_first_online = ld_date_first_online,
t.date_sent = ld_date_sent,
t.copos_ssl#2 = lc_copos_ssl2,
t.qoslistid = lc_qoslistid
where t.rp_id = i.rp_id;
end if;
ln_web_prd_cnt := 0;
lc_short_brief := null;
lc_long_brief := null;
ld_date_first_online := null;
ld_date_sent := null;
lc_copos_ssl2 := null;
lc_qoslistid := null;
end loop;
commit;
end;I have taken count(*) to check and avoid the too_many_rows and no_data_found exceptions. As there is no Unique key on the table Web_prds@nrstp.
For dw_retl_prds the unique key is rp_id.Hello
First things first, you need to trace it to find out where it is spending it's time. Find out which statements are taking the longest and target them.
That said however, you are using the slowest possible method for processing this data by using a cursor for loop. You are then doing separate lookups over a database link - and you are doing the queries twice! You could reduce the time of the lookups by 50% just by combining the queries...for example
CREATE OR REPLACE PROCEDURE test
IS
CURSOR cur_web_prd
IS
SELECT rp_id
FROM dw_retl_prds t;
lc_short_brief VARCHAR2 (300);
lc_long_brief VARCHAR2 (2000);
ld_date_first_online DATE;
ld_date_sent DATE;
lc_rp_id VARCHAR2 (20);
lc_copos_ssl2 VARCHAR2 (40);
lc_qoslistid VARCHAR2 (40);
ln_web_prd_cnt NUMBER;
ln_copos_cnt NUMBER;
ln_qolist_cnt NUMBER;
BEGIN
FOR i IN cur_web_prd
LOOP
BEGIN
SELECT t.rp_id,
s.short_brief,
s.long_brief,
s.date_first_online,
s.date_sent
INTO lc_rp_id,
lc_short_brief,
lc_long_brief,
ld_date_first_online,
ld_date_sent
FROM dw_retl_prds t, web_prds@nrstp s
WHERE t.rp_id = s.rp_rp_id AND t.rp_id = i.rp_id;
BEGIN
SELECT s.descr
INTO lc_copos_ssl2
FROM dw_retl_prd_cat_val_us@dwenq t,
dw_retl_prd_cat_vals@dwenq s
WHERE t.rp_rp_id = i.rp_id
AND TRUNC (SYSDATE) BETWEEN t.dw_eftv_from
AND NVL (t.dw_eftv_to,
TRUNC (SYSDATE))
AND s.pc_pc_id = 'COPOS_SSL2'
AND TRUNC (SYSDATE) BETWEEN s.dw_eftv_from
AND NVL (s.dw_eftv_to,
TRUNC (SYSDATE))
AND t.pc_pc_id = s.pc_pc_id
AND t.pcv_pcv_id = s.pcv_id;
EXCEPTION
WHEN NO_DATA_FOUND THEN
lc_copos_ssl2 := NULL;
END;
BEGIN
SELECT s.descr
INTO lc_qoslistid
FROM dw_retl_prd_cat_val_us@dwenq t,
dw_retl_prd_cat_vals@dwenq s
WHERE t.rp_rp_id = i.rp_id
AND TRUNC (SYSDATE) BETWEEN t.dw_eftv_from
AND NVL (t.dw_eftv_to,
TRUNC (SYSDATE))
AND s.pc_pc_id = 'QOSLISTID'
AND TRUNC (SYSDATE) BETWEEN s.dw_eftv_from
AND NVL (s.dw_eftv_to,
TRUNC (SYSDATE))
AND t.pc_pc_id = s.pc_pc_id
AND t.pcv_pcv_id = s.pcv_id;
EXCEPTION
WHEN NO_DATA_FOUND THEN
lc_qoslistid := NULL;
END;
UPDATE dw_retl_prds t
SET t.web_short_brief = lc_short_brief,
t.web_long_brief = lc_long_brief,
t.date_first_online = ld_date_first_online,
t.date_sent = ld_date_sent,
t.copos_ssl#2 = lc_copos_ssl2,
t.qoslistid = lc_qoslistid
WHERE t.rp_id = i.rp_id;
EXCEPTION
WHEN
NO_DATA_FOUND THEN
NULL;
END;
ln_web_prd_cnt := 0;
lc_short_brief := NULL;
lc_long_brief := NULL;
ld_date_first_online := NULL;
ld_date_sent := NULL;
lc_copos_ssl2 := NULL;
lc_qoslistid := NULL;
END LOOP;
COMMIT;
END;But this is still not an efficient implementation - you should try to put all of this into 1 or more Update statements without the loop. Something like...
UPDATE dw_retl_prds t
SET ( t.web_short_brief,
t.web_long_brief,
t.date_first_online,
t.date_sent
) =
( SELECT
s.short_brief,
s.long_brief,
s.date_first_online,
s.date_sent
FROM
web_prds@nrstp s
WHERE
t.rp_id = s.rp_rp_id
WHERE
EXISTS( SELECT
NULL
FROM
web_prds@nrstp s
WHERE
t.rp_id = s.rp_rp_id
);That way you would have 1, 2 or 3 update statements each of which will run in a fraction of the time it takes for your process to run. You may need to do more work after this, such as materializing the results locally from the remote database rather than joining over the database link, but that's a bridge you can cross when you come to it.
HTH
David -
SQL query performance issues.
Hi All,
I worked on the query a month ago and the fix worked for me in test intance but failed in production. Following is the URL for the previous thread.
SQL query performance issues.
Following is the tkprof file.
CURSOR_ID:76 LENGTH:2383 ADDRESS:f6b40ab0 HASH_VALUE:2459471753 OPTIMIZER_GOAL:ALL_ROWS USER_ID:443 (APPS)
insert into cos_temp(
TRX_DATE, DEPT, PRODUCT_LINE, PART_NUMBER,
CUSTOMER_NUMBER, QUANTITY_SOLD, ORDER_NUMBER,
INVOICE_NUMBER, EXT_SALES, EXT_COS,
GROSS_PROFIT, ACCT_DATE,
SHIPMENT_TYPE,
FROM_ORGANIZATION_ID,
FROM_ORGANIZATION_CODE)
select a.trx_date,
g.segment5 dept,
g.segment4 prd,
m.segment1 part,
d.customer_number customer,
b.quantity_invoiced units,
-- substr(a.sales_order,1,6) order#,
substr(ltrim(b.interface_line_attribute1),1,10) order#,
a.trx_number invoice,
(b.quantity_invoiced * b.unit_selling_price) sales,
(b.quantity_invoiced * nvl(price.operand,0)) cos,
(b.quantity_invoiced * b.unit_selling_price) -
(b.quantity_invoiced * nvl(price.operand,0)) profit,
to_char(to_date('2010/02/28 00:00:00','yyyy/mm/dd HH24:MI:SS'),'DD-MON-RR') acct_date,
'DRP',
l.ship_from_org_id,
p.organization_code
from ra_customers d,
gl_code_combinations g,
mtl_system_items m,
ra_cust_trx_line_gl_dist c,
ra_customer_trx_lines b,
ra_customer_trx_all a,
apps.oe_order_lines l,
apps.HR_ORGANIZATION_INFORMATION i,
apps.MTL_INTERCOMPANY_PARAMETERS inter,
apps.HZ_CUST_SITE_USES_ALL site,
apps.qp_list_lines_v price,
apps.mtl_parameters p
where a.trx_date between to_date('2010/02/01 00:00:00','yyyy/mm/dd HH24:MI:SS')
and to_date('2010/02/28 00:00:00','yyyy/mm/dd HH24:MI:SS')+0.9999
and a.batch_source_id = 1001 -- Sales order shipped other OU
and a.complete_flag = 'Y'
and a.customer_trx_id = b.customer_trx_id
and b.customer_trx_line_id = c.customer_trx_line_id
and a.sold_to_customer_id = d.customer_id
and b.inventory_item_id = m.inventory_item_id
and m.organization_id
= decode(substr(g.segment4,1,2),'01',5004,'03',5004,
'02',5003,'00',5001,5002)
and nvl(m.item_type,'0') <> '111'
and c.code_combination_id = g.code_combination_id+0
and l.line_id = b.interface_line_attribute6
and i.organization_id = l.ship_from_org_id
and p.organization_id = l.ship_from_org_id
and i.org_information3 <> '5108'
and inter.ship_organization_id = i.org_information3
and inter.sell_organization_id = '5108'
and inter.customer_site_id = site.site_use_id
and site.price_list_id = price.list_header_id
and product_attr_value = to_char(m.inventory_item_id)
call count cpu elapsed disk query current rows misses
Parse 1 0.47 0.56 11 197 0 0 1
Execute 1 3733.40 3739.40 34893 519962154 11 188 0
total 2 3733.87 3739.97 34904 519962351 11 188 1
| Rows Row Source Operation
| ------------ ---------------------------------------------------
| 188 HASH JOIN (cr=519962149 pr=34889 pw=0 time=2607.35)
| 741 .TABLE ACCESS BY INDEX ROWID QP_PRICING_ATTRIBUTES (cr=519939426 pr=34889 pw=0 time=2457.32)
| 254644500 ..NESTED LOOPS (cr=519939265 pr=34777 pw=0 time=3819.67)
| 254643758 ...NESTED LOOPS (cr=8921833 pr=29939 pw=0 time=1274.41)
| 741 ....NESTED LOOPS (cr=50042 pr=7230 pw=0 time=11.37)
| 741 .....NESTED LOOPS (cr=48558 pr=7229 pw=0 time=11.35)
| 741 ......NESTED LOOPS (cr=47815 pr=7223 pw=0 time=11.32)
| 3237 .......NESTED LOOPS (cr=41339 pr=7223 pw=0 time=12.42)
| 3237 ........NESTED LOOPS (cr=38100 pr=7223 pw=0 time=12.39)
| 3237 .........NESTED LOOPS (cr=28296 pr=7139 pw=0 time=12.29)
| 1027 ..........NESTED LOOPS (cr=17656 pr=4471 pw=0 time=3.81)
| 1027 ...........NESTED LOOPS (cr=13537 pr=4404 pw=0 time=3.30)
| 486 ............NESTED LOOPS (cr=10873 pr=4240 pw=0 time=0.04)
| 486 .............NESTED LOOPS (cr=10385 pr=4240 pw=0 time=0.03)
| 486 ..............TABLE ACCESS BY INDEX ROWID RA_CUSTOMER_TRX_ALL (cr=9411 pr=4240 pw=0 time=0.02)
| 75253 ...............INDEX RANGE SCAN RA_CUSTOMER_TRX_N5 (cr=403 pr=285 pw=0 time=0.38)
| 486 ..............TABLE ACCESS BY INDEX ROWID HZ_CUST_ACCOUNTS (cr=974 pr=0 pw=0 time=0.01)
| 486 ...............INDEX UNIQUE SCAN HZ_CUST_ACCOUNTS_U1 (cr=488 pr=0 pw=0 time=0.01)
| 486 .............INDEX UNIQUE SCAN HZ_PARTIES_U1 (cr=488 pr=0 pw=0 time=0.01)
| 1027 ............TABLE ACCESS BY INDEX ROWID RA_CUSTOMER_TRX_LINES_ALL (cr=2664 pr=164 pw=0 time=1.95)
| 2063 .............INDEX RANGE SCAN RA_CUSTOMER_TRX_LINES_N2 (cr=1474 pr=28 pw=0 time=0.22)
| 1027 ...........TABLE ACCESS BY INDEX ROWID RA_CUST_TRX_LINE_GL_DIST_ALL (cr=4119 pr=67 pw=0 time=0.54)
| 1027 ............INDEX RANGE SCAN RA_CUST_TRX_LINE_GL_DIST_N1 (cr=3092 pr=31 pw=0 time=0.20)
| 3237 ..........TABLE ACCESS BY INDEX ROWID MTL_SYSTEM_ITEMS_B (cr=10640 pr=2668 pw=0 time=15.35)
| 3237 ...........INDEX RANGE SCAN MTL_SYSTEM_ITEMS_B_U1 (cr=2062 pr=40 pw=0 time=0.33)
| 3237 .........TABLE ACCESS BY INDEX ROWID OE_ORDER_LINES_ALL (cr=9804 pr=84 pw=0 time=0.77)
| 3237 ..........INDEX UNIQUE SCAN OE_ORDER_LINES_U1 (cr=6476 pr=47 pw=0 time=0.43)
| 3237 ........TABLE ACCESS BY INDEX ROWID MTL_PARAMETERS (cr=3239 pr=0 pw=0 time=0.04)
| 3237 .........INDEX UNIQUE SCAN MTL_PARAMETERS_U1 (cr=2 pr=0 pw=0 time=0.01)
| 741 .......TABLE ACCESS BY INDEX ROWID HR_ORGANIZATION_INFORMATION (cr=6476 pr=0 pw=0 time=0.10)
| 6474 ........INDEX RANGE SCAN HR_ORGANIZATION_INFORMATIO_FK2 (cr=3239 pr=0 pw=0 time=0.03)Please help.
Regards
Ashish| 254644500 ..NESTED LOOPS (cr=519939265 pr=34777 pw=0 time=3819.67)
| 254643758 ...NESTED LOOPS (cr=8921833 pr=29939 pw=0 time=1274.41)There is no way the optimizer should choose to process that many rows using nested loops.
Either the statistics are not up to date, the data values are skewed or you have some optimizer parameter set to none default to force index access.
Please post explain plan and optimizer* parameter settings. -
Disappointing query performance with object-relational storag
Hello,
after some frustrating days trying to improve query performance on an xmltype table I'm on my wits' end. I have tried all possible combinations of indexes, added scopes, tried out of line and inline storage, removed recursive type definition from the schema, tried the examples from the form thread Setting Attribute SQLInline to false for Out-of-Line Storage (having the same problems) and still have no clue. I have prepared a stripped down example of my schema which shows the same problems as the real one. I'm using 10.2.0.4.0:
SQL> select * from v$version;
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Prod
PL/SQL Release 10.2.0.4.0 - Production
CORE 10.2.0.4.0 Production
TNS for Linux: Version 10.2.0.4.0 - Production
NLSRTL Version 10.2.0.4.0 - Production
You can find the script on http://www.grmblfrz.de/xmldbproblem.sql (I tried including it here but got an internal server error) The results are on http://www.grmblfrz.de/xmldbtest.lst . I have no idea how to improve the performance (and if even with this simple schema query rewrite does not work, how can oracle xmldb be feasible for more complex structures?). I must have made a mistake somewhere, hopefully someone can spot it.
Thanks in advance.
--Swen
Edited by: user636644 on Aug 30, 2008 3:55 PM
Edited by: user636644 on Aug 30, 2008 4:12 PMMarc,
thanks, I did not know that it is possible to use "varray store as table" for the reference tables. I have tried your example. I can create the nested table, the scope and the indexes, but I get a different result - full table scan on t_element. With the original table I get an index scan. On the original table there is a trigger (t_element$xd) which is missing on the new table. I have tried the same with an xmltype table (drop table t_element; create table t_element of xmltype ...) with the same result. My script ... is on [google groups|http://groups.google.com/group/oracle-xmldb-temporary-group/browse_thread/thread/f30c3cf0f3dbcafc] (internal server error while trying to include it here). Here is the plan of the query
select rt.object_value
from t_element rt
where existsnode(rt.object_value,'/mddbelement/group[attribute[@name="an27"]="99"]') = 1;
Execution Plan
Plan hash value: 4104484998
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 1 | 40 | 2505 (1)| 00:00:38 |
| 1 | TABLE ACCESS BY INDEX ROWID | NT_GROUP | 1 | 20 | 3 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | SYS_C0082879 | 1 | | 2 (0)| 00:00:01 |
|* 3 | FILTER | | | | | |
| 4 | TABLE ACCESS FULL | T_ELEMENT | 1000 | 40000 | 4 (0)| 00:00:01 |
| 5 | NESTED LOOPS SEMI | | 1 | 88 | 5 (0)| 00:00:01 |
| 6 | NESTED LOOPS | | 1 | 59 | 4 (0)| 00:00:01 |
| 7 | TABLE ACCESS BY INDEX ROWID| NT_GROUP | 1 | 20 | 3 (0)| 00:00:01 |
|* 8 | INDEX RANGE SCAN | SYS_C0082879 | 1 | | 2 (0)| 00:00:01 |
|* 9 | TABLE ACCESS BY INDEX ROWID| T_GROUP | 1 | 39 | 1 (0)| 00:00:01 |
|* 10 | INDEX UNIQUE SCAN | SYS_C0082878 | 1 | | 0 (0)| 00:00:01 |
|* 11 | INDEX RANGE SCAN | SYS_IOT_TOP_184789 | 1 | 29 | 1 (0)| 00:00:01 |
Predicate Information (identified by operation id):
2 - access("NESTED_TABLE_ID"=:B1)
3 - filter( EXISTS (SELECT /*+ ???)
8 - access("NESTED_TABLE_ID"=:B1)
9 - filter("T_GROUP"."SYS_NC0001300014$" IS NOT NULL AND
SYS_CHECKACL("ACLOID","OWNERID",xmltype('<privilege
xmlns="http://xmlns.oracle.com/xdb/acl.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-insta
nce" xsi:schemaLocation="http://xmlns.oracle.com/xdb/acl.xsd
http://xmlns.oracle.com/xdb/acl.xsd DAV:http://xmlns.oracle.com/xdb/dav.xsd"><read-properties
/><read-contents/></privilege>'))=1)
10 - access("SYS_ALIAS_3"."COLUMN_VALUE"="T_GROUP"."SYS_NC_OID$")
11 - access("NESTED_TABLE_ID"="T_GROUP"."SYS_NC0001300014$")
filter("SYS_XDBBODY$"='99' AND "NAME"='an27')
Edited by: user636644 on Sep 1, 2008 9:56 PM -
Its 11G R2 version, and query is performing very slow
SELECT OBJSTATE
FROM
SUB_CON_CALL_OFF WHERE SUB_CON_NO = :B2 AND CALL_OFF_SEQ = :B1
call count cpu elapsed disk query current rows
Parse 140 0.00 0.00 0 0 0 0
Execute 798747 8.34 14.01 0 4 0 0
Fetch 798747 22.22 35.54 0 7987470 0 798747
total 1597634 30.56 49.56 0 7987474 0 798747
Misses in library cache during parse: 1
Misses in library cache during execute: 1
Optimizer mode: ALL_ROWS
Parsing user id: 51 (recursive depth: 1)
Rows Row Source Operation
5 FILTER (cr=50 pr=0 pw=0 time=239 us)
5 NESTED LOOPS (cr=40 pr=0 pw=0 time=164 us)
5 NESTED LOOPS (cr=30 pr=0 pw=0 time=117 us)
5 TABLE ACCESS BY INDEX ROWID SUB_CON_CALL_OFF_TAB (cr=15 pr=0 pw=0 time=69 us)
5 INDEX UNIQUE SCAN SUB_CON_CALL_OFF_PK (cr=10 pr=0 pw=0 time=41 us)(object id 59706)
5 TABLE ACCESS BY INDEX ROWID SUB_CONTRACT_TAB (cr=15 pr=0 pw=0 time=42 us)
5 INDEX UNIQUE SCAN SUB_CONTRACT_PK (cr=10 pr=0 pw=0 time=26 us)(object id 59666)
5 INDEX UNIQUE SCAN USER_PROFILE_ENTRY_SYS_PK (cr=10 pr=0 pw=0 time=41 us)(object id 60891)
5 INDEX UNIQUE SCAN USER_ALLOWED_SITE_PK (cr=10 pr=0 pw=0 time=36 us)(object id 60866)
5 FAST DUAL (cr=0 pr=0 pw=0 time=4 us)
Elapsed times include waiting on following events:
Event waited on Times Max. Wait Total Waited
---------------------------------------- Waited ---------- ------------
library cache lock 1 0.00 0.00
gc cr block 2-way 3 0.00 0.00
gc current block 2-way 1 0.00 0.00
gc cr multi block request 4 0.00 0.00 Edited by: 842638 on Feb 2, 2013 5:52 AMHi Mark,
Just have few basic doubts regarding the below query performance :
call count cpu elapsed disk query current rows
Parse 140 0.00 0.00 0 0 0 0
Execute 798747 8.34 14.01 0 4 0 0
Fetch 798747 22.22 35.54 0 7987470 0 798747
total 1597634 30.56 49.56 0 7987474 0 798747
Misses in library cache during parse: 1
Misses in library cache during execute: 1
Optimizer mode: ALL_ROWS
Parsing user id: 51 (recursive depth: 1)
Rows Row Source Operation
5 FILTER (cr=50 pr=0 pw=0 time=239 us)
5 NESTED LOOPS (cr=40 pr=0 pw=0 time=164 us)
5 NESTED LOOPS (cr=30 pr=0 pw=0 time=117 us)
5 TABLE ACCESS BY INDEX ROWID SUB_CON_CALL_OFF_TAB (cr=15 pr=0 pw=0 time=69 us)
5 INDEX UNIQUE SCAN SUB_CON_CALL_OFF_PK (cr=10 pr=0 pw=0 time=41 us)(object id 59706)
5 TABLE ACCESS BY INDEX ROWID SUB_CONTRACT_TAB (cr=15 pr=0 pw=0 time=42 us)
5 INDEX UNIQUE SCAN SUB_CONTRACT_PK (cr=10 pr=0 pw=0 time=26 us)(object id 59666)
5 INDEX UNIQUE SCAN USER_PROFILE_ENTRY_SYS_PK (cr=10 pr=0 pw=0 time=41 us)(object id 60891)
5 INDEX UNIQUE SCAN USER_ALLOWED_SITE_PK (cr=10 pr=0 pw=0 time=36 us)(object id 60866)
5 FAST DUAL (cr=0 pr=0 pw=0 time=4 us)
Elapsed times include waiting on following events:
Event waited on Times Max. Wait Total Waited
---------------------------------------- Waited ---------- ------------
library cache lock 1 0.00 0.00
gc cr block 2-way 3 0.00 0.00
gc current block 2-way 1 0.00 0.00
gc cr multi block request 4 0.00 0.00
1] How do you determine that this query performance is +ok+ ?
2] What is the actual need of checking the query performance this way?
3] Is this the TKPROF output?
4] How do you know that the query was +called+ 798747 times? the +execute+ shows 0
Could you please help me with this?
Thanks.
Ranit B. -
Hi,
I am executing one query it takes 40-45 mins, can anybody tell me where is the issue because I have index on SUBSCRIPTION table.
Query is taking time in Nested Loop. Can anyboduy please help to improve query performance.
Select count(unique individual_id)
from SUBSCRIPTION S ,SOURCE D WHERE S.ORDER_DOCUMENT_KEY_CD=D.FULFILLMENT_KEY_CD AND prod_abbr='TOH'
and to_char(source_start_dt,'YYMM')>='1010' and mke_mag_source_type_cd='D';
select count(*) from source; ----------3,425,131
select count(*) from subscription;---------394,517,271
Below is exlain Plan
Plan
SELECT STATEMENT CHOOSECost: 219 Bytes: 38 Cardinality: 1
13 SORT GROUP BY Bytes: 38 Cardinality: 1
12 PX COORDINATOR
11 PX SEND QC (RANDOM) SYS.:TQ10001 Bytes: 38 Cardinality: 1
10 SORT GROUP BY Bytes: 38 Cardinality: 1
9 PX RECEIVE Bytes: 38 Cardinality: 1
8 PX SEND HASH SYS.:TQ10000 Bytes: 38 Cardinality: 1
7 SORT GROUP BY Bytes: 38 Cardinality: 1
6 TABLE ACCESS BY LOCAL INDEX ROWID TABLE SUBSCRIPTION Cost: 21 Bytes: 3,976 Cardinality: 284
5 NESTED LOOPS Cost: 219 Bytes: 604,276 Cardinality: 15,902
2 PX BLOCK ITERATOR
1 TABLE ACCESS FULL TABLE SOURCE Cost: 72 Bytes: 1,344 Cardinality: 56
4 PARTITION HASH ALL Cost: 2 Cardinality: 284 Partition #: 12 Partitions accessed #1 - #16
3 INDEX RANGE SCAN INDEX XAK1SUBSCRIPTION Cost: 2 Cardinality: 284 Partition #: 12 Partitions accessed #1 - #16
Please suggestit eliminate hidden conversation from char to numberi dont know indexes/partition on TC table, and you?
drop table test;
create table test as select level id, sysdate + level/24/60/60 datum from dual connect by level < 10000;
create index idx1 on test(datum);
analyze table test compute statistics;
explain plan for select count(*) from test where to_char(datum,'YYYYMMDD') > '20120516';
SELECT * FROM TABLE(dbms_xplan.display);
PLAN_TABLE_OUTPUT
Plan hash value: 3467505462
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 1 | 7 | 7 (15)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 7 | | |
|* 2 | TABLE ACCESS FULL| TEST | 500 | 3500 | 7 (15)| 00:00:01 |
Predicate Information (identified by operation id):
2 - filter(TO_CHAR(INTERNAL_FUNCTION("DATUM"),'YYYYMMDD')>'20120516')
explain plan for select count(*) from test where datum > trunc(sysdate);
SELECT * FROM TABLE(dbms_xplan.display);
PLAN_TABLE_OUTPUT
Plan hash value: 2330213601
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 1 | 7 | 7 (15)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 7 | | |
|* 2 | INDEX FAST FULL SCAN| IDX1 | 9999 | 69993 | 7 (15)| 00:00:01 |
Predicate Information (identified by operation id):
2 - filter("DATUM">TRUNC(SYSDATE@!))
drop index idx1;
create index idx1 on test(to_number(to_char(datum,'YYYYMMDD')));
analyze table test compute statistics;
explain plan for select count(*) from test where to_number(to_char(datum,'YYYYMMDD')) > 20120516;
SELECT * FROM TABLE(dbms_xplan.display);
PLAN_TABLE_OUTPUT
Plan hash value: 227046122
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 1 | 5 | 2 (0)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 5 | | |
|* 2 | INDEX RANGE SCAN| IDX1 | 1 | 5 | 2 (0)| 00:00:01 |
Predicate Information (identified by operation id):
2 - access(TO_NUMBER(TO_CHAR(INTERNAL_FUNCTION("DATUM"),'YYYYMMDD'))>
20120516)
explain plan for select count(*) from test where datum > trunc(sysdate);
SELECT * FROM TABLE(dbms_xplan.display);
PLAN_TABLE_OUTPUT
Plan hash value: 3467505462
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 1 | 7 | 7 (15)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 7 | | |
|* 2 | TABLE ACCESS FULL| TEST | 9999 | 69993 | 7 (15)| 00:00:01 |
Predicate Information (identified by operation id):
2 - filter("DATUM">TRUNC(SYSDATE@!)) -
hi i'm using cte's as defined and took a temp table to take the columns from temp table.now,when i'm executing this logic of sp..its taking 7min for 3lakhs records. can any one pls help me how to improve my query performance..
the code which i'm using is:
create temtable as(cols);WITH Datematrix(AllocationDate)/*cte*/
As
SELECT @StartDate AS AllocationDate
UNION ALL
SELECT DATEADD(D,1,AllocationDate) AS AllocationDate
FROM Datematrix WHERE AllocationDate<@EndDate
/*cte*/ Allocation (Division,DivisionID,ResourceName,ResourceEmailID,ResourceID,Project
,ProjectID,Scope,ScopeID,WorkItem,TaskStartDate,TaskEndDate
,ProgramID ,Program,PortfolioID ,Portfolio,StatusID,Status,TaskID,EstimateHrs,ScopeEstimateHrs)
AS
SELECT
DIV.Division
,RES.DivisionID
,RES.ResourceName
,ResourceEmailID = STUFF((
SELECT COALESCE( ', ' + CONVERT(VARCHAR,RES.Email1), '')
FROM dbo.TasksResource TSKRES WITH(NOLOCK) LEFT OUTER JOIN
dbo.tb_Resource RES WITH(NOLOCK) ON RES.UID = TSKRES.ResourceID
WHERE TSKRES.TaskID = TSK.TaskID
FOR XML PATH('')), 1, 1, '')
,RES.UID ResourceID
,PRJ.Project + ' (' + CONVERT(VARCHAR(15),PRJ.StartDate,101) +' - ' + CONVERT(VARCHAR(15),PRJ.EndDate,101) + ')' as Project
,PRJ.UID ProjectID
,SCP.Title Scope
,SCP.ScopeID
,TSK.Title WorkItem
,TSK.StartDate TaskStartDate
,TSK.EndDate TaskEndDate
,PRJ.ProgramID
,PR.Program
,PR.PortfolioID
,PF.Portfolio
,TSK.StatusID
,ST.Status
,TSK.TaskID
,TSK.EstimateHrs
,(isnull(SCP.EstimateARCH,0) + isnull(SCP.EstimateBA,0) + isnull(SCP.EstimateDev,0) + isnull(SCP.EstimatePM,0) + isnull(SCP.EstimateQA,0) + isnull(SCP.EstimateRM,0)) as ScopeEstimateHrs
--SCP.EstimateARCH + SCP.EstimateBA +SCP.EstimateDev +SCP.EstimatePM +SCP.EstimateQA +SCP.EstimateRM as ScopeEstimateHrs
FROM Tasks TSK WITH(NOLOCK)
INNER JOIN dbo.Scope SCP WITH(NOLOCK) ON TSK.ScopeID = SCP.ScopeID
INNER JOIN dbo.tb_Project PRJ WITH(NOLOCK)ON TSK.ProjectID = PRJ.UID
INNER JOIN dbo.tb_Program PR WITH(NOLOCK) ON PR.UID=PRJ.ProgramID
INNER JOIN dbo.tb_Portfolio PF WITH(NOLOCK)ON PF.UID=PR.PortfolioID
LEFT OUTER JOIN dbo.TasksResource TSKRES WITH(NOLOCK)ON TSKRES.TaskID = TSK.TaskID
LEFT OUTER JOIN dbo.tb_Resource RES WITH(NOLOCK) ON RES.UID = TSKRES.ResourceID
LEFT JOIN dbo.tb_Division DIV WITH(NOLOCK) ON RES.DivisionID = DIV.UID
LEFT JOIN dbo.tb_Status ST WITH(NOLOCK) ON TSK.StatusID=ST.UID /*relating with the high level work items */
WHERE (PRJ.UID = @Project OR @Project = -1)
AND (PRJ.ProgramID = @Program OR @Program = -1)
AND (PRJ.PortfolioID =@Portfolio OR @Portfolio = -1)
,/*columns used in 2 cte's are taken in below maindata*/
MainData (AllocationDate,Division,DivisionID,ResourceName,ResourceEmailID,ResourceID,Project,ProjectID
,Scope,ScopeID,WorkItem,TaskStartDate,TaskEndDate
,ProgramID ,Program,PortfolioID ,Portfolio,StatusID,Status,TaskID,EstimateHrs,ScopeEstimateHrs,Allocated)
AS
( SELECT
Datematrix.*
,Allocation.*
,CASE WHEN ISDATE(TaskStartDate)=1 THEN 1 ELSE 0 END AS Allocated
FROM Datematrix FULL OUTER JOIN Allocation
ON ( Datematrix.AllocationDate>= Allocation.TaskStartDate
AND Datematrix.AllocationDate<=Allocation.TaskEndDate
)INSERT INTO #TempTable
SELECT * FROM MainData
OPTION (MAXRECURSION 0);this way the code goes...please help.. i need my query to be tuned..!!thanks in advance..
luckyWhen asking performance related questions, it is usually a bad idea to use pseudo code. In this case, I am referring to the fact that your "temtable" declaration is invalid, and the fact that it is unclear where the local variables and/or parameter originate
from.
In your query, you are using the "optional parameter" pattern for local variables and/or parameters @Project, @Program and @Portfolio. I therefore assume that we are talking about a stored procedure here.
In stored procedures, optional parameters often have a negative effect on performance. You can cancel some of that effect by adding the OPTION(RECOMPILE) hint (assuming it is part of the stored procedure, and we are talking about parameters, not local variables).
Also, you could consider using a calendar table instead of the Datematrix CTE. Reason for that is, that it is now probably a difficult join with Allocation, because the optimizer probably hasn't established that Datematrix is a unique range of dates. Also,
it will not have any index. A calendar table with unique index on the date can help.
The rest is probably up to the indexes on the base tables. Since you did not post any DDL, I can't comment on that. Lack of proper indexes are usually the biggest reason of Select performance problems.
Gert-Jan -
Hi
I have created a procedure that accepts two bind variables from a report. The user will select one or the other, both or neither of the variables. To return the appropriate results i have created a view with the entire result set and in the procedure are a number of if statements that determine what to place in the where clause selecting from the view, depending on what variables populated.
My concern is that the query that generates the view includes several joins and in total outputs around 150,000 records and seems to be rather slow to run.
Would you recommend another solution such as placing the query in the procedure itself repeated for every if statement?
Or should I work on the query performance?
What would be the most efficient solution for my problem?
Any advice would be greatly appreciated.
Thanks[url http://forums.oracle.com/forums/thread.jspa?threadID=501834&tstart=0]When your query takes too long
-
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 -
Report burst:To increase query performance in xcelsius
Is there anyway to increase query performance in xcelsius by using report bursting
Fremlin,
Report bursting is only for distributing your reports to your end users.
You can improve performance only by following the [Best practices|https://www.sdn.sap.com/irj/boc/index?rid=/library/uuid/a084a11c-6564-2b10-79ac-cc1eb3f017ac] in xcelsius.
-Anil -
QUERY PERFORMANCE AND DATA LOADING PERFORMANCE ISSUES
WHAT ARE QUERY PERFORMANCE ISSUES WE NEED TO TAKE CARE PLEASE EXPLAIN AND LET ME KNOW T CODES...PLZ URGENT
WHAT ARE DATALOADING PERFORMANCE ISSUES WE NEED TO TAKE CARE PLEASE EXPLAIN AND LET ME KNOW T CODES PLZ URGENT
WILL REWARD FULL POINT S
REGARDS
GURUBW Back end
Some Tips -
1)Identify long-running extraction processes on the source system. Extraction processes are performed by several extraction jobs running on the source system. The run-time of these jobs affects the performance. Use transaction code SM37 Background Processing Job Management to analyze the run-times of these jobs. If the run-time of data collection jobs lasts for several hours, schedule these jobs to run more frequently. This way, less data is written into update tables for each run and extraction performance increases.
2)Identify high run-times for ABAP code, especially for user exits. The quality of any custom ABAP programs used in data extraction affects the extraction performance. Use transaction code SE30 ABAP/4 Run-time Analysis and then run the analysis for the transaction code RSA3 Extractor Checker. The system then records the activities of the extraction program so you can review them to identify time-consuming activities. Eliminate those long-running activities or substitute them with alternative program logic.
3)Identify expensive SQL statements. If database run-time is high for extraction jobs, use transaction code ST05 Performance Trace. On this screen, select ALEREMOTE user and then select SQL trace to record the SQL statements. Identify the time-consuming sections from the results. If the data-selection times are high on a particular SQL statement, index the DataSource tables to increase the performance of selection (see no. 6 below). While using ST05, make sure that no other extraction job is running with ALEREMOTE user.
4)Balance loads by distributing processes onto different servers if possible. If your site uses more than one BW application server, distribute the extraction processes to different servers using transaction code SM59 Maintain RFC Destination. Load balancing is possible only if the extraction program allows the option
5)Set optimum parameters for data-packet size. Packet size affects the number of data requests to the database. Set the data-packet size to optimum values for an efficient data-extraction mechanism. To find the optimum value, start with a packet size in the range of 50,000 to 100,000 and gradually increase it. At some point, you will reach the threshold at which increasing packet size further does not provide any performance increase. To set the packet size, use transaction code SBIW BW IMG Menu on the source system. To set the data load parameters for flat-file uploads, use transaction code RSCUSTV6 in BW.
6)Build indexes on DataSource tables based on selection criteria. Indexing DataSource tables improves the extraction performance, because it reduces the read times of those tables.
7)Execute collection jobs in parallel. Like the Business Content extractors, generic extractors have a number of collection jobs to retrieve relevant data from DataSource tables. Scheduling these collection jobs to run in parallel reduces the total extraction time, and they can be scheduled via transaction code SM37 in the source system.
8). Break up your data selections for InfoPackages and schedule the portions to run in parallel. This parallel upload mechanism sends different portions of the data to BW at the same time, and as a result the total upload time is reduced. You can schedule InfoPackages in the Administrator Workbench.
You can upload data from a data target (InfoCube and ODS) to another data target within the BW system. While uploading, you can schedule more than one InfoPackage with different selection options in each one. For example, fiscal year or fiscal year period can be used as selection options. Avoid using parallel uploads for high volumes of data if hardware resources are constrained. Each InfoPacket uses one background process (if scheduled to run in the background) or dialog process (if scheduled to run online) of the application server, and too many processes could overwhelm a slow server.
9). Building secondary indexes on the tables for the selection fields optimizes these tables for reading, reducing extraction time. If your selection fields are not key fields on the table, primary indexes are not much of a help when accessing data. In this case it is better to create secondary indexes with selection fields on the associated table using ABAP Dictionary to improve better selection performance.
10)Analyze upload times to the PSA and identify long-running uploads. When you extract the data using PSA method, data is written into PSA tables in the BW system. If your data is on the order of tens of millions, consider partitioning these PSA tables for better performance, but pay attention to the partition sizes. Partitioning PSA tables improves data-load performance because it's faster to insert data into smaller database tables. Partitioning also provides increased performance for maintenance of PSA tables for example, you can delete a portion of data faster. You can set the size of each partition in the PSA parameters screen, in transaction code SPRO or RSCUSTV6, so that BW creates a new partition automatically when a threshold value is reached.
11)Debug any routines in the transfer and update rules and eliminate single selects from the routines. Using single selects in custom ABAP routines for selecting data from database tables reduces performance considerably. It is better to use buffers and array operations. When you use buffers or array operations, the system reads data from the database tables and stores it in the memory for manipulation, improving performance. If you do not use buffers or array operations, the whole reading process is performed on the database with many table accesses, and performance deteriorates. Also, extensive use of library transformations in the ABAP code reduces performance; since these transformations are not compiled in advance, they are carried out during run-time.
12)Before uploading a high volume of transaction data into InfoCubes, activate the number-range buffer for dimension IDs. The number-range buffer is a parameter that identifies the number of sequential dimension IDs stored in the memory. If you increase the number range before high-volume data upload, you reduce the number of reads from the dimension tables and hence increase the upload performance. Do not forget to set the number-range values back to their original values after the upload. Use transaction code SNRO to maintain the number range buffer values for InfoCubes.
13)Drop the indexes before uploading high-volume data into InfoCubes. Regenerate them after the upload. Indexes on InfoCubes are optimized for reading data from the InfoCubes. If the indexes exist during the upload, BW reads the indexes and tries to insert the records according to the indexes, resulting in poor upload performance. You can automate the dropping and regeneration of the indexes through InfoPackage scheduling. You can drop indexes in the Manage InfoCube screen in the Administrator Workbench.
14)IDoc (intermediate document) archiving improves the extraction and loading performance and can be applied on both BW and R/3 systems. In addition to IDoc archiving, data archiving is available for InfoCubes and ODS objects.
Hope it Helps
Chetan
@CP.. -
Query Performance issue in Oracle Forms
Hi All,
I am using oracle 9i DB and forms 6i.
In query form ,qry took long time to load the data into form.
There are two tables used here.
1 table(A) contains 5 crore records another table(B) has 2 crore records.
The recods fetching range 1-500 records.
Table (A) has no index on main columns,after created the index on main columns in table A ,the query is fetched the data quickly.
But DBA team dont want to create index on table A.Because of table space problem.
If create the index on main table (A) ,then performance overhead in production.
Concurrent user capacity is 1500.
Is there any alternative methods to handle this problem.
Regards,
RS1) What is a crore? Wikipedia seems to indicate that it's either 10,000,000 or 500,000
http://en.wikipedia.org/wiki/Crore
I'll assume that we're talking about tables with 50 million and 20 million rows, respectively.
2) Large tables with no indexes are definitely going to be slow. If you don't have the disk space to create an appropriate index, surely the right answer is to throw a bit of disk into the system.
3) I don't understand the comment "If create the index on main table (A) ,then performance overhead in production." That seems to contradict the comment you made earlier that the query performs well when you add the index. Are you talking about some other performance overhead?
Justin -
How to improve query performance built on a ODS
Hi,
I've built a report on FI_GL ODS (BW3.5). The report execution time takes almost 1hr.
Is there any method to improve or optimize th query performance that build on ODS.
The ODS got huge volume of data ~ 300 Million records for 2 years.
Thanx in advance,
Guru.Hi Raj,
Here are some few tips which helps you in improving ur query performance
Checklist for Query Performance
1. If exclusions exist, make sure they exist in the global filter area. Try to remove exclusions by subtracting out inclusions.
2. Use Constant Selection to ignore filters in order to move more filters to the global filter area. (Use ABAPer to test and validate that this ensures better code)
3. Within structures, make sure the filter order exists with the highest level filter first.
4. Check code for all exit variables used in a report.
5. Move Time restrictions to a global filter whenever possible.
6. Within structures, use user exit variables to calculate things like QTD, YTD. This should generate better code than using overlapping restrictions to achieve the same thing. (Use ABAPer to test and validate that this ensures better code).
7. When queries are written on multiproviders, restrict to InfoProvider in global filter whenever possible. MultiProvider (MultiCube) queries require additional database table joins to read data compared to those queries against standard InfoCubes (InfoProviders), and you should therefore hardcode the infoprovider in the global filter whenever possible to eliminate this problem.
8. Move all global calculated and restricted key figures to local as to analyze any filters that can be removed and moved to the global definition in a query. Then you can change the calculated key figure and go back to utilizing the global calculated key figure if desired
9. If Alternative UOM solution is used, turn off query cache.
10. Set read mode of query based on static or dynamic. Reading data during navigation minimizes the impact on the R/3 database and application server resources because only data that the user requires will be retrieved. For queries involving large hierarchies with many nodes, it would be wise to select Read data during navigation and when expanding the hierarchy option to avoid reading data for the hierarchy nodes that are not expanded. Reserve the Read all data mode for special queriesu2014for instance, when a majority of the users need a given query to slice and dice against all dimensions, or when the data is needed for data mining. This mode places heavy demand on database and memory resources and might impact other SAP BW processes and tasks.
11. Turn off formatting and results rows to minimize Frontend time whenever possible.
12. Check for nested hierarchies. Always a bad idea.
13. If "Display as hierarchy" is being used, look for other options to remove it to increase performance.
14. Use Constant Selection instead of SUMCT and SUMGT within formulas.
15. Do review of order of restrictions in formulas. Do as many restrictions as you can before
calculations. Try to avoid calculations before restrictions.
17. Turn off warning messages on queries.
18. Check to see if performance improves by removing text display (Use ABAPer to test and validate that this ensures better code).
19. Check to see where currency conversions are happening if they are used.
20. Check aggregation and exception aggregation on calculated key figures. Before aggregation is generally slower and should not be used unless explicitly needed.
21. Avoid Cell Editor use if at all possible.
22. Make sure queries are regenerated in production using RSRT after changes to statistics, consistency changes, or aggregates.
23. Within the free characteristics, filter on the least granular objects first and make sure those come first in the order. -
Query performance in two environments
Hi all,
I have developed simple select queries on a multiprovider and I am facing issues with query performance in quality box. A query runs pretty fast in in dev and return results while the same one dumps in Quality environment giving a time out error. This sounds more strange because our dev box has comparitively more records than the quality environment right now.
On anlyzing the query path in both environments, we noticed that the query does an index scan in dev but not in Quality environment, especially when the selection is such that the query is supposed to return lot of records. Since the query does a sequential scan in quality, it dumps. Is there any setting that I need to make seprately in the quality environment.
Any tips on query optimization would be great help. Thanks
Regards
NiranjanaExecute some of the RSRT tests in the QA for the query using "Execute+Debug" option and use some test for Multiprovider and Databases checks in it ,try to compare with Dev as well.
Hope it Helps
Chetan
@CP.. -
Weblogic 8.1.6 and Oracle 9.2.0.8 - query performance
Folks,
We are upgrading WebLogic from 8.1.5 to 8.1.6 and Oracle from 9.2.0.6 to 9.2.0.8. We use the Oracle thin client driver for 9.2.0.8 to connect from the application to Oracle.
When we use the following combination of the stack we see SQL query performance degradation: -
Oracle 9.2.0.8 database, Oracle 9.2.0.8 driver, WL 8.1.6
Oracle 9.2.0.8 database, Oracle 9.2.0.1 driver, WL 8.1.6
We do not see the degradation in case of the following: -
Oracle 9.2.0.8 database, Oracle 9.2.0.1 driver, WL 8.1.5
Oracle 9.2.0.6 database, Oracle 9.2.0.1 driver, WL 8.1.5
This shows that the problem could be with the WL 8.1.6 version and I was wondering if any of you have faced this before? The query retrieves a set of data from Oracle none of which contain the AsciiStream data type, which is noted as a problem in WL 8.1.6, but that too, only for WL JDBC drivers.
Any ideas appreciated.Folks,
We are upgrading WebLogic from 8.1.5 to 8.1.6 and Oracle from 9.2.0.6 to 9.2.0.8. We use the Oracle thin client driver for 9.2.0.8 to connect from the application to Oracle.
When we use the following combination of the stack we see SQL query performance degradation: -
Oracle 9.2.0.8 database, Oracle 9.2.0.8 driver, WL 8.1.6
Oracle 9.2.0.8 database, Oracle 9.2.0.1 driver, WL 8.1.6
We do not see the degradation in case of the following: -
Oracle 9.2.0.8 database, Oracle 9.2.0.1 driver, WL 8.1.5
Oracle 9.2.0.6 database, Oracle 9.2.0.1 driver, WL 8.1.5
This shows that the problem could be with the WL 8.1.6 version and I was wondering if any of you have faced this before? The query retrieves a set of data from Oracle none of which contain the AsciiStream data type, which is noted as a problem in WL 8.1.6, but that too, only for WL JDBC drivers.
Any ideas appreciated.
Maybe you are looking for
-
Cd or dvd for downloading photos?
We would like to download the photos from our recent trip and are not sure if we should put them on a cd or dvd? Which is appropriate? Thanks
-
Question regarding cursor variables, while using table functions
Hi, I created a procedure and when i'm try'g to call it. now i'm getting this error. CREATE OR REPLACE TYPE TAB_EMP_REC IS OBJECT( EMP_ID NUMBER(9), EMP_NAME VARCHAR2(30)); CREATE OR REPLACE TYPE T_EMP_TMP IS TABLE OF TAB_EMP_REC ; CREATE OR REPLACE
-
Sending email with calendar attachment
Hi folks I know that is is possible to send emails from ABAP with attachments, but is it possible to have a calendar file (eg. .cal or .vcs) as attachment? Thanks in Advance Anton Kruse
-
Alternate color to the rows with sorting
I have a table which has alternate color to the rows.one row in white and other in blue.when sorting is used, the blue-highlighted lines on the table are randomely re-located. They should not be impacted by the sorting.But they are getting effected.I
-
Left arrow key -- probably a stupid question.
In some applications my left arrow key doesn't work. I've noticed it most in Word for mac, but I know it has happened elsewere, too. And in safari the left arrow key tabs often functions like tab. I'm new to Mac (and just getting used to fn + delete