How to tune this
HI all
This is my query when i run this query its take to much of time to complete and it takes CPU load if 96%
This is my query
SELECT order_number, cust_po_number, line_id, order_line_upi,
order_item_number
FROM (SELECT oh.order_number order_number,
oh.cust_po_number cust_po_number,
ol.line_id line_id, ol.attribute2 order_line_upi,
ol.attribute20 order_item_number
FROM hz_org_contacts hzoc,
hz_relationships hzr,
hz_cust_account_roles hzcr,
oe_order_headers_all oh,
oe_order_lines_all ol,
mtl_system_items_b msi
--,hr_operating_units hou
hr_all_organization_units hou
WHERE hzoc.attribute1 = p_client_cust_ref
AND hzoc.party_relationship_id = hzr.relationship_id
AND hzr.relationship_code = 'CONTACT_OF'
AND hzr.subject_type = 'PERSON'
AND hzr.party_id = hzcr.party_id
AND hzcr.cust_account_role_id = oh.sold_to_contact_id
AND oh.header_id = ol.header_id
AND oh.sold_to_org_id = hzcr.cust_account_id
AND msi.segment1 LIKE '%' || p_product || '%'
AND msi.inventory_item_id = ol.inventory_item_id
AND msi.organization_id = ol.ship_from_org_id
AND ol.attribute2 is not null
AND oh.org_id = ol.org_id
AND hou.organization_id = oh.org_id
AND hou.NAME = g_operating_unit
ORDER BY oh.creation_date DESC);
Thanks & Regards
Srikkanth.M
You need to give us more information.
Please read this thread to discover what else you should post:
HOW TO: Post a SQL statement tuning request - template posting
Similar Messages
-
How to tune this query for the improve performance ?
Hi All,
How to tune this query for the improve performance ?
select a.claim_number,a.pay_cd,a.claim_occurrence_number,
case
when sum(case
when a.payment_status_cd ='0'
then a.payment_est_amt
else 0
end
)=0
then 0
else (sum(case
when a.payment_status_cd='0'and a.payment_est_amt > 0
then a.payment_est_amt
else 0
end)
- sum(case
when a.payment_status_cd<>'0'
then a.payment_amt
else 0
end))
end as estimate
from ins_claim_payment a
where a.as_of_date between '31-jan-03' and '30-aug-06'
and ( a.data_source = '25' or (a.data_source between '27' and '29'))
and substr(a.pay_cd,1,1) IN ('2','3','4','8','9')
group by a.claim_number, a.pay_cd, a.claim_occurrence_number
Thank you,
MckaMcka
As well as EXPLAIN PLAN, let us know what proportion of rows are visited by this query. It may be that it is not using a full table scan when it should (or vice versa).
And of course we'd need to know what indexes are available, and how selective they are for the predicated you have in this query ...
Regards Nigel -
What this SQL did is to generate a report like how many rows for each tp_stts when ims_toms_msge_type='TOMS NEW' (or 'TOMS CNCLO'). also, its corresponding total number for each ims_toms_msge_type.
Here is the sample:
Rownum H1 TP_STTS COUNT IMS_TOMS_MSGE_TYPE H FILTERTYPE
1 Trades Block Key Data Error 594 TOMS NEW A MSL
2 Allocation Data Error 334 TOMS NEW A MSL
3 Manual Processing Required 29 TOMS NEW A MSL
4 Manual Removal No Processing Required 67 TOMS NEW A MSL
5 Waiting For Authorization 2 TOMS NEW A MSL
6 Auto NAK 19764 TOMS NEW B SLS
7 Validated 165023 TOMS NEW B SLS
8 GRAND TOTAL 185813 TOMS NEW H MSL
9 Cancel Auto NAK 37 TOMS CNCLO X MSL
10 Manual Processing Required 114 TOMS CNCLO X MSL
11 Manually Processed 278 TOMS CNCLO X MSL
12 CANCEL GRAND TOTAL 429 TOMS CNCLO Z MSLSQL statement as below:
SELECT ROWNUM, MSGS.* FROM (with FTMReport as (
select tp_stts, ims_toms_msge_type, count(*) count from ims_trde, ims_toms_msge
where ( IMS_TRDE.PRCSG_GRP_ID = 5 ) AND ( IMS_TRDE.IMS_TRDE_RCPT_DTTM >= TO_DATE('12/01/2009 00:00', 'MM/DD/YYYY HH24:MI') AND IMS_TRDE.IMS_TRDE_RCPT_DTTM <= (TO_DATE('12/28/2009 23:59', 'MM/DD/YYYY HH24:MI')) ) AND (IMS_TRDE.GRS_TRX_TYPE NOT IN ('INJECTION','WITHDRAWAL','PAYMENT') OR IMS_TRDE.GRS_TRX_TYPE IS NULL) AND (IMS_TRDE.SSC_INVST_TYPE != 'FC' OR IMS_TRDE.SSC_INVST_TYPE IS NULL) AND (IMS_TRDE.SERVICE_TYPE='FS' OR IMS_TRDE.SERVICE_TYPE='CO') AND 1=1
and IMS_TRDE.SERVICE_TYPE='FS' and 1=1 and ims_trde.ims_trde_oid = ims_toms_msge.ims_trde_oid
group by tp_stts, ims_toms_msge_type
select 'GRAND TOTAL' H1, null tp_stts, sum(Count) count , ims_toms_msge_type ,'H', 'MSL' FilterType
from FTMReport where ims_toms_msge_type in ('TOMS NEW') group by ims_toms_msge_type
union
select 'CANCEL GRAND TOTAL' H1, null tp_stts, sum(Count) count, ims_toms_msge_type ,'Z', 'MSL' FilterType
from FTMReport where ims_toms_msge_type in ('TOMS CNCLO') group by ims_toms_msge_type
union
select DECODE(rownum, 1, 'Trades') H1, tp_stts, count, ims_toms_msge_type , 'A' , 'MSL' FilterType
from FTMReport where ims_toms_msge_type in ('TOMS NEW') and tp_stts not in ('Validated','Auto NAK','Manual NAK')
union
select ' ' H1, tp_stts, count, ims_toms_msge_type , 'B' , 'SLS' FilterType
from FTMReport where ims_toms_msge_type in ('TOMS NEW') and tp_stts in ('Validated','Auto NAK','Manual NAK')
union
select DECODE(rownum, 1, 'Cancel') H1, tp_stts, count, ims_toms_msge_type , 'X' , 'MSL' FilterType
from FTMReport where ims_toms_msge_type in ('TOMS CNCLO') order by 5,6
) MSGS;Explain plan as below:
| Id | Operation | Name | Rows | Bytes | Cost |
| 0 | SELECT STATEMENT | | 193 | 12738 | 32 |
| 1 | COUNT | | | | |
| 2 | VIEW | | 193 | 12738 | 32 |
| 4 | TEMP TABLE TRANSFORMATION | | | | |
| 3 | RECURSIVE EXECUTION | SYS_LE_4_0 | | | |
| 0 | INSERT STATEMENT | | 61 | 4575 | 9264 |
| 1 | LOAD AS SELECT | | | | |
| 2 | SORT GROUP BY | | 61 | 4575 | 9264 |
| 3 | NESTED LOOPS | | 1604 | 117K| 9251 |
|* 4 | TABLE ACCESS BY INDEX ROWID| IMS_TRDE | 1603 | 80150 | 6045 |
|* 5 | INDEX RANGE SCAN | IMS_TRDE_INDX4 | 539K| | 3917 |
|* 6 | INDEX RANGE SCAN | IMS_TOMS_MSGE_INDX1 | 1 | 25 | 2 |
| 5 | SORT UNIQUE | | 193 | 8831 | 30 |
| 6 | UNION-ALL | | | | |
| 7 | SORT GROUP BY NOSORT | | 5 | 115 | 6 |
|* 8 | VIEW | | 61 | 1403 | 2 |
| 9 | TABLE ACCESS FULL | SYS_TEMP_0FD9D660F_B198D56F | 61 | 2074 | 2 |
| 10 | SORT GROUP BY NOSORT | | 5 | 115 | 6 |
|* 11 | VIEW | | 61 | 1403 | 2 |
| 12 | TABLE ACCESS FULL | SYS_TEMP_0FD9D660F_B198D56F | 61 | 2074 | 2 |
| 13 | COUNT | | | | |
|* 14 | VIEW | | 61 | 2867 | 2 |
| 15 | TABLE ACCESS FULL | SYS_TEMP_0FD9D660F_B198D56F | 61 | 2074 | 2 |
|* 16 | VIEW | | 61 | 2867 | 2 |
| 17 | TABLE ACCESS FULL | SYS_TEMP_0FD9D660F_B198D56F | 61 | 2074 | 2 |
| 18 | COUNT | | | | |
|* 19 | VIEW | | 61 | 2867 | 2 |
| 20 | TABLE ACCESS FULL | SYS_TEMP_0FD9D660F_B198D56F | 61 | 2074 | 2 |
Predicate Information (identified by operation id):
4 - filter(("IMS_TRDE"."GRS_TRX_TYPE"<>'INJECTION' AND "IMS_TRDE"."GRS_TRX_TYPE"<>'WITHDRAWAL'
AND "IMS_TRDE"."GRS_TRX_TYPE"<>'PAYMENT' OR "IMS_TRDE"."GRS_TRX_TYPE" IS NULL) AND
("IMS_TRDE"."SSC_INVST_TYPE"<>'FC' OR "IMS_TRDE"."SSC_INVST_TYPE" IS NULL))
5 - access("IMS_TRDE"."IMS_TRDE_RCPT_DTTM">=TO_DATE(' 2009-12-01 00:00:00', 'syyyy-mm-dd
hh24:mi:ss') AND "IMS_TRDE"."PRCSG_GRP_ID"=5 AND "IMS_TRDE"."SERVICE_TYPE"='FS' AND
"IMS_TRDE"."IMS_TRDE_RCPT_DTTM"<=TO_DATE(' 2009-12-28 23:59:00', 'syyyy-mm-dd hh24:mi:ss'))
filter("IMS_TRDE"."PRCSG_GRP_ID"=5 AND "IMS_TRDE"."SERVICE_TYPE"='FS')
6 - access("IMS_TRDE"."IMS_TRDE_OID"="IMS_TOMS_MSGE"."IMS_TRDE_OID")
8 - filter("FTMREPORT"."IMS_TOMS_MSGE_TYPE"='TOMS NEW')
11 - filter("FTMREPORT"."IMS_TOMS_MSGE_TYPE"='TOMS CNCLO')
14 - filter("FTMREPORT"."IMS_TOMS_MSGE_TYPE"='TOMS NEW' AND "FTMREPORT"."TP_STTS"<>'Validated'
AND "FTMREPORT"."TP_STTS"<>'Auto NAK' AND "FTMREPORT"."TP_STTS"<>'Manual NAK')
16 - filter("FTMREPORT"."IMS_TOMS_MSGE_TYPE"='TOMS NEW' AND ("FTMREPORT"."TP_STTS"='Auto NAK' OR
"FTMREPORT"."TP_STTS"='Manual NAK' OR "FTMREPORT"."TP_STTS"='Validated'))
19 - filter("FTMREPORT"."IMS_TOMS_MSGE_TYPE"='TOMS CNCLO')
Note: cpu costing is offCould you guys tell me what is wrong with this sql and how to tune it?
Is there any way to replace the UNION? Is using UNION a good idea?
Can I use DECODE or CASE WHEN to simplify it? How?
Also, could you help explain why there is SYS_LE_4_0, SYS_TEMP_0FD9D660F_B198D56F temporary segment? Is it caused by with FTMReport as ?
Thanks
Edited by: PhoenixBai on Dec 31, 2009 9:58 AM
Edited by: PhoenixBai on Dec 31, 2009 12:08 PM
Edited by: PhoenixBai on Dec 31, 2009 12:17 PMI consider using GROUP BY ROLLUP together with DECODE, CASE WHEN, but haven`t come out with a working sql yet:-(Some sample data to work with would have been much helpful. But we dont get that most of the time :(
I came up with this.
select case when ims_toms_msge_type = 'TOMS NEW' then
case when grouping(tp_stts) = 1 then 'GRAND TOTAL'
when tp_stts not in ('Validated','Auto NAK','Manual NAK') then 'Trades'
end
when ims_toms_msge_type = 'TOMS CNCLO' then
case when grouping(tp_stts) = 1 then 'CANCEL GRAND TOTAL'
when tp_stts in ('Validated','Auto NAK','Manual NAK') then 'Cancel'
end
end h1,
tp_stts,
count(*) count,
ims_toms_msge_type,
case when ims_toms_msge_type = 'TOMS NEW' then
case when grouping(tp_stts) = 1 then 'H'
when tp_stts not in ('Validated','Auto NAK','Manual NAK') then 'A'
end
when ims_toms_msge_type = 'TOMS CNCLO' then
case when grouping(tp_stts) = 1 then 'Z'
when tp_stts in ('Validated','Auto NAK','Manual NAK') then 'B'
end
end flag,
'MSL' FilterType
from ims_trde,
ims_toms_msge
where IMS_TRDE.PRCSG_GRP_ID = 5
AND IMS_TRDE.IMS_TRDE_RCPT_DTTM >= TO_DATE('12/01/2009 00:00', 'MM/DD/YYYY HH24:MI')
AND IMS_TRDE.IMS_TRDE_RCPT_DTTM <= TO_DATE('12/28/2009 23:59', 'MM/DD/YYYY HH24:MI')
AND (IMS_TRDE.GRS_TRX_TYPE NOT IN ('INJECTION','WITHDRAWAL','PAYMENT')
OR IMS_TRDE.GRS_TRX_TYPE IS NULL)
AND (IMS_TRDE.SSC_INVST_TYPE != 'FC'
OR IMS_TRDE.SSC_INVST_TYPE IS NULL)
AND (IMS_TRDE.SERVICE_TYPE = 'FS'
OR IMS_TRDE.SERVICE_TYPE = 'CO')
AND 1=1
and IMS_TRDE.SERVICE_TYPE = 'FS'
and 1=1
and ims_trde.ims_trde_oid = ims_toms_msge.ims_trde_oid
group by rollup(ims_toms_msge_type, tp_stts)Not sure if this code works. Because i dint have the table or the data to test it. So if it has some error just fix it and give it a try. Do post the kind of output it gives. So that we can see if we can work with this solution. -
How to tune this SQL (takes long time to come up with results)
Dear all,
I have sum SQL which takes long time ... can any one help me to tune this.... thank You
SELECT SUM (n_amount)
FROM (SELECT DECODE (v_payment_type,
'D', n_amount,
'C', -n_amount
) n_amount, v_vou_no
FROM vouch_det a, temp_global_temp b
WHERE a.v_vou_no = TO_CHAR (b.n_column2)
AND b.n_column1 = :b5
AND b.v_column1 IN (:b4, :b3)
AND v_desc IN (SELECT v_trans_source_code
FROM benefit_trans_source
WHERE v_income_tax_app = :b6)
AND v_lob_code = DECODE (:b1, :b2, v_lob_code, :b1)
UNION ALL
SELECT DECODE (v_payment_type,
'D', n_amount,
'C', -n_amount
* -1 AS n_amount,
v_vou_no
FROM vouch_details a, temp_global_temp b
WHERE a.v_vou_no = TO_CHAR (b.n_column2)
AND b.n_column1 = :b5
AND b.v_column1 IN (:b12, :b11, :b10, :b9, :b8, :b7)
AND v_desc IN (SELECT v_trans_source_code
FROM benefit_trans_source
WHERE income_tax_app = :b6)
AND v_lob_code = DECODE (:b1, :b2, v_lob_code, :b1));
Thank You.....Thanks a lot,
i did change the SQL it works fine but slows down my main query.... actually my main query is calling a function which does the sum......
here is the query.....?
select A.* from (SELECT a.n_agent_no, a.v_agent_code, a.n_channel_no, v_iden_no, a.n_cust_ref_no, a.v_agent_type, a.v_company_code,
a.v_company_branch, a.v_it_no, bfn_get_agent_name(a.n_agent_no) agentname,
PKG_AGE__TAX.GET_TAX_AMT(:P_FROM_DATE,:P_TO_DATE,:P_LOB_CODE,A.N_AGENT_NO) comm,
c.v_ird_region
FROM agent_master a, agent_lob b, agency_region c
WHERE a.n_agent_no = b.n_agent_no
AND a.v_agency_region = c.v_agency_region
AND :p_lob_code = DECODE(:p_lob_code,'ALL', 'ALL',b.v_line_of_business)
AND :p_channel_no = DECODE(:p_channel_no,1000, 1000,a.n_channel_no)
AND :p_agency_group = DECODE(:p_agency_group,'ALL', 'ALL',c.v_ird_region)
group by a.n_agent_no, a.v_agent_code, a.n_channel_no, v_iden_no, a.n_cust_ref_no, a.v_agent_type, a.v_company_code, a.v_company_branch, a.v_it_no, bfn_get_agent_name(a.n_agent_no) ,
BPG_AGENCY_GEN_ACL_TAX.BFN_GET_TAX_AMOUNT(:P_FROM_DATE,:P_TO_DATE,:P_LOB_CODE,A.N_AGENT_NO),
c.v_ird_region
ORDER BY c.v_ird_region, a.v_agent_code DESC)
A
WHERE (COMM < :P_VAL_IND OR COMM >=:P_VAL_IND1);
Any idea to make this faster....
Thank You... -
Hi,
Im trying to select the latest set of data from a table using a simple query for inserting into a new table.
Details are given below.
There are no indices for the table. Its taking around 18 sec.
Pls advice on how to proceed so that I can bring down this time.
Query:
SELECT
FROM
M_UNDR M
WHERE
M.M_DATE = (SELECT MAX(M_DATE) FROM M_UNDR M1)
AND
M.M_TIME =
SELECT MAX(M_TIME) FROM M_UNDR M2 WHERE M2.M_DATE = M.M_DATE
AND
M.U_TYPE NOT IN ('USD', 'GBP', 'EUR');
SQL> select count(1) from m_undr;
COUNT(1)
2695446
SQL>
Version:
SQL> select banner from v$version;
BANNER
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bi
PL/SQL Release 10.2.0.3.0 - Production
CORE 10.2.0.3.0 Production
TNS for Solaris: Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 - Production
Explain plan
PLAN_TABLE_OUTPUT
| Id | Operation | Name | Rows | Bytes | Cost |
| 0 | SELECT STATEMENT | | 1 | 95 | 19060 |
| 1 | HASH JOIN | | 1 | 95 | 12882 |
| 2 | VIEW | VW_SQ_1 | 508 | 11176 | 6608 |
| 3 | HASH GROUP BY | | 508 | 10668 | 6608 |
| 4 | TABLE ACCESS FULL| M_UNDR | 2392K| 47M| 6186 |
| 5 | TABLE ACCESS FULL | M_UNDR | 5594 | 398K| 6274 |
| 6 | SORT AGGREGATE | | 1 | 8 | |
| 7 | TABLE ACCESS FULL| M_UNDR | 2392K| 18M| 6178 |
SQL> sho parameter optimizer
NAME TYPE VALUE
optimizer_dynamic_sampling integer 2
optimizer_features_enable string 10.2.0.3
optimizer_index_caching integer 0
optimizer_index_cost_adj integer 200
optimizer_mode string ALL_ROWS
optimizer_secure_view_merging boolean TRUE
SQL> sho parameter DB_FILE_MULTI
NAME TYPE VALUE
db_file_multiblock_read_count integer 16
SQL> show parameter db_block_size
NAME TYPE VALUE
db_block_size integer 8192
SQL> show parameter cursor_sharing
NAME TYPE VALUE
cursor_sharing string EXACT
Trace:
SQL> set autotrace traceonly arraysize 100
SQL> SELECT
2 *
3 FROM
4 M_UNDR M
5 WHERE
6 M.M_DATE = (SELECT MAX(M_DATE) FROM M_UNDR M1)
7 AND
8 M.M_TIME =
9 (
10 SELECT MAX(M_TIME) FROM M_UNDR M2 WHERE M2.M_DATE = M.M_DATE
11 )
12 AND
13 M.U_TYPE NOT IN ('USD', 'GBP', 'EUR');
239 rows selected.
Execution Plan
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=19060 Card=1 Bytes
=95)
1 0 HASH JOIN (Cost=12882 Card=1 Bytes=95)
2 1 VIEW OF 'VW_SQ_1' (VIEW) (Cost=6608 Card=508 Bytes=11176
3 2 HASH (GROUP BY) (Cost=6608 Card=508 Bytes=10668)
4 3 TABLE ACCESS (FULL) OF 'M_UNDR' (TABLE) (Cos
t=6186 Card=2392724 Bytes=50247204)
5 1 TABLE ACCESS (FULL) OF 'M_UNDR' (TABLE) (Cost=62
74 Card=5594 Bytes=408362)
6 5 SORT (AGGREGATE)
7 6 TABLE ACCESS (FULL) OF 'M_UNDR' (TABLE) (Cos
t=6178 Card=2392724 Bytes=19141792)
Statistics
1 recursive calls
0 db block gets
91479 consistent gets
4830 physical reads
0 redo size
15457 bytes sent via SQL*Net to client
359 bytes received via SQL*Net from client
4 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
239 rows processed
SQL> disconnect
SQL> select * from table(dbms_xplan.display_cursor(null, null, 'ALLSTATS LAST'));
PLAN_TABLE_OUTPUT
SQL_ID 0br4mzjgj63dw, child number 0
SELECT /*+ gather_plan_statistics */ * FROM M_UNDR M WHERE M.M_DATE = (SELECT MAX(M_DATE) FROM
M_UNDR M1) AND M.M_TIME = ( SELECT MAX(M_TIME) FROM M_UNDR M2 WHERE M2.M_DATE = M.M_DATE )
AND M.U_TYPE NOT IN ('USD', 'GBP', 'EUR')
Plan hash value: 1220141218
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | OMem | 1Mem | Used-Mem |
|* 1 | HASH JOIN | | 1 | 1 | 239 |00:00:06.94 | 91479 | 1114K| 1114K| 1209K (0)|
| 2 | VIEW | VW_SQ_1 | 1 | 508 | 607 |00:00:04.06 | 30492 | | | |
| 3 | HASH GROUP BY | | 1 | 508 | 607 |00:00:04.06 | 30492 | | | |
| 4 | TABLE ACCESS FULL| M_UNDR | 1 | 2392K| 2695K|00:00:00.01 | 30492 | | | |
|* 5 | TABLE ACCESS FULL | M_UNDR | 1 | 5594 | 5497 |00:00:02.81 | 60987 | | | |
| 6 | SORT AGGREGATE | | 1 | 1 | 1 |00:00:01.20 | 30492 | | | |
| 7 | TABLE ACCESS FULL| M_UNDR | 1 | 2392K| 2695K|00:00:00.01 | 30492 | | | |
Predicate Information (identified by operation id):
1 - access("M"."M_TIME"="VW_COL_1" AND "M_DATE"="M"."M_DATE")
5 - filter(("M"."U_TYPE"<>'USD' AND "M"."U_TYPE"<>'GBP' AND "M"."U_TYPE"<>'EUR' AND "M"."M_DATE"=))
26 rows selected.I have tried using rank as below. Didnt find any improvement.
select * from
SELECT
m.*,
rank() over (order by m_date desc, m_time desc) rnk
FROM
M_UNDR M
WHERE
M.U_TYPE NOT IN ('USD', 'GBP', 'EUR')
where rnk = 1Thanks in advanceHi,
creating index on m_date and m_time did have gr8 impact on the plan.
Query is completing in 2 sec now.
Id | Operation | Name | Rows | Bytes | Cost |
0 | SELECT STATEMENT | | 1 | 73 | 6234 |
1 | TABLE ACCESS BY INDEX ROWID | M_UNDR | 2 | 146 | 51 |
2 | INDEX RANGE SCAN | IND_M_UNDR | 2 | | 49 |
3 | SORT AGGREGATE | | 1 | 13 | |
4 | FIRST ROW | | 5683 | 73879 | 6 |
5 | INDEX RANGE SCAN (MIN/MAX)| IND_M_UNDR | 5683 | 73879 | 6 |
6 | SORT AGGREGATE | | 1 | 8 | |
7 | INDEX FULL SCAN (MIN/MAX) | IND_M_UNDR | 2392K| 18M| |
------------------------------------------------------------------------------------Thanks for the help. Will check if there is any serious impact on insert. -
The report show display the unique units price for the same cust # and material
Example:
Sales Doc # Item # Cust # SBU SPL Material Unit price
100 10 1763 10 10200 CX00-23343 1.0
101 10 1763 10 10200 CX00-23343 1.0
102 10 1763 10 10200 CX00-23343 1.5
We need to show below in the report for the above example:
Sales Doc # Item # Cust # SBU SPL Material Unit price
100 10 1763 10 10200 CX00-23343 1.0
101 10 1763 10 10200 CX00-23343 1.5
Please give your much needed inputs
Thanks
VishalHi Arun,
This is how it is.. and in this case we need to ignore the row with sales doc 102. We need to display the unique units price for the same cust # and material#.
so if have
Doc # Item # Cust # SBU SPL Material Unit price
101 10 1763 10 10200 CX00-23343 1.0
102 10 1763 10 10200 CX00-23343 1.5
We need to display only
Doc # Item # Cust # SBU SPL Material Unit price
101 10 1763 10 10200 CX00-23343 1.0
Thanks
Vishal -
How to tune this update statement?
Hello,
I have to solve the following task:
Update every row in table A which has an appropriate row in table B and log what you have done in a log-table.
It is possible that there are more than one fitting rows in table A for a row in table B.
My first approach is looping over the table B and doing an update of table A for every entry in table B.
This works and looks like this:
Table A:
PK number (This is the primary key of this table)
KEY number
Table B:
KEY_OLD number
KEY_NEW number
Log table:
PK number
KEY_OLD number
KEY_NEW number
declare
TYPE PK_TAB_TYPE IS TABLE OF number INDEX BY BINARY_INTEGER;
v_tab_PK PK_TAB_TYPE;
v_empty_tab_PK PK_TAB_TYPE;
begin
for v_rec in (select * from table_B) loop
v_tab_PK := v_empty_tab_PK; /* clearing the array */
update table_A
set KEY = v_rec.KEY_NEW
where (KEY = v_rec.KEY_OLD)
returning PK bulk collect into v_tab_PK;
if (v_tab_PK.count > 0) then
for i in v_tab_PK.first..v_tab_PK.last loop
insert into TMP_TAB_LOG(PK, KEY_OLD, KEY_NEW)
values (v_tab_PK(i), v_rec.KEY_OLD, v_rec.KEY_NEW);
end loop;
end if;
end loop;
end;Because the table B can have up to 500.000 entries (and the table A has even more entries) this solution will cause many update-statements.
So I am looking for a solution which has better performance.
My second approach was using an correlated update and looks like this:
declare
TYPE PK_TAB_TYPE IS TABLE OF number INDEX BY BINARY_INTEGER;
v_tab_PK PK_TAB_TYPE;
v_empty_tab_PK PK_TAB_TYPE;
v_tab_NewKey PK_TAB_TYPE;
begin
v_tab_PK := v_empty_tab_PK; /* clear the arrays */
v_tab_NewKey := v_empty_tab_PK;
update table_A a
set KEY = (select KEY_NEW from table_B where (KEY_OLD = a.KEY))
where exists (select 'x' as OK
from table_B
where (KEY_OLD = a.KEY)
returning PK, KEY bulk collect into v_tab_PK, v_tab_NewKey;
if (v_tab_PK.count > 0) then
for i in v_tab_PK.first..v_tab_PK.last loop
insert into TMP_TAB_LOG_DUB(PK, KEY_OLD, KEY_NEW)
values (v_tab_PK(i), null, v_tab_NewKey(i));
end loop;
end if;
end;Now I have only one update statement.
The only thing missing in this second approach is the old KEY before the update in the log table.
But I have no idea how to get the old value.
Is there a possibility to modify this second approach to get the old value of the KEY before the update to write it in the log-table?
And now I need your help:
What is the best way to get a performant solution for my task?
Every help appreciated.
Regards HartmutBelow is a script you can run in another testing schema to do the update with logging..... I have created the tables (A and B) with primary key constraints defined...
create table table_a(pk number primary key
, key number);
create table table_b(key_old number primary key
, key_new number);
create table TMP_TAB_LOG_DUB(pk number primary key
, key_old number
, key_new number);
---------insert test data
insert into table_a values(1,2);
insert into table_a values(2,2);
insert into table_a values(3,2);
insert into table_a values(11,1);
insert into table_a values(12,1);
insert into table_a values(13,1);
insert into table_a values(21,4);
insert into table_a values(22,4);
insert into table_a values(23,4);
commit;
insert into table_b values(1,3);
insert into table_b values(4,2);
commit;
----- insert to log
insert into TMP_TAB_LOG_DUB(PK, KEY_OLD, KEY_NEW)
select a.pk
, a.key as key_old
, b.key_new as key_new
from table_a a
join table_b b on a.key = b.key_old;
----- update table_a
update(select a.pk
, a.key as key_old
, b.key_new as key_new
from table_a a
join table_b b on a.key = b.key_old)
set key_old = key_new;
commit; -
Hi all,
Can anyone suggests me how to speed up the following query? What index should I create?
The Query
SELECT *
FROM SCHEDULE_EMP
WHERE EMP_NO = :b2
AND :b1 BETWEEN START_DATE AND END_DATE
Table Structure
EMP_NO NOT NULL VARCHAR2(10)
START_DATE NOT NULL DATE
END_DATE DATE
SAT NUMBER(2)
SUN NUMBER(2)
MON NUMBER(2)
TUE NUMBER(2)
WED NUMBER(2)
THU NUMBER(2)
FRI NUMBER(2)
Thanks in advance.Hello
It really helps with this kind of task if you can post the execution plan, and also list what existing indexes you have on the table, volumes of data etc.
In this case though, with the limited information I would suggest creating an index on emp_no and start_date. Is there a reason why end_date doesn't have a not null constraint? If nulls are valid in end_date, I would have thought you could need to modify the where clause to take that into account. Unfortunately I don't have a database to test on at the mo but I would think you would need to do something like:
SELECT
FROM
SCHEDULE_EMP
WHERE
EMP_NO = :b2
AND
start_date <= :b1
AND
end_date >= :b1
AND
end_date IS NOT NULL
...or this one if you want to consider nulls in end_date.....
SELECT
FROM
SCHEDULE_EMP
WHERE
EMP_NO = :b2
AND
start_date <= :b1
AND
end_date >= :b1
AND
end_date IS NOT NULL
OR
start_date <= :b1
AND
end_date IS NULL
)If you only want to consider rows with a value in end_date, including it in the index may well prove to be a good move but you would need to try it out.
HTH
David -
How to tune this SQL Query?
Hi all expert out there,
I am using Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production With the Partitioning, Real Application Clusters, OLAP, Data Mining and Real Application Testing options.
I have this ERP 11i query took 3-4hours to execute. can anyone help to have a look at the Query so make it more faster? I am already out of my idea of solving this. Kindly helpzzz...
SELECT
/*+ first_rows(1)*/
hou.name "OU" ,-- e.g. Seagate Technology USOP1 ,
mc.description,
oel.ordered_item "Product Part Number",
oeh.order_number "Order Num",
hp.party_name "Bill To Cust Name",
hcsu.location "Ship To Cust Num",
oel.line_number || '.' || oel.shipment_number "Order Line Num",
ft.nls_territory "Ship To Country",
mc.segment7 "designapplication",
ccm.formattedcapacity||'GB' "Capacity",
oel.attribute1 "Order Category",
oel.Subinventory "Subinventory",
to_char(oel.actual_shipment_date,'MM/DD/YYYY DY') "Shipment Date",
NVL(oel.shipped_quantity,0) "Net Units"
FROM
oe_order_headers_all oeh
,oe_order_lines_all oel
,apps.hz_parties hp
,apps.hz_cust_accounts hca
,apps.hz_cust_site_uses_all hcsu
,apps.hz_cust_acct_sites_all hcas
, apps.seaeng_ccfamilymodelinfo ccm
,apps.hz_party_sites hps
,apps.fnd_territories ft
,apps.hz_locations hl
,apps.hr_organization_units hou
,apps.mtl_parameters mp
,apps.mtl_item_categories mic
,apps.mtl_categories_b mc
,apps.fnd_lookup_values flv
WHERE
oeh.header_id = oel.header_id
AND oel.flow_status_code = 'CLOSED'
AND oeh.invoice_to_org_id = hcsu.site_use_id
AND hl.country = ft.territory_code
AND hps.location_id = hl.location_id
AND hcas.party_site_id = hps.party_site_id
AND hcsu.cust_acct_site_id = hcas.cust_acct_site_id
AND hcas.cust_account_id = hca.cust_account_id
AND hca.party_id = hp.party_id
AND oeh.org_id = hou.organization_id
AND oel.ship_from_org_id = mp.organization_id
AND oel.inventory_item_id = mic.inventory_item_id
AND mic.category_id = mc.category_id
AND mic.category_set_id = 4
AND mc.description = ccm.stmodelnumber
AND flv.lookup_code = hca.sales_channel_code
AND flv.lookup_type = 'SALES_CHANNEL'
AND mc.segment7 IN ('PSG','ESG','NSG')
AND flv.lookup_code NOT IN ('RTL','AD-RTL','EU')
AND oel.attribute1 IN ('NB','NBEOL','NBSEA')
AND oel.subinventory IN ('KFGI','AFGI','SFGIF','FGIF')
AND hou.organization_id = 189
AND trunc(oel.actual_shipment_date) between TO_DATE('01-Jan-2009','DD-MON-YYYY') and TO_DATE('31-JAN-2009','DD-MON-YYYY')
regards,
Lygine
Edited by: user8989062 on Jun 7, 2010 6:39 PM5) The TKPROF output for this statement looks like the following:
SELECT
/*+ first_rows(1)*/
hou.name "OU" ,-- e.g. Seagate Technology USOP1 ,
mc.description,
oel.ordered_item "Product Part Number",
oeh.order_number "Order Num",
hp.party_name "Bill To Cust Name",
hcsu.location "Ship To Cust Num",
oel.line_number || '.' || oel.shipment_number "Order Line Num",
ft.nls_territory "Ship To Country",
mc.segment7 "designapplication",
ccm.formattedcapacity||'GB' "Capacity",
oel.attribute1 "Order Category",
oel.Subinventory "Subinventory",
to_char(oel.actual_shipment_date,'MM/DD/YYYY DY') "Shipment Date",
NVL(oel.shipped_quantity,0) "Net Units"
FROM
oe_order_headers_all oeh
,oe_order_lines_all oel
,apps.hz_parties hp
,apps.hz_cust_accounts hca
,apps.hz_cust_site_uses_all hcsu
,apps.hz_cust_acct_sites_all hcas
, apps.seaeng_ccfamilymodelinfo ccm
,apps.hz_party_sites hps
,apps.fnd_territories ft
,apps.hz_locations hl
,apps.hr_organization_units hou
,apps.mtl_parameters mp
,apps.mtl_item_categories mic
,apps.mtl_categories_b mc
,apps.fnd_lookup_values flv
WHERE
oeh.header_id = oel.header_id
AND oel.flow_status_code = 'CLOSED'
AND oeh.invoice_to_org_id = hcsu.site_use_id
AND hl.country = ft.territory_code
AND hps.location_id = hl.location_id
AND hcas.party_site_id = hps.party_site_id
AND hcsu.cust_acct_site_id = hcas.cust_acct_site_id
AND hcas.cust_account_id = hca.cust_account_id
AND hca.party_id = hp.party_id
AND oeh.org_id = hou.organization_id
AND oel.ship_from_org_id = mp.organization_id
AND oel.inventory_item_id = mic.inventory_item_id
AND mic.category_id = mc.category_id
AND mic.category_set_id = 4
AND mc.description = ccm.stmodelnumber
AND flv.lookup_code = hca.sales_channel_code
AND flv.lookup_type = 'SALES_CHANNEL'
AND mc.segment7 IN ('PSG','ESG','NSG')
AND flv.lookup_code NOT IN ('RTL','AD-RTL','EU')
AND oel.attribute1 IN ('NB','NBEOL','NBSEA')
AND oel.subinventory IN ('KFGI','AFGI','SFGIF','FGIF')
AND hou.organization_id = 189
AND trunc(oel.actual_shipment_date) between TO_DATE('01-Jan-2009','DD-MON-YYYY') and TO_DATE('31-JAN-2009','DD-MON-YYYY')
call count cpu elapsed disk query current rows
Parse 1 0.79 0.79 0 0 0 0
Execute 1 0.00 0.00 0 0 0 0
Fetch 7 22.23 240.85 19781 536082 0 592
total 9 23.02 241.64 19781 536082 0 592
Misses in library cache during parse: 1
Optimizer mode: FIRST_ROWS
Parsing user id: 173
Rows Row Source Operation
592 NESTED LOOPS (cr=536082 pr=19781 pw=0 time=240822989 us)
592 NESTED LOOPS (cr=534885 pr=19776 pw=0 time=239960969 us)
592 NESTED LOOPS (cr=533688 pr=19776 pw=0 time=239902332 us)
594 NESTED LOOPS (cr=532493 pr=19776 pw=0 time=239811721 us)
594 NESTED LOOPS (cr=531892 pr=19776 pw=0 time=239794703 us)
594 NESTED LOOPS (cr=530693 pr=19772 pw=0 time=239325284 us)
594 NESTED LOOPS (cr=529498 pr=19770 pw=0 time=239152940 us)
594 NESTED LOOPS (cr=527709 pr=19766 pw=0 time=236850676 us)
594 NESTED LOOPS (cr=525920 pr=19764 pw=0 time=235640068 us)
2990 NESTED LOOPS (cr=516943 pr=19688 pw=0 time=195144282 us)
2990 NESTED LOOPS (cr=516936 pr=19688 pw=0 time=195120297 us)
2990 NESTED LOOPS (cr=510806 pr=19682 pw=0 time=194678671 us)
3000 HASH JOIN (cr=504799 pr=19669 pw=0 time=193829763 us)
3000 NESTED LOOPS (cr=472280 pr=360 pw=0 time=49218087 us)
1 NESTED LOOPS (cr=1029 pr=34 pw=0 time=1745829 us)
1 TABLE ACCESS BY INDEX ROWID HR_ALL_ORGANIZATION_UNITS_TL (cr=424 pr=25 pw=0 time=1361442 us)
1 INDEX UNIQUE SCAN HR_ALL_ORGANIZATION_UNTS_TL_PK (cr=423 pr=25 pw=0 time=1361397 us)(object id 44637)
1 TABLE ACCESS BY INDEX ROWID HR_ALL_ORGANIZATION_UNITS (cr=605 pr=9 pw=0 time=384370 us)
1 INDEX UNIQUE SCAN HR_ORGANIZATION_UNITS_PK (cr=1 pr=0 pw=0 time=27 us)(object id 43498)
3000 TABLE ACCESS BY INDEX ROWID OE_ORDER_LINES_ALL (cr=471251 pr=326 pw=0 time=47466249 us)
156922 INDEX RANGE SCAN OE_ORDER_LINES_N20 (cr=420 pr=7 pw=0 time=787919 us)(object id 37005064)
263469 TABLE ACCESS FULL MTL_ITEM_CATEGORIES (cr=32519 pr=19309 pw=0 time=144242743 us)
2990 TABLE ACCESS BY INDEX ROWID MTL_CATEGORIES_B (cr=6007 pr=13 pw=0 time=843569 us)
3000 INDEX UNIQUE SCAN MTL_CATEGORIES_B_U1 (cr=3007 pr=2 pw=0 time=162636 us)(object id 37199)
2990 TABLE ACCESS BY INDEX ROWID SEAENG_CCFAMILYMODELINFO (cr=6130 pr=6 pw=0 time=437784 us)
2990 INDEX UNIQUE SCAN SEAENG_CCFAMILYMODELINFO_U1 (cr=2997 pr=0 pw=0 time=52872 us)(object id 35838918)
2990 INDEX UNIQUE SCAN MTL_PARAMETERS_U1 (cr=7 pr=0 pw=0 time=16332 us)(object id 37657)
594 TABLE ACCESS BY INDEX ROWID OE_ORDER_HEADERS_ALL (cr=8977 pr=76 pw=0 time=40491633 us)
2990 INDEX UNIQUE SCAN OE_ORDER_HEADERS_U1 (cr=5987 pr=45 pw=0 time=2504442 us)(object id 41952)
594 TABLE ACCESS BY INDEX ROWID HZ_CUST_SITE_USES_ALL (cr=1789 pr=2 pw=0 time=1208576 us)
594 INDEX UNIQUE SCAN HZ_CUST_SITE_USES_U1 (cr=1195 pr=1 pw=0 time=105934 us)(object id 25124976)
594 TABLE ACCESS BY INDEX ROWID HZ_CUST_ACCT_SITES_ALL (cr=1789 pr=4 pw=0 time=2300224 us)
594 INDEX UNIQUE SCAN HZ_CUST_ACCT_SITES_U1 (cr=1195 pr=2 pw=0 time=152238 us)(object id 25124996)
594 TABLE ACCESS BY INDEX ROWID HZ_PARTY_SITES (cr=1195 pr=2 pw=0 time=170875 us)
594 INDEX UNIQUE SCAN HZ_PARTY_SITES_U1 (cr=601 pr=1 pw=0 time=104550 us)(object id 25124993)
594 TABLE ACCESS BY INDEX ROWID HZ_LOCATIONS (cr=1199 pr=4 pw=0 time=467329 us)
594 INDEX UNIQUE SCAN HZ_LOCATIONS_U1 (cr=601 pr=0 pw=0 time=57749 us)(object id 25124992)
594 TABLE ACCESS BY INDEX ROWID FND_TERRITORIES (cr=601 pr=0 pw=0 time=15562 us)
594 INDEX UNIQUE SCAN FND_TERRITORIES_U1 (cr=7 pr=0 pw=0 time=6492 us)(object id 33083)
592 TABLE ACCESS BY INDEX ROWID HZ_CUST_ACCOUNTS (cr=1195 pr=0 pw=0 time=88925 us)
594 INDEX UNIQUE SCAN HZ_CUST_ACCOUNTS_U1 (cr=601 pr=0 pw=0 time=27607 us)(object id 81600)
592 INDEX RANGE SCAN FND_LOOKUP_VALUES_U1 (cr=1197 pr=0 pw=0 time=56714 us)(object id 32878)
592 TABLE ACCESS BY INDEX ROWID HZ_PARTIES (cr=1197 pr=5 pw=0 time=860140 us)
592 INDEX UNIQUE SCAN HZ_PARTIES_U1 (cr=599 pr=0 pw=0 time=51136 us)(object id 25126074)
Elapsed times include waiting on following events:
Event waited on Times Max. Wait Total Waited
---------------------------------------- Waited ---------- ------------
SQL*Net message to client 7 0.00 0.00
row cache lock 1 0.00 0.00
gc current block 2-way 24112 0.00 19.28
gc cr grant 2-way 406 0.00 0.19
db file sequential read 441 0.09 14.11
gc cr block 2-way 284 0.00 0.23
gc cr block busy 147 0.19 9.59
gc current block congested 2 0.00 0.00
gc cr multi block request 13079 0.00 3.98
SQL*Net message from client 7 0.27 1.87
gc cr failure 39 0.00 0.02
cr request retry 39 0.98 38.27
SQL*Net more data to client 12 0.00 0.00
db file scattered read 2446 0.13 132.58
gc cr disk read 5 0.00 0.00
********************************************************************************6) The DBMS_XPLAN.DISPLAY_CURSOR output:
SQL> select * from table(dbms_xplan.display_cursor(null, null, 'ALLSTATS LAST'));
PLAN_TABLE_OUTPUT
SQL_ID b8pfhfxscqn1m, child number 0
SELECT /*+ gather_plan_statistics */ hou.name "OU" ,-- e.g. Seagate Technology USOP1 , mc.descript
oeh.order_number "Order Num", hp.party_name "Bill To Cust Name", hcsu.location "Ship To Cust Num",
Num", ft.nls_territory "Ship To Country", mc.segment7 "designapplication", ccm.formattedcapacity
oel.Subinventory "Subinventory", to_char(oel.actual_shipment_date,'MM/DD/YYYY DY') "Shipment Date",
oe_order_headers_all oeh ,oe_order_lines_all oel ,apps.hz_parties hp ,apps.hz_cust
,apps.hz_cust_acct_sites_all hcas , apps.seaeng_ccfamilymodelinfo ccm ,apps.hz_party_sites hps
,apps.hr_organization_units hou ,apps.mtl_paramete
Plan hash value: 414863479
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Reads | O
| 1 | NESTED LOOPS | | 1 | 1 | 592 |00:02:25.13 | 535K| 57267 | |
| 2 | NESTED LOOPS | | 1 | 1 | 592 |00:02:24.22 | 533K| 57185 |
| 3 | NESTED LOOPS | | 1 | 1 | 592 |00:02:24.15 | 532K| 57183 |
| 4 | NESTED LOOPS | | 1 | 1 | 594 |00:02:24.00 | 531K| 57171 |
| 5 | NESTED LOOPS | | 1 | 1 | 594 |00:02:23.98 | 530K| 57170 |
| 6 | NESTED LOOPS | | 1 | 1 | 594 |00:02:23.49 | 529K| 57129 |
| 7 | NESTED LOOPS | | 1 | 1 | 594 |00:02:23.08 | 528K| 57096 |
| 8 | NESTED LOOPS | | 1 | 1 | 594 |00:02:22.51 | 526K| 57031 | |
| 9 | NESTED LOOPS | | 1 | 1 | 594 |00:02:21.79 | 524K| 56968 | |
| 10 | NESTED LOOPS | | 1 | 1 | 2990 |00:02:09.65 | 515K| 55703 |
| 11 | NESTED LOOPS | | 1 | 1 | 2990 |00:02:09.62 | 515K| 55703 |
| 12 | NESTED LOOPS | | 1 | 1 | 2990 |00:02:08.47 | 509K| 55599 |
|* 13 | HASH JOIN | | 1 | 2 | 3000 |00:02:07.88 | 503K| 55516 | 974K
| 14 | NESTED LOOPS | | 1 | 2 | 3000 |00:01:39.07 | 471K| 23025 |
| 15 | NESTED LOOPS | | 1 | 1 | 1 |00:00:00.01 | 4 | 0 |
| 16 | TABLE ACCESS BY INDEX ROWID| HR_ALL_ORGANIZATION_UNITS_TL | 1 | 1 | 1 |00:00
|* 17 | INDEX UNIQUE SCAN | HR_ALL_ORGANIZATION_UNTS_TL_PK | 1 | 1 | 1 |00:00:00.0
|* 18 | TABLE ACCESS BY INDEX ROWID| HR_ALL_ORGANIZATION_UNITS | 1 | 1 | 1 |00:00:
|* 19 | INDEX UNIQUE SCAN | HR_ORGANIZATION_UNITS_PK | 1 | 1 | 1 |00:00:00.01
|* 20 | TABLE ACCESS BY INDEX ROWID | OE_ORDER_LINES_ALL | 1 | 2 | 3000 |00:01
|* 21 | INDEX RANGE SCAN | OE_ORDER_LINES_N20 | 1 | 47575 | 156K|00:00:01.76 | 420
|* 22 | TABLE ACCESS FULL | MTL_ITEM_CATEGORIES | 1 | 96977 | 263K|00:00:28.49
|* 23 | TABLE ACCESS BY INDEX ROWID | MTL_CATEGORIES_B | 3000 | 1 | 2990 |00:00:0
|* 24 | INDEX UNIQUE SCAN | MTL_CATEGORIES_B_U1 | 3000 | 1 | 3000 |00:00:00.21
| 25 | TABLE ACCESS BY INDEX ROWID | SEAENG_CCFAMILYMODELINFO | 2990 | 1 | 2990 |
|* 26 | INDEX UNIQUE SCAN | SEAENG_CCFAMILYMODELINFO_U1 | 2990 | 1 | 2990 |00:00:
|* 27 | INDEX UNIQUE SCAN | MTL_PARAMETERS_U1 | 2990 | 1 | 2990 |00:00:00.02 |
|* 28 | TABLE ACCESS BY INDEX ROWID | OE_ORDER_HEADERS_ALL | 2990 | 1 | 594 |00:00:
|* 29 | INDEX UNIQUE SCAN | OE_ORDER_HEADERS_U1 | 2990 | 1 | 2990 |00:00:04.29 |
| 30 | TABLE ACCESS BY INDEX ROWID | HZ_CUST_SITE_USES_ALL | 594 | 1 | 594 |00:00:
|* 31 | INDEX UNIQUE SCAN | HZ_CUST_SITE_USES_U1 | 594 | 1 | 594 |00:00:00.31 |
| 32 | TABLE ACCESS BY INDEX ROWID | HZ_CUST_ACCT_SITES_ALL | 594 | 1 | 594 |00:00:
|* 33 | INDEX UNIQUE SCAN | HZ_CUST_ACCT_SITES_U1 | 594 | 1 | 594 |00:00:00.23 |
| 34 | TABLE ACCESS BY INDEX ROWID | HZ_PARTY_SITES | 594 | 1 | 594 |00:00:0
|* 35 | INDEX UNIQUE SCAN | HZ_PARTY_SITES_U1 | 594 | 1 | 594 |00:00:00.17 | 601
| 36 | TABLE ACCESS BY INDEX ROWID | HZ_LOCATIONS | 594 | 1 | 594 |00:00:00.4
|* 37 | INDEX UNIQUE SCAN | HZ_LOCATIONS_U1 | 594 | 1 | 594 |00:00:00.17 |
| 38 | TABLE ACCESS BY INDEX ROWID | FND_TERRITORIES | 594 | 1 | 594 |00:00:00
|* 39 | INDEX UNIQUE SCAN | FND_TERRITORIES_U1 | 594 | 1 | 594 |00:00:00.02
|* 40 | TABLE ACCESS BY INDEX ROWID | HZ_CUST_ACCOUNTS | 594 | 1 | 592 |00:00:0
|* 41 | INDEX UNIQUE SCAN | HZ_CUST_ACCOUNTS_U1 | 594 | 1 | 594 |00:00:00.04 |
|* 42 | INDEX RANGE SCAN | FND_LOOKUP_VALUES_U1 | 592 | 1 | 592 |00:00:00.06 |
| 43 | TABLE ACCESS BY INDEX ROWID | HZ_PARTIES | 592 | 1 | 592 |00:00:00.91 |
|* 44 | INDEX UNIQUE SCAN | HZ_PARTIES_U1 | 592 | 1 | 592 |00:00:00.40 | 599
Predicate Information (identified by operation id):
13 - access("OEL"."INVENTORY_ITEM_ID"="MIC"."INVENTORY_ITEM_ID")
17 - access("HAOTL"."ORGANIZATION_ID"=189 AND "HAOTL"."LANGUAGE"=USERENV('LANG'))
filter(DECODE("HR_SECURITY"."VIEW_ALL"(),'Y','TRUE',"HR_SECURITY"."SHOW_RECORD"('HR_ALL_ORGAN
18 - filter("HAO"."BUSINESS_GROUP_ID"=DECODE("HR_GENERAL"."GET_XBG_PROFILE"(),'Y',"HAO"."BUSINESS_
19 - access("HAO"."ORGANIZATION_ID"=189)
20 - filter(("OEL"."FLOW_STATUS_CODE"='CLOSED' AND INTERNAL_FUNCTION("OEL"."ATTRIBUTE1") AND INTER
21 - access("OEL"."SYS_NC00342$">=TO_DATE(' 2009-01-01 00:00:00', 'syyyy-mm-dd hh24:mi:ss') AND "O
'syyyy-mm-dd hh24:mi:ss'))
22 - filter("MIC"."CATEGORY_SET_ID"=4)
23 - filter(("MC"."DESCRIPTION" IS NOT NULL AND INTERNAL_FUNCTION("MC"."SEGMENT7")))
24 - access("MIC"."CATEGORY_ID"="MC"."CATEGORY_ID")
26 - access("MC"."DESCRIPTION"="CCM"."STMODELNUMBER")
27 - access("OEL"."SHIP_FROM_ORG_ID"="MP"."ORGANIZATION_ID")
28 - filter("OEH"."ORG_ID"=189)
29 - access("OEH"."HEADER_ID"="OEL"."HEADER_ID")
31 - access("OEH"."INVOICE_TO_ORG_ID"="HCSU"."SITE_USE_ID")
33 - access("HCSU"."CUST_ACCT_SITE_ID"="HCAS"."CUST_ACCT_SITE_ID")
35 - access("HCAS"."PARTY_SITE_ID"="HPS"."PARTY_SITE_ID")
37 - access("HPS"."LOCATION_ID"="HL"."LOCATION_ID")
39 - access("HL"."COUNTRY"="FT"."TERRITORY_CODE")
40 - filter(("HCA"."SALES_CHANNEL_CODE"<>'RTL' AND "HCA"."SALES_CHANNEL_CODE"<>'AD-RTL' AND "HCA".
41 - access("HCAS"."CUST_ACCOUNT_ID"="HCA"."CUST_ACCOUNT_ID")
42 - access("FLV"."LOOKUP_TYPE"='SALES_CHANNEL' AND "FLV"."LOOKUP_CODE"="HCA"."SALES_CHANNEL_CODE"
filter(("FLV"."LOOKUP_CODE"<>'RTL' AND "FLV"."LOOKUP_CODE"<>'AD-RTL' AND "FLV"."LOOKUP_CODE"<
44 - access("HCA"."PARTY_ID"="HP"."PARTY_ID")
90 rows selected.
{code} &nbs -
How to tune this smiple SQL (takes long time to come up with results)
the following SQL is very slow as it takes one day to complete...
select A.* from (SELECT a.n_agent_no, a.v_agent_code, a.n_channel_no, v_iden_no, a.n_cust_ref_no, a.v_agent_type, a.v_company_code,
a.v_company_branch, a.v_it_no, bfn_get_agent_name(a.n_agent_no) agentname,
PKG_AGE__TAX.GET_TAX_AMT(:P_FROM_DATE,:P_TO_DATE,:P_LOB_CODE,A.N_AGENT_NO) comm,
c.v_ird_region
FROM agent_master a, agent_lob b, agency_region c
WHERE a.n_agent_no = b.n_agent_no
AND a.v_agency_region = c.v_agency_region
--AND :p_lob_code = DECODE(:p_lob_code,'ALL', 'ALL',b.v_line_of_business)
--AND :p_channel_no = DECODE(:p_channel_no,1000, 1000,a.n_channel_no)
--AND :p_agency_group = DECODE(:p_agency_group,'ALL', 'ALL',c.v_ird_region)
group by a.n_agent_no, a.v_agent_code, a.n_channel_no, v_iden_no, a.n_cust_ref_no, a.v_agent_type, a.v_company_code, a.v_company_branch, a.v_it_no, bfn_get_agent_name(a.n_agent_no) ,
BPG_AGENCY_GEN_ACL_TAX.BFN_GET_TAX_AMOUNT(:P_FROM_DATE,:P_TO_DATE,:P_LOB_CODE,A.N_AGENT_NO),
c.v_ird_region
ORDER BY c.v_ird_region, a.v_agent_code DESC)
A
WHERE (COMM < :P_VAL_IND OR COMM >=:P_VAL_IND1);
. .it should return all the agents with commission based on the date parameter... data is less then 50 K inside all
the tables...
the version is Oracle9i Enterprise Edition Release 9.2.0.5.0
SQL> explain plan for
2 select A.* from (SELECT a.n_agent_no, a.v_agent_code, a.n_channel_no, v_iden_no, a.n_cust_ref_
no, a.v_agent_type, a.v_company_code,
3 a.v_company_branch, a.v_it_no, bfn_get_agent_name(a.n_agent_no) agentname,
4 BPG_AGENCY_GEN_ACL_TAX.BFN_GET_TAX_AMOUNT(:P_FROM_DATE,:P_TO_DATE,:P_LOB_CODE,A.N_AGENT_NO) com
m,
5 c.v_ird_region
6 FROM ammm_agent_master a, ammt_agent_lob b, gnlu_agency_region c
7 WHERE a.n_agent_no = b.n_agent_no
8 AND a.v_agency_region = c.v_agency_region
9 --AND :p_lob_code = DECODE(:p_lob_code,'ALL', 'ALL',b.v_line_of_business)
10 --AND :p_channel_no = DECODE(:p_channel_no,1000, 1000,a.n_channel_no)
11 --AND :p_agency_group = DECODE(:p_agency_group,'ALL', 'ALL',c.v_ird_region)
12 group by a.n_agent_no, a.v_agent_code, a.n_channel_no, v_iden_no, a.n_cust_ref_no, a.v_agent_ty
pe, a.v_company_code, a.v_company_branch, a.v_it_no, bfn_get_agent_name(a.n_agent_no) ,
13 BPG_AGENCY_GEN_ACL_TAX.BFN_GET_TAX_AMOUNT(:P_FROM_DATE,:P_TO_DATE,:P_LOB_CODE,A.N_AGENT_NO),
14 c.v_ird_region
15 ORDER BY c.v_ird_region, a.v_agent_code DESC)
16 A
17 WHERE (COMM < :P_VAL_IND OR COMM >=:P_VAL_IND1);
Explained.
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)|
| 0 | SELECT STATEMENT | | 13315 | 27M| | 859 (63)|
| 1 | VIEW | | 13315 | 27M| | |
| 2 | SORT GROUP BY | | 13315 | 936K| 2104K| 859 (63)|
| 3 | HASH JOIN | | 13315 | 936K| | 641 (81)|
| 4 | MERGE JOIN | | 3118 | 204K| | 512 (86)|
| 5 | TABLE ACCESS BY INDEX ROWID| AGENCY_REGION | 8 | 152 | | 3 (34)|
| 6 | INDEX FULL SCAN | SYS_C004994 | 8 | | | 2 (50)|
| 7 | SORT JOIN | | 3142 | 147K| | 510 (86)|
| 8 | TABLE ACCESS FULL | AGENT_MASTER | 3142 | 147K| | 506 (86)|
| 9 | TABLE ACCESS FULL | AGENT_LOB | 127K| 623K| | 102 (50)|
Note: PLAN_TABLE' is old version
17 rows selected.
..This is the only information i can get as i cannot access over database server (user security limitation)...
Thank YouTry to remove this:
ORDER BY c.v_ird_region, a.v_agent_code DESCOr move it to the end of entire query.
Edited by: Random on Jun 19, 2009 1:01 PM -
Some Basic steps How to tune this Query
Hi All
This is my cursor Query to fetch the Eligible orders its taking too much of time to execute, This is my query
SELECT oeol.header_id,oeol.attribute1,oeoh.order_number,COUNT(1) consignment_count
FROM oe_order_lines_all oeol,oe_order_headers_all oeoh,oe_transaction_types_all oett
WHERE oeol.header_id = oeoh.header_id
AND oeol.flow_status_code IN(DECODE(oett.name,xxhdnl_om_common_util_pkg.g_push_line_type,
DECODE(oeol.shipment_priority_code,'EXPRESS',DECODE(oeol.flow_status_code,'AWAITING_STOCK'
,'AWAITING_STOCK','STOCK_RECEIVED','STOCK_RECEIVED'),'STOCK_RECEIVED')
,DECODE(XXHDNL_OM_QUI_BAT_PLAN_EXT_PKG.check_push_or_pull(oeol.line_id),'PUSH','BOOKED')))
AND(oeol.shipment_priority_code=p_shipment_priority OR p_shipment_priority IS NULL)
AND oeol.line_type_id =oett.transaction_type_id AND oett.name IN
(xxhdnl_om_common_util_pkg.g_return_line_type
,xxhdnl_om_common_util_pkg.g_push_line_type )
AND oeoh.attribute3 IS NULL
GROUP BY
oeol.header_id
,oeol.attribute1
,oeoh.order_number;
Pls provide some basic steps for tuning regarding some performance.
thanks & regards
Srikkanth.MHi
as I tried to say is that DECODE is just hard to read, but not a performance issue.
What do you do in the XXHDNL_OM_QUI_BAT_PLAN_EXT_PKG.check_push_or_pull(oeol.line_id) procedure?
But let me try the DECODE... not 100% correct as I can't test but you'll get the picture:
SELECT
FROM
WHERE oeol.flow_status_code IN
CASE WHEN oett.name = xxhdnl_om_common_util_pkg.g_push_line_type THEN
CASE WHEN oeol.shipment_priority_code = 'EXPRESS' THEN
CASE WHEN oeol.flow_status_code ='AWAITING_STOCK' THEN 'AWAITING_STOCK'
WHEN oeol.flow_status_code ='STOCK_RECEIVED' THEN 'STOCK_RECEIVED'
ELSE null END
ELSE
CASE WHEN XXHDNL_OM_QUI_BAT_PLAN_EXT_PKG.check_push_or_pull(oeol.line_id) = 'PUSH' THEN 'BOOKED'
ELSE NULL END
ELSE
NULL
ENDThat is a 1:1 "translation" PLEASE add comments in nested statements.
And this is easier to read, as in CASE you can use AND / OR / IN ....
SELECT
FROM
WHERE oeol.flow_status_code IN
CASE WHEN oett.name = xxhdnl_om_common_util_pkg.g_push_line_type THEN
CASE WHEN oeol.shipment_priority_code = 'EXPRESS' AND oeol.flow_status_code IN ('AWAITING_STOCK','STOCK_RECEIVED')
THEN oeol.flow_status_code ELSE NULL END
ELSE
CASE WHEN XXHDNL_OM_QUI_BAT_PLAN_EXT_PKG.check_push_or_pull(oeol.line_id) = 'PUSH' THEN 'BOOKED'
ELSE NULL END
ENDThe "oeol.flow_status_code IN" makes no sense as the output of/DECODE/CASE is always 1 value right? And I would use the logic on a select on table "oe_order_lines_all" and then use the calculated field as a JOIN criteria. Much easier to test and read.
But, please check the procedure which you call that can be deadly! The "case" is just "nice to have"
-- andy -
Hi.how to tune this query?
select *
from exp_final
where
to_number(to_char(process_date,'mm'))=to_number(to_char(sysdate,'mm'))-1Both Sven's and theoa's suggestions are fundamentally different from the query OP referred to originally.
It maybe that the original query is completely wrong (that would be my instinct too).
Original query:
select *
from exp_final
where
to_number(to_char(process_date,'mm'))=to_number(to_char(sysdate,'mm'))-1 implies that you want everything from exp_final where the process_date was in the same month as the current month -1, regardless of year. For example, run today this will bring back everything done in a December, whether it was December 1972, December 1815 or December 2010.
Whereas their suggestions rely on your query being wrong and what you really want to get is everything from last month - i.e. run today, fetch everything from December 2010.
Which is the correct requirement? -
Hi,
I have a complex join . How to tune this?
CREATE OR REPLACE FORCE VIEW MHUBADMIN.LOAN_PIPELINE_VIEW
(LOAN_ID, USER_ID, FIRST_NAME, LAST_NAME, BORROWER_NAME,
SSN, USERNAME, SELLERLOANNUMBER, LOANNUMBER, LOANAMOUNT,
STATUS_DESC, LOAN_TYPE, LOCK_EXPIRE_DATE, ORG_NAME, ORG_PARENT_ID,
ORG_CHILD_ID, NO_CASCADE_FLAG, PRODUCT_NAME, INT_RATE, UPDATE_DATE,
UPDATE_DATE_STR, CURRENT_DATE, LOWER_FIRST_NAME, LOWER_LAST_NAME, LOWER_SSN,
LOWER_STATUS_DESC, STATUS_ID, AMORTIZATION_TYPE, STREET1, LOCK_EXTEN_EXPIR_DATE,
RELOCK_EXPIR_DATE, LOCK_RELOCK_COUNT, UNDERWRITE_FLAG, RECENT_EXPIR_DATE,STATUS_DATE)
AS
SELECT
LOAN.loan_id,
LOAN.user_id,
PERSON.first_name,
PERSON.last_name,
PERSON.last_name||', '||PERSON.first_name AS Borrower_Name,
PERSON.ssn,
HUBUSER.username,
LOAN.sellerloannumber,
LOAN.loannumber,
LOAN.loanamount,
STATUS.status_desc,
LOAN.loan_type,
PRICE.lock_expire_date,
ORGANIZATION.org_name,
BUSINESS_RELATIONSHIP.org_parent_id,
BUSINESS_RELATIONSHIP.org_child_id,
BUSINESS_RELATIONSHIP.no_cascade_flag,
product_name,
PRICE.final_rate,
LOAN.update_date,
TO_CHAR (LOAN.update_date,
'MM/DD/YYYY HH:MI:SS AM') update_date_str,
sysdate,
LOWER (PERSON.first_name),
LOWER (PERSON.last_name),
LOWER (PERSON.ssn),
LOWER (STATUS.status_desc),
STATUS.status_id,
LOAN.amortization_type,
ADDRESS.STREET1,
PRICE.LOCK_EXTEN_EXPIR_DATE,
PRICE.RELOCK_EXPIR_DATE,
LOAN.LOCK_RELOCK_COUNT,
LOAN.UNDERWRITE_FLAG,
LOAN_HISTORY.STATUS_DATE
decode (status.STATUS_ID,
22, PRICE.LOCK_EXTEN_EXPIR_DATE,
23, PRICE.lock_expire_date,
13, PRICE.lock_expire_date,
24, PRICE.RELOCK_EXPIR_DATE,
PRICE.lock_expire_date) RECENT_EXPIR_DATE
FROM
LOAN,
HUBUSER,
ORGANIZATION,
BUSINESS_RELATIONSHIP,
BORROWER,
PERSON,
STATUS,
PRICE,
product,
PROPERTY,
ADDRESS,
LOAN_HISTORY
WHERE
ORGANIZATION.org_id = BUSINESS_RELATIONSHIP.org_child_id AND
LOAN.org_id = BUSINESS_RELATIONSHIP.org_child_id AND
LOAN.loan_id = BORROWER.loan_id AND
LOAN.registration_loan_status_id = STATUS.status_id AND
LOAN.price_id = PRICE.price_id AND
BORROWER.primaryborrower = 'T' AND
PERSON.person_id = BORROWER.person_id AND
LOAN.product_id = product.product_id AND
LOAN.PROPERTY_ID = PROPERTY.PROPERTY_ID AND
PROPERTY.ADDRESS_ID = ADDRESS.ADDRESS_ID AND
LOAN.user_id = HUBUSER.user_id (+);
regards
MathewI'm afraid no-one can give you exact advice without more info. Here are some general guidelines though:
- check that you have all necessary filter and join predicates in place
- check that you have indexes on at least all the join predicates
- check that the join order is sane (goal: keeping the intermediate result sets small) -
Java applet - how to do this?
I am translating a Midlet project to JApplet project. Microedition, UDPDatagramConnection, not available and lots more. How can tune this for JavaSE?
// code..........
package sip;
import javax.swing.JApplet;
import javax.microedition.io.*;
//import javax.microedition.midlet.*;
//import javax.microedition.lcdui.*;
import java.io.*;
import net.*;
import iax.audio.*;
//import iax.audio.gsm.*;
//import rtp.*;
public class InviteMIDlet extends JApplet implements CommandListener, SIPProviderListener {
// Vaiables to assign
private Display display;
public Form form;
private TextField To;
private Command sendCmd;
private Command exitCmd;
private Command hangupCmd;
public int sdpPort = 0;
private UDPDatagramConnection rtpCon = null;
private boolean incall = false;
// Sip Digest parameters
private String UserName = "";
private String passwd = "123";
private String SipServerIP = "212.";
private int SipServerPort = 5060;
// Sip parameters
private SIPProvider provider;
private String MediaIP = null;
private int MediaPort = 0;
// Thread assign
private UDPSend udpSend;
private UDPReceive udpReceive;
private AudioCapture audioCapture;
private AudioPlayer audioPlayer;
// End of Thread assign
// Main midlet parameters
public InviteMIDlet() {
form = new Form("SIP Dialer");
try {
display = Display.getDisplay(this);
To = new TextField("To:", "0012127773456", 40, TextField.LAYOUT_LEFT);
form.append(To);
sendCmd = new Command("Call", Command.ITEM, 1);
form.addCommand(sendCmd);
hangupCmd = new Command("Hangup", Command.ITEM, 2);
form.addCommand(hangupCmd);
exitCmd = new Command("Exit", Command.EXIT, 3);
form.addCommand(exitCmd);
form.setCommandListener(this);
rtpCon = (*UDPDatagramConnection*) Connector.open("datagram://:");
sdpPort = rtpCon.getLocalPort();
provider = new SIPProvider(UserName,passwd,SipServerIP, SipServerPort, 1225);
provider.start();
provider.addSIPProviderListener(this);
} catch (Exception ex1) {
ex1.printStackTrace();
}shamuntoha wrote:
UDPDatagramConnection is available under MIDP/Midlet. But after migration to j2se, it shows microedition does not exist. What is that mean?.. None of the J2ME (or JME - I forget what they're calling it this instant) classes are available in J2SE ((J)Applets, (J)Frames etc.).
Usually there is a J2SE equivalent. The JavaDocs for J2SE are available for download, or for web browsing at [http://java.sun.com/javase/6/docs/api/index.html]. I say usually since I can find no letter for letter equivalent of UDPDatagramConnection in the J2SE. There are a variety of classes that mention Datagram. Perhaps if you start there, you will figure how to do what J2ME does.
..i want to switch the same code, concept, in to j2se.
rtpCon = (UDPDatagramConnection) Connector.open("datagram://:");
sdpPort = rtpCon.getLocalPort();BTW - the advice to use code tags still stands. Most people will not so much as glance at code that is not formatted. After all, which is easier to read, this..
rtpCon = (UDPDatagramConnection) Connector.open("datagram://:");
sdpPort = rtpCon.getLocalPort();
..or this?
rtpCon = (UDPDatagramConnection) Connector.open("datagram://:");
sdpPort = rtpCon.getLocalPort(); -
How to tune a query which contains "Bulk Collect Into" clause
I want to tune the below query:
SELECT customer_master_num,
product_nam
BULK COLLECT INTO t_cont09_rec
FROM TB_CMA009_SUPRA_RE_AGNT_CONT
WHERE re_agent_customer_master_num = p_63cust_master_num
AND customer_master_num = p_63board_master_num
AND cancellation_dt IS NULL
AND NVL (is_training_key_flg, 'N') = 'N';
This contains "Bulk Collect Into" clause.
TYPE cont09cur IS RECORD (
customer_master_num TB_CMA009_SUPRA_RE_AGNT_CONT.customer_master_num%TYPE,
product_nam TB_CMA009_SUPRA_RE_AGNT_CONT.product_nam%TYPE);
t_cont09_rec cont09_rec;
"t_cont09_rec" This is of Record Type
Please help me out how to tune this one.[url http://forums.oracle.com/forums/thread.jspa?threadID=501834&tstart=0]When your query takes too long ...
Also, don't get too distracted by the PL/SQL bulk collect into construction. If it takes time, then you have more than 99% chance that the time is spent in the SQL.
Regards,
Rob.
Maybe you are looking for
-
Using a serial Wacom tablet on a Mac Pro
I have a good Wacom tablet with serial port interface that I would like to connect to a Mac Pro. Is there some way to do this? Is there any sort of serial to usb adapter or would that not work with a Mac Pro? Thanks for any advice.
-
I used to be able to access my Army Email with my CAC card. Recently I lost that ability. Are there any known issues regarding this with your recent updates? Would that reset button be the solution? I haven't tried it because I don't know what I woul
-
MOTU Ultralite Not Recognized in New MBP
Greetings! I have a new MBP, with an original Motu Ultralite. I loaded the latest MOTU drivers for OS 10.6. I can't get the MBP to see the device anywhere. I tried a reinstall, and still nothing. Never had a problem before on previous system... I hav
-
Partial selection problem with different Look & Feel
Hi, Is there any [free] Look and Feel which supports the partial selection of checkbox. I have tried the same with LiquidLnF & SkinLnF these Look and Feel doesnot support partial selection (it shows full selection instead). please suggest something..
-
Slow MBP. Should I upgrade to a new computer?
Hi all, Situation: I have one of the very first macbook pros with 1.83ghz core duo, 80 gig hard drive and upgraded 2gb of ram. Lately, my workhorse of a mac has been slowing WAAAAAAAY down or freezing, specifically, while using keynote and numbers at