Rewrite this query
Hi all,
Can we rewrite this query as simplest.Becasue when i Execute this query it will take more time appro 3hrs.So can we rewrite this as possible.
SELECT scon.uabscon_number,
scon.uabscon_cust_code,
scon.uabscon_prem_code,
scon.uabscon_mf_status,
letd.usrletd_mf_next_visit_date,
evau.ucrevau_invn_code,
evau.ucrevau_prod_number
FROM uimsmgr.usrletd letd,
uimsmgr.ucrevau evau,
uimsmgr.uabscon scon
WHERE scon.uabscon_mf_status = :cMoveForwardPhase
AND scon.uabscon_status_ind IN ('A','R')
AND evau.ucrevau_scon_number = scon.uabscon_number
AND evau.ucrevau_event_type = :currentLetterTypeLevel /* FLT1,ALT1,FLT2, ... */
AND evau.ucrevau_value_1 = :letterTypeCode /* FV1,ASV1, ... */
AND evau.ucrevau_activity_date = (SELECT max(ee.ucrevau_activity_date)
FROM uimsmgr.ucrevau ee
WHERE ee.ucrevau_scon_number = scon.uabscon_number
AND (ee.ucrevau_event_type like 'FLT%'
OR ee.ucrevau_event_type like 'ALT%'))
AND letd.usrletd_actual_cust_code = scon.uabscon_cust_code
AND letd.usrletd_prem_code = scon.uabscon_prem_code
AND letd.usrletd_letr_code = :letterTypeCode /* FV1,ASV1, ... */
AND letd.usrletd_printed_date <= SYSDATE - :mfFirstDelayDays
AND letd.usrletd_printed_ind = 'Y'
AND TRUNC(letd.usrletd_activity_date) >= TRUNC(evau.ucrevau_activity_date)
AND EXISTS ( SELECT 1
FROM uimsmgr.utvsrvc srvc,
uimsmgr.ucrserv serv
WHERE serv.ucrserv_scon_number = scon.uabscon_number
AND serv.ucrserv_cust_code = scon.uabscon_cust_code
AND serv.ucrserv_prem_code = scon.uabscon_prem_code
AND TRUNC(serv.ucrserv_next_visit_date) <= TRUNC(SYSDATE) + :mfDueRange
AND serv.ucrserv_srvc_code = srvc.utvsrvc_code
AND srvc.utvsrvc_bus_sector_id = 1 /* only business sector 1*/
AND DECODE( NVL(serv.ucrserv_next_visit_type, 'A'),
'NOFV', 'A',
'FV' , 'F',
'FAS' , 'A',
'A' , 'A',
'Z' ) = :visitType
);
SELECT /*+ ordered */ scon.uabscon_number,
scon.uabscon_cust_code,
scon.uabscon_prem_code,
scon.uabscon_mf_status,
letd.usrletd_mf_next_visit_date,
evau.ucrevau_invn_code,
evau.ucrevau_prod_number
FROM uimsmgr.usrletd letd,
uimsmgr.ucrevau evau,
uimsmgr.uabscon scon
WHERE letd.usrletd_printed_date <= SYSDATE - :mfFirstDelayDays and scon.uabscon_mf_status = :cMoveForwardPhase
AND scon.uabscon_status_ind IN ('A','R')
AND evau.ucrevau_scon_number = scon.uabscon_number
AND evau.ucrevau_event_type = :currentLetterTypeLevel /* FLT1,ALT1,FLT2, ... */
AND evau.ucrevau_value_1 = :letterTypeCode /* FV1,ASV1, ... */
AND evau.ucrevau_activity_date = (SELECT max(ee.ucrevau_activity_date)
FROM uimsmgr.ucrevau ee
WHERE ee.ucrevau_scon_number = scon.uabscon_number
AND (ee.ucrevau_event_type like 'FLT%'
OR ee.ucrevau_event_type like 'ALT%'))
AND letd.usrletd_actual_cust_code = scon.uabscon_cust_code
AND letd.usrletd_prem_code = scon.uabscon_prem_code
AND letd.usrletd_letr_code = :letterTypeCode /* FV1,ASV1, ... */
AND letd.usrletd_printed_ind = 'Y'
AND TRUNC(letd.usrletd_activity_date) >= TRUNC(evau.ucrevau_activity_date)
AND EXISTS ( SELECT 1
FROM uimsmgr.utvsrvc srvc,
uimsmgr.ucrserv serv
WHERE serv.ucrserv_scon_number = scon.uabscon_number
AND serv.ucrserv_cust_code = scon.uabscon_cust_code
AND serv.ucrserv_prem_code = scon.uabscon_prem_code
AND TRUNC(serv.ucrserv_next_visit_date) <= TRUNC(SYSDATE) + :mfDueRange
AND serv.ucrserv_srvc_code = srvc.utvsrvc_code
AND srvc.utvsrvc_bus_sector_id = 1 /* only business sector 1*/
AND DECODE( NVL(serv.ucrserv_next_visit_type, 'A'),
'NOFV', 'A',
'FV' , 'F',
'FAS' , 'A',
'A' , 'A',
'Z' ) = :visitType
)I suggest this admitting on letd.usrletd_printed_date.
And it would be good if you would also have a lower limit for letd.usrletd_printed_date, so that you would have letd.usrletd_printed_date between ...
Similar Messages
-
How can i rewrite this query so it uses less inner joins (it causes my temp space to explode :) )
( SELECT Waardes.*, Tellers.Nr_Dataitems, Tellers.Nr_Details FROM
( SELECT extractvalue(Value(el_node), 'Node/Id') node,
extractvalue(Value(el_dataitem), 'Detail/Title') Node_Title,
extractvalue(Value(el_dataitem), 'Detail/Value') Node_Value
FROM PHILIPS_XML x,
TABLE (xmlsequence (extract (value(x), '/Tree/Node'))) el_node,
TABLE (xmlsequence (extract (value(el_node),
'Node/DataItems/DataItem/DetailSet/Detail'))) el_dataitem
) Waardes
INNER JOIN
SELECT A.Node, A.Nr_Dataitems, B.Nr_details FROM
SELECT extractvalue(Value(el_node), 'Node/Id') node,
count(extract(Value(aaa), 'DataItem')) Nr_Dataitems
FROM PHILIPS_XML x,
TABLE (xmlsequence (extract (value(x), '/Tree/Node'))) el_node,
TABLE (xmlsequence (extract (value(el_node),
'Node/DataItems/DataItem'))) aaa
GROUP BY extractvalue(Value(el_node), 'Node/Id')
) A
INNER JOIN
SELECT extractvalue(Value(el_node), 'Node/Id') node,
count(extract(Value(bbb), 'Detail')) Nr_details
FROM PHILIPS_XML x,
TABLE (xmlsequence (extract (value(x), '/Tree/Node'))) el_node,
TABLE (xmlsequence (extract (value(el_node),
'Node/DataItems/DataItem'))) aaa,
TABLE (xmlsequence (extract (value(aaa),
'DataItem/DetailSet/Detail' ))) bbb
GROUP BY extractvalue(Value(el_node), 'Node/Id')
) B
on A.node = B.NODE
) Tellers
ON Waardes.NODE = Tellers.NODE )1st Make sure all paths are absolute (start with '/', not just the node name).
Which release are you using.. Is the document based on an XMLSchema, if so, what annotations were used when registered the XML Schema ?. What does the explain plan look like... -
How can we rewrite this query for better performance
Hi All,
The below query is taking more time to run. Any ideas how to improve the performance by rewriting the query using NOT EXITS or any other way...
Help Appreciated.
/* Formatted on 2012/04/25 18:00 (Formatter Plus v4.8.8) */
SELECT vendor_id
FROM po_vendors
WHERE end_date_active IS NULL
AND enabled_flag = 'Y'
and vendor_id NOT IN ( /* Formatted on 2012/04/25 18:25 (Formatter Plus v4.8.8) */
SELECT vendor_id
FROM po_headers_all
WHERE TO_DATE (creation_date) BETWEEN TO_DATE (SYSDATE - 365)
AND TO_DATE (SYSDATE))
ThanksTry this one :
This will help you for partial fetching of data
SELECT /*+ first_rows(50) no_cpu_costing */
vendor_id
FROM po_vendors
WHERE end_date_active IS NULL
AND enabled_flag = 'Y'
AND vendor_id NOT IN (
SELECT vendor_id
FROM po_headers_all
WHERE TO_DATE (creation_date) BETWEEN TO_DATE (SYSDATE - 365)
AND TO_DATE (SYSDATE))
overall your query is also fine, because, the in this query the subquery always contain less data compare to main query. -
Is there any way to rewrite this query?
Is there room for improvement/rewrite for this query so that it performs well?
select distinct shp_locn
from shp_mstr
where zone = to_char(:b3)
and locn_class = 'r'
and aisle = 'GX-08'
and dock = 'KN'
and locn_id not in (select locn_id from tmp_shp_out_dtl)
order by shp_locnuser659394 wrote:
Alex,
Stop your st_u_pi_d f_u_c__king sarcasm. There were lots of instances like the below thread
where you bring your boring sarcasm to meaningful technical discussions.
If you dont want to answer, just leave it..... you C__u__n__t
Error for a SELECT COUNT ... in stored proc
Alex was giving you perfectly valid assistance.
Your post has now been reported to the moderators as it is completely offensive, unprofessional and unnecessary. -
How to rewrite this query without sub query please help me
Hello All Good Evening,
Could you please help me with this query, how can i write this query without sub query, or how can write this query another ways
please help me
select planno, status1, count(*) Counts from
select a.ValetNO PlanNo ,
case
when JoinCode in ('00', '01', '02') then 'Actcess'
when JoinCode in ('20', '21', '22', '23','38', '39') then
'Secured' else 'Other' end Status1 ---, COUNT (*)
from dbo.ppt a(NOLOCK) left join dbo.acts b on a.P_ID = b.P_ID and a.ValetNO = b.ValetNO
--group by a.ValetNO
a group by planno, status1
order by 2
Thank you in Advance
MilanWhats your objective here? Sorry, am not able to understand the reason for this change.
Try the below:(Not tested)
;With cte
As
select a.ValetNO PlanNo ,
case
when JoinCode in ('00', '01', '02') then 'Actcess'
when JoinCode in ('20', '21', '22', '23','38', '39') then
'Secured' else 'Other' end Status1 ---, COUNT (*)
from dbo.ppt a(NOLOCK) left join dbo.acts b on a.P_ID = b.P_ID and a.ValetNO = b.ValetNO
select planno, status1, count(*) Counts from cte
a group by planno, status1
order by 2
Even below:
select a.ValetNO PlanNo ,
case
when JoinCode in ('00', '01', '02') then 'Actcess'
when JoinCode in ('20', '21', '22', '23','38', '39') then
'Secured' else 'Other' end Status1 , COUNT (1)
from dbo.ppt a(NOLOCK) left join dbo.acts b on a.P_ID = b.P_ID and a.ValetNO = b.ValetNO
Group by a.ValetNO ,
case
when JoinCode in ('00', '01', '02') then 'Actcess'
when JoinCode in ('20', '21', '22', '23','38', '39') then
'Secured' else 'Other' end -
Can we rewrite this query??
what i am i doing wrong here..
this query has performance issue.. RBE_SMF_ATTRIB_HISTORY table has 2 M records..
SELECT h.pricing_security_id,h.level1 mac1,
h.level3 mac3,h.level5 mac5,
h.mat_date maturity,h.country_of_issue country,h.px_date
FROM GPS.RBE_SMF_ATTRIB_HISTORY h
WHERE h.px_type = 'PS1'
AND (create_timestamp, pricing_security_id)
IN (SELECT MAX(smf.create_timestamp), smf.pricing_security_id
FROM GPS.RBE_SMF_ATTRIB_HISTORY smf,
GPS.WK_HOLDINGS_PORTFOLIO wkhp
WHERE smf.px_type = 'PS1'
AND smf.px_date = h.px_date
AND wkhp.pricing_security_id=smf.pricing_security_id
GROUP BY smf.pricing_security_id )SELECT h.pricing_security_id,h.level1 mac1,
h.level3 mac3,h.level5 mac5,
h.mat_date maturity,h.country_of_issue country,h.px_date
FROM GPS.RBE_SMF_ATTRIB_HISTORY h
WHERE h.px_type = 'PS1'
AND (create_timestamp, pricing_security_id, px_date) IN (SELECT MAX(smf.create_timestamp), smf.pricing_security_id, smf.px_date
FROM GPS.RBE_SMF_ATTRIB_HISTORY smf,
GPS.WK_HOLDINGS_PORTFOLIO wkhp
WHERE smf.px_type = 'PS1'
-- AND smf.px_date = h.px_date <-- try commenting out this line
AND wkhp.pricing_security_id = smf.pricing_security_id
GROUP BY smf.pricing_security_id, smf.px_date )
also do you have indexes on your pricing_security_id columns for table GPS.RBE_SMF_ATTRIB_HISTORY and GPS.WK_HOLDINGS_PORTFOLIO?
note: untested -
How to rewrite this query to avoid duplicates , please
Hello Good Morning All,
Happy New Year,
Could you please help to rewrite the below two queries (so that i can avoid duplicates) i need to send email to everyone not the dupllicated ones), please?
Create table #MyPhoneList
AccountID int,
EmailWork varchar(50),
EmailHome varchar(50),
EmailOther varchar(50),
IsOffersToWorkEmail bit,
IsOffersToHomeEmail bit,
IsOffersToOtherEmail bit,
IsValidEmailWork bit,
IsValidEmailHome bit,
IsValidEmailOther bit
--> In this table AccountID is uniquee
--> email values could be null or repetetive for work / home / Other (same email can be used more than one columns for accountid)
-- a new column will be created with name as Sourceflag( the value could be work, Home, Other depend on email coming from) then removes duplicates
SELECT AccountID , Email, SourceFlag, ROW_NUMBER() OVER(PARTITION BY AccountID, Email ORDER BY Sourceflag desc) AS ROW
INTO #List
from (
SELECT AccountID
, EmailWork AS EMAIL
, 'Work' AS SourceFlag
FROM #MyPhoneList (NoLock) eml
WHERE IsOffersToWorkEmail = 1
AND EMAILWORK IS NOT NULL
AND IsValidEmailWork = 1
UNION
SELECT AccountID
, EmailHome
, 'Home' AS SourceFlag
FROM #MyPhoneList (NoLock) eml
WHERE IsOffersToHomeEmail = 1
AND EMAILHOME IS NOT NULL
AND IsValidEmailHome = 1
UNION
SELECT AccountID
, EmailOther
, 'Other' AS Sourceflag
FROM #MyPhoneList (NoLock) eml
WHERE EmailOther = 1
AND EMAILOther IS NOT NULL
AND IsValidEmailOther = 1
) eml --select count(*) from #email
--Email dedupe on source
SELECT * INTO #distinct FROM #List WHERE ROW = 1
Thank you in Advance
MilanPlease follow basic Netiquette and post the DDL we need to answer this. Follow industry and ANSI/ISO standards in your data. You should follow ISO-11179 rules for naming data elements. You should follow ISO-8601 rules for displaying temporal data. We need
to know the data types, keys and constraints on the table. Avoid dialect in favor of ANSI/ISO Standard SQL. And you need to read and download the PDF for:
https://www.simple-talk.com/books/sql-books/119-sql-code-smells/
>> Could you please help to rewrite the below two queries (so that I can avoid duplicates) I need to send email to everyone not the duplicated ones), please? <<
This mess is not a table because it has no keys, not way to have a key. You are using UNION like we used punch card merges in the o9ld days.
What math do you do on the account_id? That is the only reason that you use numeric values Why do you think that an email is fifty characters long? Yes, most them are, but did you bother to look at the maximum length? NO! Why did you name it “Phone_List” when
it is nothing but email addresses? emails are not phones.
Please read this article so you will know why RDBMS does not use assembly language flags like you are doing.
https://www.simple-talk.com/sql/t-sql-programming/bit-of-a-problem/
It would also help if you know what normalization was. Here is one design that is valid.
CREATE TABLE Something_emails
(account_id CHAR(15) NOT NULL,
email_address VARCHAR(256) NOT NULL,
email_type CHAR(5) NOT NULL
CHECK (email_type IN ('home', 'work', 'misc')),
PRIMARY KEY (email_address, email_type)
>> In this table account_id is unique <<
No, not without the DDL you did not post.
>> email values could be NULL or repetitive for work / home / Other (same email can be used more than one columns for account_id) <<
Not a problem. Look at the primary key. Also why would anyone store invalid data in a table? SQL programmers try to keep it out!
>> a new column will be created with name as Source_flag (the value could be work, Home, Other depend on email coming from) then removes duplicates <<
More kludges! Oh, putting the comma at the front of a line is how non-SQL mimic punch cards. An SQL progtrqammer would put related subsets of columns on one line – we think in sets! After 30+ years of SQL, this is one of the code smells I use to find bad
code.
--CELKO-- Books in Celko Series for Morgan-Kaufmann Publishing: Analytics and OLAP in SQL / Data and Databases: Concepts in Practice Data / Measurements and Standards in SQL SQL for Smarties / SQL Programming Style / SQL Puzzles and Answers / Thinking
in Sets / Trees and Hierarchies in SQL -
Please help to modifiy this query for better performance
Please help to rewrite this query for better performance. This is taking long time to execute.
Table t_t_bil_bil_cycle_change contains 1200000 rows and table t_acctnumberTab countains 200000 rows.
I have created index on ACCOUNT_ID
Query is shown below
update rbabu.t_t_bil_bil_cycle_change a
set account_number =
( select distinct b.account_number
from rbabu.t_acctnumberTab b
where a.account_id = b.account_id
Table structure is shown below
SQL> DESC t_acctnumberTab;
Name Type Nullable Default Comments
ACCOUNT_ID NUMBER(10)
ACCOUNT_NUMBER VARCHAR2(24)
SQL> DESC t_t_bil_bil_cycle_change;
Name Type Nullable Default Comments
ACCOUNT_ID NUMBER(10)
ACCOUNT_NUMBER VARCHAR2(24) YIshan's solution is good. I would avoid updating rows which already have the right value - it's a waste of time.
You should have a UNIQUE or PRIMARY KEY constraint on t_acctnumberTab.account_id
merge rbabu.t_t_bil_bil_cycle_change a
using
( select distinct account_number, account_id
from rbabu.t_acctnumberTab
) t
on ( a.account_id = b.account_id
and decode(a.account_number, b.account_number, 0, 1) = 1
when matched then
update set a.account_number = b.account_number -
Help rewriting this XMLTable query.
Hi,
I rewrote this query:
SELECT VALUE(k) ts_value,
s.transactionsetcontrolnumber ts,
t.xmlintid,
i.isaid,
stid,
g.sendorcode || '!' || g.receivercode || '!' || s.transactionsetid || '!I' geteditpparameter,
EXTRACTVALUE(VALUE(k), '/TS_850/BEG/BEG03') || '-' ||
(SELECT N104
FROM xmltable('/TS_850/GROUP_5/N1' passing VALUE(k) columns N101
VARCHAR2(2) path 'N101',
N104 VARCHAR2(32) path 'N104')
WHERE N101 = 'OB') beg_n104,
g.sendorcode || '!' || g.receivercode || '!' ||
(SELECT N103 || '!' || N104
FROM xmltable('/TS_850/GROUP_5/N1' passing VALUE(k) columns N101
VARCHAR2(2) path 'N101',
N103 VARCHAR2(32) path 'N103',
N104 VARCHAR2(32) path 'N104')
WHERE N101 = 'OB') getedicuststxparameter,
(SELECT to_date(dtm02, 'YYYYMMDD')
FROM xmltable('/TS_850/DTM' passing VALUE(k) columns dtm01
VARCHAR2(3) path 'DTM01',
dtm02 VARCHAR2(32) path 'DTM02')
WHERE DTM01 <> '061') requireddate,
(SELECT SUM(SAC07)
FROM xmltable('/TS_850/GROUP_1/SAC' passing VALUE(k) columns
SAC01 VARCHAR2(2) path 'SAC01',
SAC07 VARCHAR2(32) path 'SAC07')
WHERE SAC01 = 'A') sumsac07
FROM edi_xml_int t,
edi_isa i,
edi_gs g,
edi_st s,
TABLE(XMLSEQUENCE(EXTRACT(x12_850, '/X12/TS_850'))) k
WHERE s.gsid = g.gsid
AND g.isaid = i.isaid
AND t.isaid = i.isaid
AND s.transactionsetcontrolnumber =
EXTRACTVALUE(VALUE(k), '/TS_850/ST/ST02')
AND t.processeddate IS NULL
AND s.transactionsetid = '850'
AND TRIM(i.senderid) = '0722717110100'
and s.updateddate is null order by s.stid;
Explain Plan for this is:
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 8077 | 16M| 1056 (2)| 00:00:13 |
|* 1 | COLLECTION ITERATOR PICKLER FETCH | XMLSEQUENCEFROMXMLTYPE | | | | |
|* 2 | COLLECTION ITERATOR PICKLER FETCH | XMLSEQUENCEFROMXMLTYPE | | | | |
|* 3 | COLLECTION ITERATOR PICKLER FETCH | XMLSEQUENCEFROMXMLTYPE | | | | |
| 4 | SORT AGGREGATE | | 1 | 2 | | |
|* 5 | COLLECTION ITERATOR PICKLER FETCH| XMLSEQUENCEFROMXMLTYPE | | | | |
| 6 | NESTED LOOPS | | 8077 | 16M| 1056 (2)| 00:00:13 |
| 7 | NESTED LOOPS | | 45 | 95175 | 55 (0)| 00:00:01 |
| 8 | NESTED LOOPS | | 45 | 3510 | 4 (0)| 00:00:01 |
| 9 | MERGE JOIN CARTESIAN | | 45 | 2070 | 3 (0)| 00:00:01 |
|* 10 | TABLE ACCESS BY INDEX ROWID | EDI_ST | 45 | 1125 | 2 (0)| 00:00:01 |
| 11 | INDEX FULL SCAN | EDI_ST_PK | 45 | | 1 (0)| 00:00:01 |
| 12 | BUFFER SORT | | 1 | 21 | 1 (0)| 00:00:01 |
| 13 | TABLE ACCESS BY INDEX ROWID | EDI_ISA | 1 | 21 | 1 (0)| 00:00:01 |
|* 14 | INDEX RANGE SCAN | EDI_ISA_IX_1 | 1 | | 0 (0)| 00:00:01 |
|* 15 | TABLE ACCESS BY INDEX ROWID | EDI_GS | 1 | 32 | 1 (0)| 00:00:01 |
|* 16 | INDEX UNIQUE SCAN | EDI_GS_PK | 1 | | 0 (0)| 00:00:01 |
|* 17 | TABLE ACCESS FULL | EDI_XML_INT | 1 | 2037 | 1 (0)| 00:00:01 |
|* 18 | COLLECTION ITERATOR PICKLER FETCH| XMLSEQUENCEFROMXMLTYPE | | | | |
Predicate Information (identified by operation id):
1 - filter(CAST(SYS_XQ_UPKXML2SQL(SYS_XQEXVAL(SYS_XQEXTRACT(VALUE(KOKBF$),'/*/N101')),50,1,2) AS
VARCHAR2(2) )='OB')
2 - filter(CAST(SYS_XQ_UPKXML2SQL(SYS_XQEXVAL(SYS_XQEXTRACT(VALUE(KOKBF$),'/*/N101')),50,1,2) AS
VARCHAR2(2) )='OB')
3 - filter(CAST(SYS_XQ_UPKXML2SQL(SYS_XQEXVAL(SYS_XQEXTRACT(VALUE(KOKBF$),'/*/DTM01')),50,1,2) AS
VARCHAR2(3) )<>'061')
5 - filter(CAST(SYS_XQ_UPKXML2SQL(SYS_XQEXVAL(SYS_XQEXTRACT(VALUE(KOKBF$),'/*/SAC01')),50,1,2) AS
VARCHAR2(2) )='A')
10 - filter("S"."TRANSACTIONSETID"='850' AND "S"."UPDATEDDATE" IS NULL)
14 - access(TRIM("SENDERID")='0722717110100')
15 - filter("G"."ISAID"="I"."ISAID")
16 - access("S"."GSID"="G"."GSID")
17 - filter("T"."PROCESSEDDATE" IS NULL AND "T"."ISAID"="I"."ISAID")
18 - filter("S"."TRANSACTIONSETCONTROLNUMBER"=EXTRACTVALUE(VALUE(KOKBF$),'/TS_850/ST/ST02'))
Note
- dynamic sampling used for this statement
47 rows selected.I rewrote this to this:
SELECT k.main ts_value,
s.transactionsetcontrolnumber ts,
t.xmlintid,
i.isaid,
stid,
g.sendorcode || '!' || g.receivercode || '!' || s.transactionsetid || '!I' geteditpparameter,
EXTRACTVALUE(k.main, '/TS_850/BEG/BEG03') || '-' ||
(SELECT N104
FROM xmltable('/TS_850/GROUP_5/N1' passing k.main columns N101
VARCHAR2(2) path 'N101',
N104 VARCHAR2(32) path 'N104')
WHERE N101 = 'OB') beg_n104,
g.sendorcode || '!' || g.receivercode || '!' ||
(SELECT N103 || '!' || N104
FROM xmltable('/TS_850/GROUP_5/N1' passing k.main columns N101
VARCHAR2(2) path 'N101',
N103 VARCHAR2(32) path 'N103',
N104 VARCHAR2(32) path 'N104')
WHERE N101 = 'OB') getedicuststxparameter,
(SELECT to_date(dtm02, 'YYYYMMDD')
FROM xmltable('/TS_850/DTM' passing k.main columns dtm01
VARCHAR2(3) path 'DTM01',
dtm02 VARCHAR2(32) path 'DTM02')
WHERE DTM01 <> '061') requireddate,
(SELECT SUM(SAC07)
FROM xmltable('/TS_850/GROUP_1/SAC' passing k.main columns
SAC01 VARCHAR2(2) path 'SAC01',
SAC07 VARCHAR2(32) path 'SAC07')
WHERE SAC01 = 'A') sumsac07
FROM edi_xml_int t,
edi_isa i,
edi_gs g,
edi_st s,
xmltable('/X12/TS_850' passing x12_850 columns main xmltype path
'/TS_850',
st02 varchar2(32) path '/TS_850/ST/ST02') k
WHERE s.gsid = g.gsid
AND g.isaid = i.isaid
AND t.isaid = i.isaid
AND s.transactionsetcontrolnumber = k.st02
AND t.processeddate IS NULL
AND s.transactionsetid = '850'
AND TRIM(i.senderid) = '0722717110100'
and s.updateddate is null
order by s.stid;
Explain plan for this is:
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 8077 | 16M| 1056 (2)| 00:00:13 |
|* 1 | COLLECTION ITERATOR PICKLER FETCH | XMLSEQUENCEFROMXMLTYPE | | | | |
|* 2 | COLLECTION ITERATOR PICKLER FETCH | XMLSEQUENCEFROMXMLTYPE | | | | |
|* 3 | COLLECTION ITERATOR PICKLER FETCH | XMLSEQUENCEFROMXMLTYPE | | | | |
| 4 | SORT AGGREGATE | | 1 | 2 | | |
|* 5 | COLLECTION ITERATOR PICKLER FETCH| XMLSEQUENCEFROMXMLTYPE | | | | |
| 6 | NESTED LOOPS | | 8077 | 16M| 1056 (2)| 00:00:13 |
| 7 | NESTED LOOPS | | 45 | 95175 | 55 (0)| 00:00:01 |
| 8 | NESTED LOOPS | | 45 | 3510 | 4 (0)| 00:00:01 |
| 9 | MERGE JOIN CARTESIAN | | 45 | 2070 | 3 (0)| 00:00:01 |
|* 10 | TABLE ACCESS BY INDEX ROWID | EDI_ST | 45 | 1125 | 2 (0)| 00:00:01 |
| 11 | INDEX FULL SCAN | EDI_ST_PK | 45 | | 1 (0)| 00:00:01 |
| 12 | BUFFER SORT | | 1 | 21 | 1 (0)| 00:00:01 |
| 13 | TABLE ACCESS BY INDEX ROWID | EDI_ISA | 1 | 21 | 1 (0)| 00:00:01 |
|* 14 | INDEX RANGE SCAN | EDI_ISA_IX_1 | 1 | | 0 (0)| 00:00:01 |
|* 15 | TABLE ACCESS BY INDEX ROWID | EDI_GS | 1 | 32 | 1 (0)| 00:00:01 |
|* 16 | INDEX UNIQUE SCAN | EDI_GS_PK | 1 | | 0 (0)| 00:00:01 |
|* 17 | TABLE ACCESS FULL | EDI_XML_INT | 1 | 2037 | 1 (0)| 00:00:01 |
|* 18 | COLLECTION ITERATOR PICKLER FETCH| XMLSEQUENCEFROMXMLTYPE | | | | |
Predicate Information (identified by operation id):
1 - filter(CAST(SYS_XQ_UPKXML2SQL(SYS_XQEXVAL(SYS_XQEXTRACT(VALUE(KOKBF$),'/*/N101')),50,1,2) AS
VARCHAR2(2) )='OB')
2 - filter(CAST(SYS_XQ_UPKXML2SQL(SYS_XQEXVAL(SYS_XQEXTRACT(VALUE(KOKBF$),'/*/N101')),50,1,2) AS
VARCHAR2(2) )='OB')
3 - filter(CAST(SYS_XQ_UPKXML2SQL(SYS_XQEXVAL(SYS_XQEXTRACT(VALUE(KOKBF$),'/*/DTM01')),50,1,2) AS
VARCHAR2(3) )<>'061')
5 - filter(CAST(SYS_XQ_UPKXML2SQL(SYS_XQEXVAL(SYS_XQEXTRACT(VALUE(KOKBF$),'/*/SAC01')),50,1,2) AS
VARCHAR2(2) )='A')
10 - filter("S"."TRANSACTIONSETID"='850' AND "S"."UPDATEDDATE" IS NULL)
14 - access(TRIM("SENDERID")='0722717110100')
15 - filter("G"."ISAID"="I"."ISAID")
16 - access("S"."GSID"="G"."GSID")
17 - filter("T"."PROCESSEDDATE" IS NULL AND "T"."ISAID"="I"."ISAID")
18 - filter("S"."TRANSACTIONSETCONTROLNUMBER"=CAST(SYS_XQ_UPKXML2SQL(SYS_XQEXVAL(SYS_XQEXTRACT(VALU
E(KOKBF$),'/TS_850/ST/ST02')),50,1,2) AS varchar2(32) ))
Note
- dynamic sampling used for this statement
48 rows selected.Now, I was wondering if you can have just one implementation of XMLTable in the query which will reduce the complexity of this. Both the queries looked like they gave me the same results.
Thank you,
Rahul.It's quite hard to tune a query without seeing the table structure and available indices as well as relationship between each other but I'll try.
In your sql which you've given the table alias AD, you have this filter criteria
AND FIELD_NAME IN (
SELECT FIELD_NAME
FROM APPLICATION_FIELDS
WHERE FIELD_TYPE IN ('Checkbox','Radio','Select','SelectM', 'RadioHoriz','RadioPara')
) </br>
My question is, is FIELD_NAME a column in the APPLICATION_DATA table? If it is, try moving this clause outside of the current sub-query it is in, i.e. one more level up. It looks like you put them inside the wrong level.
I would also try converting this <COL> IN <SUB-QUERY> to a join, if that wouldn't affect the no. of rows returned. I can't tell for sure since I dont know the relationship between your tables.
It looks to me like you're doing this
SELECT <col list>
FROM ( SELECT -- LEVEL 1
FROM APPLICATION_DATA AD
WHERE AD.APPLICAITON_ID IN ( -- LEVEL 2
SELECT
FROM APPLICATIONS A
WHERE A.JOB_ID IN (
<SUBQUERY>
AND A.ACCOUNT_ID IN (
<SUBQUERY>
AND FIELDNAME IN ( -- SHOULD BE INSIDE LEVEL1
<SUBQUERY>
) AD,
( SELECT ....
) FD
WHERE .... -
Hi,
I'm using below query in procedure.It's taking more more time can some one help to tune this query or advice to rewrite the query.
Databse :10.1
SELECT 'Reading Comprehension' TEST_NAME,T.TEST_END_DATE TEST_SESSION_DATE,
C.POOL_VERSION_ID, I.CREATED_ON POOL_CREATED_DT,
C.ITEM_ID, C.ITEM_RESPONSE_ID, S.STUDENT_ID_PK, C.RESPONSE_KEY, C.IS_CORRECT RESPONSE_IS_CORRECT,
T.SCORE SCALE_SCORE, C.RESPONSE_DURATION, P.ITEM_KEY,
T.TEST_SESSION_DETAIL_ID, SYSDATE CREATED_ON
-- BULK COLLECT INTO TV_PSYCHO_DET
FROM
CAT_ITEM_PARAMETER P, CAT_ITEM_USER_RESPONSE C, TEST_SESSION_DETAIL T,
TEST_SESSION S, ITEM_POOL_VERSION I, TEST_DETAIL D
,INSTITUTION E
WHERE TRUNC(T.TEST_END_DATE) BETWEEN TO_DATE('01-11-09','dd-mm-yy') AND TO_DATE('30-11-09','dd-mm-yy')
AND D.TEST_NAME = 'Reading Comprehension'
AND T.TEST_SESSION_STATUS_ID = 3
AND I.POOL_AVAILABILITY='Y'
AND P.PRETEST=0 AND C.RESTART_FLAG=0
AND T.TEST_DETAIL_ID = D.TEST_DETAIL_ID
AND S.TEST_SESSION_ID = T.TEST_SESSION_ID
AND C.TEST_SESSION_DETAIL_ID = T.TEST_SESSION_DETAIL_ID
AND S.INSTITUTION_ID=E.INSTITUTION_ID
AND SUBSTR(E.INSTITUTION_ID_DISPLAY,8,3) <> '000'
AND I.ITEM_ID = C.ITEM_ID
AND P.ITEM_ID = I.ITEM_ID;expln plan
Plan hash value: 3712814491
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart|
Pstop |
| 0 | SELECT STATEMENT | | 50857 | 7151K| 93382 (1)| 00:18:41 | |
|
|* 1 | FILTER | | | | | | |
|
|* 2 | HASH JOIN | | 50857 | 7151K| 93382 (1)| 00:18:41 | |
|
| 3 | PARTITION HASH ALL | | 2312 | 23120 | 25 (0)| 00:00:01 | 1 |
5 |
|* 4 | TABLE ACCESS FULL | CAT_ITEM_PARAMETER | 2312 | 23120 | 25 (0)| 00:00:01 | 1 |
5 |
|* 5 | HASH JOIN | | 94938 | 12M| 93356 (1)| 00:18:41 | |
|
|* 6 | TABLE ACCESS FULL | ITEM_POOL_VERSION | 9036 | 132K| 30 (0)| 00:00:01 | |
|
|* 7 | TABLE ACCESS BY GLOBAL INDEX ROWID | CAT_ITEM_USER_RESPONSE | 9 | 279 | 18 (0)| 00:00:01 | ROWID |
ROWID |
| 8 | NESTED LOOPS | | 45349 | 5270K| 93325 (1)| 00:18:40 | |
|
|* 9 | HASH JOIN | | 4923 | 423K| 11377 (1)| 00:02:17 | |
|
|* 10 | INDEX FAST FULL SCAN | INSTI_ID_NAME_COUN_DISP_IDX | 8165 | 111K| 18 (0)| 00:00:01 | |
|
|* 11 | HASH JOIN | | 4923 | 355K| 11359 (1)| 00:02:17 | |
|
|* 12 | TABLE ACCESS BY GLOBAL INDEX ROWID| TEST_SESSION_DETAIL | 4107 | 148K| 6804 (1)| 00:01:22 | ROWID |
ROWID |
| 13 | NESTED LOOPS | | 4923 | 278K| 6806 (1)| 00:01:22 | |
|
|* 14 | INDEX RANGE SCAN | TEST_DETAIL_AK_1 | 1 | 21 | 2 (0)| 00:00:01 | |
|
|* 15 | INDEX RANGE SCAN | TEST_SESSION_DETAIL_FK2_I | 39737 | | 102 (0)| 00:00:02 | |
|
| 16 | PARTITION HASH ALL | | 1672K| 25M| 4546 (1)| 00:00:55 | 1 |
5 |
| 17 | TABLE ACCESS FULL | TEST_SESSION | 1672K| 25M| 4546 (1)| 00:00:55 | 1 |
5 |
|* 18 | INDEX RANGE SCAN | CAT_ITEM_USER_RESP_IDX1 | 18 | | 3 (0)| 00:00:01 | |
|
Predicate Information (identified by operation id):
1 - filter(TO_DATE('01-11-09','dd-mm-yy')<=TO_DATE('30-11-09','dd-mm-yy'))
2 - access("P"."ITEM_ID"="I"."ITEM_ID")
4 - filter("P"."PRETEST"=0)
5 - access("I"."ITEM_ID"="C"."ITEM_ID")
6 - filter("I"."POOL_AVAILABILITY"='Y')
7 - filter(TO_NUMBER("C"."RESTART_FLAG")=0)
9 - access("S"."INSTITUTION_ID"="E"."INSTITUTION_ID")
10 - filter(SUBSTR("E"."INSTITUTION_ID_DISPLAY",8,3)<>'000')
11 - access("S"."TEST_SESSION_ID"="T"."TEST_SESSION_ID")
12 - filter(TRUNC(INTERNAL_FUNCTION("T"."TEST_END_DATE"))>=TO_DATE('01-11-09','dd-mm-yy') AND "T"."TEST_SESSION_STATUS_ID"=3
AND TRUNC(INTERNAL_FUNCTION("T"."TEST_END_DATE"))<=TO_DATE('30-11-09','dd-mm-yy'))
14 - access("D"."TEST_NAME"='Reading Comprehension')
15 - access("T"."TEST_DETAIL_ID"="D"."TEST_DETAIL_ID")
18 - access("C"."TEST_SESSION_DETAIL_ID"="T"."TEST_SESSION_DETAIL_ID")
43 rows selected.Edited by: user575115 on Dec 18, 2009 12:31 AMWhen you see something like ...
7 - filter(TO_NUMBER("C"."RESTART_FLAG")=0) It means that Oracle had to do a conversion for you since you aren't using the proper data type in your query.
That would mean IF there is an index on that column, it won't be useable... -
Need help in tune this query.
Hi All,
The below query is taking nearly one hour to give the output.
2 select sku.VK_UNIT
3 , sku.MODEL
4 , sku.DESCRIPTION
5 , slt.GEO
6 , slt.LEAD_TIME
7 , slt.REV_LEAD_TIME
8 , aud.LEAD_TIME as PREV_LEAD_TIME_GEO
9 , aud.REV_LEAD_TIME as PREV_REV_LEAD_TIME_GEO
10 , slt.COUNTDOWN
11 , aud.CREATION_DATE as EDD_CREATION_DATE_GEO
12 , aud.CREATED_BY as EDD_CREATED_BY_GEO
13 from LTC_GLOBAL.LTC_SKU sku
14 , LTC_GLOBAL.LTC_SKU_LEAD_TIME slt
15 , (select VK_UNIT
16 , MODEL
17 , substr(ACTION_TYPE, 9) as GEO
18 , max(case when substr(ACTION_TYPE, 1, 8) = 'SKU EDD ' then ACTION_VALUE else null end) as LEAD_TIME
19 , max(case when substr(ACTION_TYPE, 1, 8) = 'SKU EDD ' then CREATION_DATE else null end) as CREATION_DATE
20 , max(case when substr(ACTION_TYPE, 1, 8) = 'SKU EDD ' then CREATED_BY else null end) as CREATED_BY
21 , max(case when substr(ACTION_TYPE, 1, 8) = 'SKU RDD ' then ACTION_VALUE else null end) as REV_LEAD_TIME
22 , max(case when substr(ACTION_TYPE, 1, 8) = 'SKU RDD ' then CREATION_DATE else null end) as REV_CREATION_DATE
23 , max(case when substr(ACTION_TYPE, 1, 8) = 'SKU RDD ' then CREATED_BY else null end) as REV_CREATED_BY
24 from (select VK_UNIT
25 , MODEL
26 , ACTION_TYPE
27 , ACTION_VALUE
28 , CREATION_DATE
29 , CREATED_BY
30 , PREV_ACTION_VALUE
31 , PREV_CREATION_DATE
32 , PREV_CREATED_BY
33 from (select
34 NOTE as VK_UNIT
35 , NOTE2 as MODEL
36 , ACTION_TYPE
37 , ACTION_VALUE
38 , CREATION_DATE
39 , CREATED_BY
40 , row_number() over(partition by NOTE, NOTE2, ACTION_TYPE order by CREATION_DATE desc) as DEPTH
41 , lead(CREATION_DATE) over(partition by NOTE, NOTE2, ACTION_TYPE order by CREATION_DATE desc) as PREV_CREATION_DATE
42 , lead(CREATED_BY ) over(partition by NOTE, NOTE2, ACTION_TYPE order by CREATION_DATE desc) as PREV_CREATED_BY
43 , lead(ACTION_VALUE ) over(partition by NOTE, NOTE2, ACTION_TYPE order by CREATION_DATE desc) as PREV_ACTION_VALUE
44 from LTC_GLOBAL.LTC_AUDIT
45 where NOTE is not null
46 and NOTE2 is not null
47 and ACTION_TYPE is not null
48 )
49 where DEPTH = 2
50 and substr(ACTION_TYPE, 1, 8) in ('SKU EDD ', 'SKU RDD ')
51 )
52 group by VK_UNIT, MODEL, substr(ACTION_TYPE, 9)
53 ) aud
54 where slt.VK_UNIT = sku.VK_UNIT
55 and slt.MODEL = sku.MODEL
56 and slt.CLASS = sku.CLASS
57 and nvl(slt.LEAD_TIME, slt.REV_LEAD_TIME) is not null
58 and aud.VK_UNIT (+)= slt.VK_UNIT
59 and aud.MODEL (+)= slt.MODEL
60 and aud.GEO (+)= slt.GEO;
PLAN_TABLE_OUTPUT
Plan hash value: 2687821083
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 539K| 902M| | 1005K (1)| 03:21:05 |
|* 1 | HASH JOIN OUTER | | 539K| 902M| 62M| 1005K (1)| 03:21:05 |
|* 2 | HASH JOIN | | 539K| 56M| 27M| 66402 (1)| 00:13:17 |
|* 3 | TABLE ACCESS FULL | LTC_SKU_LEAD_TIME | 559K| 20M| | 23201 (2)| 00:04:39 |
| 4 | TABLE ACCESS FULL | LTC_SKU_UNIT | 5726K| 382M| | 19570 (1)| 00:03:55 |
| 5 | VIEW | | 4157K| 6522M| | 610K (2)| 02:02:02 |
PLAN_TABLE_OUTPUT
| 6 | HASH GROUP BY | | 4157K| 229M| 303M| 610K (2)| 02:02:02 |
|* 7 | VIEW | | 4157K| 229M| | 551K (2)| 01:50:21 |
|* 8 | WINDOW SORT PUSHED RANK| | 4157K| 229M| 303M| 551K (2)| 01:50:21 |
|* 9 | TABLE ACCESS FULL | LTC_AUDIT | 4157K| 229M| | 493K (2)| 01:38:41 |
Predicate Information (identified by operation id):
1 - access("AUD"."VK_UNIT"(+)="SLT"."VK_UNIT" AND "AUD"."MODEL"(+)="SLT"."MODEL" AND
"AUD"."GEO"(+)="SLT"."GEO")
PLAN_TABLE_OUTPUT
2 - access("SLT"."VK_UNIT"="UNIT"."VK_UNIT" AND "SLT"."MODEL"="UNIT"."MODEL" AND
"SLT"."CLASS"="UNIT"."CLASS")
3 - filter(NVL("SLT"."LEAD_TIME","SLT"."REV_LEAD_TIME") IS NOT NULL)
7 - filter("DEPTH"=2)
8 - filter(ROW_NUMBER() OVER ( PARTITION BY "NOTE","NOTE2","ACTION_TYPE" ORDER BY
INTERNAL_FUNCTION("CREATION_DATE") DESC )<=2)
9 - filter((SUBSTR("ACTION_TYPE",1,8)='SKU EDD ' OR SUBSTR("ACTION_TYPE",1,8)='SKU RDD ') AND
"NOTE2" IS NOT NULL AND "ACTION_TYPE" IS NOT NULL)
30 rows selected.
SELECT COUNT(*) FROM LTC_GLOBAL.LTC_SKU--5012335
SELECT COUNT(*) FROM LTC_GLOBAL.LTC_SKU_LEAD_TIME--8060956
SELECT COUNT(*) FROM LTC_GLOBAL.LTC_AUDIT--58309887
CREATE UNIQUE INDEX LTC_GLOBAL.LTC_SKU_LEAD_TIME_PK ON LTC_GLOBAL.LTC_SKU_LEAD_TIME(VK_UNIT, MODEL, CLASS, GEO)
CREATE INDEX LTC_GLOBAL.LTC_AUDIT_LEAD_TIME ON LTC_GLOBAL.LTC_AUDIT(ACTION_TYPE)
CREATE INDEX LTC_GLOBAL.LTC_AUDIT_LEAD_TIME_DOM ON LTC_GLOBAL.LTC_AUDIT(NOTE, NOTE2, ACTION_TYPE)
CREATE INDEX LTC_GLOBAL.LTC_AUDIT_LEAD_TIME_DOM1 ON LTC_GLOBAL.LTC_AUDIT("CREATION_DATE" DESC)
Please help me.
Thanks in advance.Thanks for your response.
Sorry for violating formatting. Since I am not aware of the format options in new environment.
I have created functional based index on SUBSTR(ACTION_TYPE, 1, 8).
The cost got reduced some what.But still the query is taking 40 minutes.
The following predicate it is returning 58296618 rows.
NOTE is not null
and NOTE2 is not null
and ACTION_TYPE is not null
LTC_SKU_UNIT is a view.
The following query is used for creating this view.
SELECT unit.VK_UNIT,
unit.MODEL,
unit.CLASS,
unit.LOB,
unit.LAST_UPDATE_DATE,
unit.DESCRIPTION
FROM LTC_GLOBAL.LTC_SKU_UNIT unit;
The following indexes are created on the LTC_GLOBAL.LTC_SKU_UNIT table.
CREATE INDEX LTC_GLOBAL.LTC_SKU_UNIT_IDX_CLASS ON LTC_GLOBAL.LTC_SKU_UNIT(CLASS)
CREATE INDEX LTC_GLOBAL.LTC_SKU_UNIT_IDX_MODEL ON LTC_GLOBAL.LTC_SKU_UNIT(MODEL)
CREATE INDEX LTC_GLOBAL.LTC_SKU_UNIT_IDX_UPDATE_DATE ON LTC_GLOBAL.LTC_SKU_UNIT(LAST_UPDATE_DATE)
CREATE UNIQUE INDEX LTC_GLOBAL.LTC_SKU_UNIT_PK ON LTC_GLOBAL.LTC_SKU_UNIT(VK_UNIT, MODEL, CLASS)
Is there any way to rewrite the query to improve the performance. Any suggestions to improve the performance.
Please help me.
Thanks in advance. -
This query is taking a long time:
Hi All,
I need help in tuning this query. The stats are as below:
SQL> show parameter user_dump_dest
NAME TYPE VALUE
user_dump_dest string /opt/app/oracle/diag/rdbms/ebi
zfile/EBIZFILE/trace
SQL> show parameter optimizer
NAME TYPE VALUE
optimizer_capture_sql_plan_baselines boolean FALSE
optimizer_dynamic_sampling integer 2
optimizer_features_enable string 11.2.0.2
optimizer_index_caching integer 0
optimizer_index_cost_adj integer 100
optimizer_mode string ALL_ROWS
optimizer_secure_view_merging boolean TRUE
optimizer_use_invisible_indexes boolean FALSE
optimizer_use_pending_statistics boolean FALSE
optimizer_use_sql_plan_baselines boolean TRUE
SQL> show parameter db_file_multi
NAME TYPE VALUE
db_file_multiblock_read_count integer 128
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
SQL>
SQL> column sname format a20
SQL> column pname format a20
SQL> column pval2 format a20
SQL>
SQL> select
2 sname, pname, pval1, pval2
3 from
4 sys.aux_stats$;
SNAME PNAME PVAL1 PVAL2
SYSSTATS_INFO STATUS COMPLETED
SYSSTATS_INFO DSTART 11-03-2009 02:33
SYSSTATS_INFO DSTOP 11-03-2009 02:33
SYSSTATS_INFO FLAGS 1
SYSSTATS_MAIN CPUSPEEDNW 714.19791
SYSSTATS_MAIN IOSEEKTIM 10
SYSSTATS_MAIN IOTFRSPEED 4096
SYSSTATS_MAIN SREADTIM
SYSSTATS_MAIN MREADTIM
SYSSTATS_MAIN CPUSPEED
SYSSTATS_MAIN MBRC
SYSSTATS_MAIN MAXTHR
SYSSTATS_MAIN SLAVETHR
13 rows selected.
Elapsed: 00:00:00.03
SQL>
SQL> explain plan for
2 SELECT A.TRANS_NO,
3 A.TRANS_ID,
4 A.REQUEST_IND,
5 A.TRANS_STATUS_IND,
6 A.TRANS_STATUS_DATE,
7 A.DELIVERY_DATE,
8 C.EMAIL_ADDR
9 FROM IIS_TRANS_MASTER A, M_TRANS B, IIS_REQUEST_TRANS C
10 WHERE
11 C.TRANS_NO = A.TRANS_NO
12 AND A.TRANS_STATUS_IND = 'P'
13 AND A.TRANS_ID = B.TRANS_ID
14 AND A.TRANS_ID <> 'I009'
15 AND A.TRANS_ID <> 'NPKG'
16 AND B.TRANS_CO_TYPE = 'I'
17 AND A.TRANS_ID NOT IN
18 ('P012', 'P13B', 'P13C', 'P14B', 'P14C', 'P015')
19 AND B.DEPT = 'IRD'
20 ORDER BY A.CREATED_DATE;
Explained.
Elapsed: 00:00:00.01
SQL>
SQL> set pagesize 1000;
SQL> set linesize 170;
SQL> @/opt/app/oracle/product/11.2.0/rdbms/admin/utlxplp.sql
SQL> Rem
SQL> Rem $Header: utlxplp.sql 23-jan-2002.08:55:23 bdagevil Exp $
SQL> Rem
SQL> Rem utlxplp.sql
SQL> Rem
SQL> Rem Copyright (c) 1998, 2002, Oracle Corporation. All rights reserved.
SQL> Rem
SQL> Rem NAME
SQL> Rem utlxplp.sql - UTiLity eXPLain Parallel plans
SQL> Rem
SQL> Rem DESCRIPTION
SQL> Rem script utility to display the explain plan of the last explain plan
SQL> Rem command. Display also Parallel Query information if the plan happens to
SQL> Rem run parallel
SQL> Rem
SQL> Rem NOTES
SQL> Rem Assume that the table PLAN_TABLE has been created. The script
SQL> Rem utlxplan.sql should be used to create that table
SQL> Rem
SQL> Rem With SQL*plus, it is recomended to set linesize and pagesize before
SQL> Rem running this script. For example:
SQL> Rem set linesize 130
SQL> Rem set pagesize 0
SQL> Rem
SQL> Rem MODIFIED (MM/DD/YY)
SQL> Rem bdagevil 01/23/02 - rewrite with new dbms_xplan package
SQL> Rem bdagevil 04/05/01 - include CPU cost
SQL> Rem bdagevil 02/27/01 - increase Name column
SQL> Rem jihuang 06/14/00 - change order by to order siblings by.
SQL> Rem jihuang 05/10/00 - include plan info for recursive SQL in LE row source
SQL> Rem bdagevil 01/05/00 - make deterministic with order-by
SQL> Rem bdagevil 05/07/98 - Explain plan script for parallel plans
SQL> Rem bdagevil 05/07/98 - Created
SQL> Rem
SQL>
SQL> set markup html preformat on
SQL>
SQL> Rem
SQL> Rem Use the display table function from the dbms_xplan package to display the last
SQL> Rem explain plan. Use default mode which will display only relevant information
SQL> Rem
SQL> select * from table(dbms_xplan.display());
PLAN_TABLE_OUTPUT
Plan hash value: 3822676895
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 38075 | 3123K| | 22550 (2)| 00:04:31 |
| 1 | SORT ORDER BY | | 38075 | 3123K| 3472K| 22550 (2)| 00:04:31 |
|* 2 | HASH JOIN | | 38075 | 3123K| 2120K| 21801 (2)| 00:04:22 |
| 3 | NESTED LOOPS | | | | | | |
| 4 | NESTED LOOPS | | 38075 | 1673K| | 4177 (1)| 00:00:51 |
|* 5 | TABLE ACCESS FULL | M_TRANS | 10 | 80 | | 7 (0)| 00:00:01 |
|* 6 | INDEX RANGE SCAN | IDX_IIS_TRANS_ID | 39401 | | | 109 (3)| 00:00:02 |
|* 7 | TABLE ACCESS BY INDEX ROWID| IIS_TRANS_MASTER | 3940 | 142K| | 3186 (1)| 00:00:39 |
| 8 | TABLE ACCESS FULL | IIS_REQUEST_TRANS | 2114K| 78M| | 12368 (2)| 00:02:29 |
Predicate Information (identified by operation id):
2 - access("C"."TRANS_NO"="A"."TRANS_NO")
5 - filter("B"."DEPT"='IRD' AND "B"."TRANS_CO_TYPE"='I' AND "B"."TRANS_ID"<>'I009' AND
"B"."TRANS_ID"<>'NPKG' AND "B"."TRANS_ID"<>'P012' AND "B"."TRANS_ID"<>'P13B' AND
"B"."TRANS_ID"<>'P13C' AND "B"."TRANS_ID"<>'P14B' AND "B"."TRANS_ID"<>'P14C' AND
"B"."TRANS_ID"<>'P015')
6 - access("A"."TRANS_ID"="B"."TRANS_ID")
filter("A"."TRANS_ID"<>'I009' AND "A"."TRANS_ID"<>'NPKG' AND "A"."TRANS_ID"<>'P012' AND
"A"."TRANS_ID"<>'P13B' AND "A"."TRANS_ID"<>'P13C' AND "A"."TRANS_ID"<>'P14B' AND
"A"."TRANS_ID"<>'P14C' AND "A"."TRANS_ID"<>'P015')
7 - filter("A"."TRANS_STATUS_IND"='P')
29 rows selected.
Elapsed: 00:00:00.02
SQL>
SQL> rollback;
Rollback complete.
Elapsed: 00:00:00.00
SQL>
SQL> rem Set the ARRAYSIZE according to your application
SQL> set autotrace traceonly arraysize 100
SQL>
SQL> alter session set tracefile_identifier = 'mytrace1';
Session altered.
Elapsed: 00:00:00.00
SQL>
SQL> rem if you're using bind variables
SQL> rem define them here
SQL>
SQL> rem variable b_var1 number
SQL> rem variable b_var2 varchar2(20)
SQL>
SQL> rem and initialize them
SQL>
SQL> rem exec :b_var1 := 1
SQL> rem exec :b_var2 := 'DIAG'
SQL> set pagesize 1000;
SQL> set linesize 170;
SQL> alter session set events '10046 trace name context forever, level 8';
Session altered.
Elapsed: 00:00:00.00
SQL> SELECT A.TRANS_NO,
2 A.TRANS_ID,
3 A.REQUEST_IND,
4 A.TRANS_STATUS_IND,
5 A.TRANS_STATUS_DATE,
6 A.DELIVERY_DATE,
7 C.EMAIL_ADDR
8 FROM IIS_TRANS_MASTER A, M_TRANS B, IIS_REQUEST_TRANS C
9 WHERE
10 C.TRANS_NO = A.TRANS_NO
11 AND A.TRANS_STATUS_IND = 'P'
12 AND A.TRANS_ID = B.TRANS_ID
13 AND A.TRANS_ID <> 'I009'
14 AND A.TRANS_ID <> 'NPKG'
15 AND B.TRANS_CO_TYPE = 'I'
16 AND A.TRANS_ID NOT IN
17 ('P012', 'P13B', 'P13C', 'P14B', 'P14C', 'P015')
18 AND B.DEPT = 'IRD'
19 ORDER BY A.CREATED_DATE;
19 rows selected.
Elapsed: 00:00:15.44
Execution Plan
Plan hash value: 3822676895
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 38075 | 3123K| | 22550 (2)| 00:04:31 |
| 1 | SORT ORDER BY | | 38075 | 3123K| 3472K| 22550 (2)| 00:04:31 |
|* 2 | HASH JOIN | | 38075 | 3123K| 2120K| 21801 (2)| 00:04:22 |
| 3 | NESTED LOOPS | | | | | | |
| 4 | NESTED LOOPS | | 38075 | 1673K| | 4177 (1)| 00:00:51 |
|* 5 | TABLE ACCESS FULL | M_TRANS | 10 | 80 | | 7 (0)| 00:00:01 |
|* 6 | INDEX RANGE SCAN | IDX_IIS_TRANS_ID | 39401 | | | 109 (3)| 00:00:02 |
|* 7 | TABLE ACCESS BY INDEX ROWID| IIS_TRANS_MASTER | 3940 | 142K| | 3186 (1)| 00:00:39 |
| 8 | TABLE ACCESS FULL | IIS_REQUEST_TRANS | 2114K| 78M| | 12368 (2)| 00:02:29 |
Predicate Information (identified by operation id):
2 - access("C"."TRANS_NO"="A"."TRANS_NO")
5 - filter("B"."DEPT"='IRD' AND "B"."TRANS_CO_TYPE"='I' AND "B"."TRANS_ID"<>'I009' AND
"B"."TRANS_ID"<>'NPKG' AND "B"."TRANS_ID"<>'P012' AND "B"."TRANS_ID"<>'P13B' AND
"B"."TRANS_ID"<>'P13C' AND "B"."TRANS_ID"<>'P14B' AND "B"."TRANS_ID"<>'P14C' AND
"B"."TRANS_ID"<>'P015')
6 - access("A"."TRANS_ID"="B"."TRANS_ID")
filter("A"."TRANS_ID"<>'I009' AND "A"."TRANS_ID"<>'NPKG' AND "A"."TRANS_ID"<>'P012' AND
"A"."TRANS_ID"<>'P13B' AND "A"."TRANS_ID"<>'P13C' AND "A"."TRANS_ID"<>'P14B' AND
"A"."TRANS_ID"<>'P14C' AND "A"."TRANS_ID"<>'P015')
7 - filter("A"."TRANS_STATUS_IND"='P')
Statistics
23 recursive calls
0 db block gets
164826 consistent gets
74235 physical reads
0 redo size
1839 bytes sent via SQL*Net to client
524 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
19 rows processed
SQL>
SQL> disconnect
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing optionsHi Manik,
1) Not really. Order by may not be required.
2) After gathering the stats, below is the result:
NAME_COL_PLUS_SHOW_PARAM TYPE
VALUE_COL_PLUS_SHOW_PARAM
user_dump_dest string
/opt/app/oracle/diag/rdbms/ebizfile/EBIZFILE/trace
SQL> show parameter optimizer
NAME_COL_PLUS_SHOW_PARAM TYPE
VALUE_COL_PLUS_SHOW_PARAM
Elapsed: 00:00:00.05
SQL> SELECT A.TRANS_NO,
2 A.TRANS_ID,
3 A.REQUEST_IND,
4 A.TRANS_STATUS_IND,
5 A.TRANS_STATUS_DATE,
6 A.DELIVERY_DATE,
7 C.EMAIL_ADDR
8 FROM IIS_TRANS_MASTER A, M_TRANS B, IIS_REQUEST_TRANS C
9 WHERE
10 C.TRANS_NO = A.TRANS_NO
11 AND A.TRANS_STATUS_IND = 'P'
12 AND A.TRANS_ID = B.TRANS_ID
13 AND A.TRANS_ID <> 'I009'
14 AND A.TRANS_ID <> 'NPKG'
15 AND B.TRANS_CO_TYPE = 'I'
16 AND A.TRANS_ID NOT IN
17 ('P012', 'P13B', 'P13C', 'P14B', 'P14C', 'P015')
18 AND B.DEPT = 'IRD'
19 ORDER BY A.CREATED_DATE;
20 rows selected.
Elapsed: 00:00:06.58
Execution Plan
Plan hash value: 3822676895
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 38091 | 3124K| | 22553 (2)| 00:04:31 |
| 1 | SORT ORDER BY | | 38091 | 3124K| 3472K| 22553 (2)| 00:04:31 |
|* 2 | HASH JOIN | | 38091 | 3124K| 2128K| 21804 (2)| 00:04:22 |
| 3 | NESTED LOOPS | | | | | | |
| 4 | NESTED LOOPS | | 38091 | 1673K| | 4180 (1)| 00:00:51 |
|* 5 | TABLE ACCESS FULL | M_TRANS | 10 | 80 | | 7 (0)| 00:00:01 |
|* 6 | INDEX RANGE SCAN | IDX_IIS_TRANS_ID | 39418 | | | 109 (3)| 00:00:02 |
|* 7 | TABLE ACCESS BY INDEX ROWID| IIS_TRANS_MASTER | 3942 | 142K| | 3189 (1)| 00:00:39 |
| 8 | TABLE ACCESS FULL | IIS_REQUEST_TRANS | 2114K| 78M| | 12368 (2)| 00:02:29 |
Predicate Information (identified by operation id):
2 - access("C"."TRANS_NO"="A"."TRANS_NO")
5 - filter("B"."DEPT"='IRD' AND "B"."TRANS_CO_TYPE"='I' AND "B"."TRANS_ID"<>'I009' AND
"B"."TRANS_ID"<>'NPKG' AND "B"."TRANS_ID"<>'P012' AND "B"."TRANS_ID"<>'P13B' AND
"B"."TRANS_ID"<>'P13C' AND "B"."TRANS_ID"<>'P14B' AND "B"."TRANS_ID"<>'P14C' AND
"B"."TRANS_ID"<>'P015')
6 - access("A"."TRANS_ID"="B"."TRANS_ID")
filter("A"."TRANS_ID"<>'I009' AND "A"."TRANS_ID"<>'NPKG' AND "A"."TRANS_ID"<>'P012' AND
"A"."TRANS_ID"<>'P13B' AND "A"."TRANS_ID"<>'P13C' AND "A"."TRANS_ID"<>'P14B' AND
"A"."TRANS_ID"<>'P14C' AND "A"."TRANS_ID"<>'P015')
7 - filter("A"."TRANS_STATUS_IND"='P')
Statistics
17 recursive calls
0 db block gets
158643 consistent gets
49083 physical reads
0 redo size
1917 bytes sent via SQL*Net to client
524 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
20 rows processedI am yet to try the DBMS_SQLTUNE.
Are you able to give me in simplified form the steps in executing this query for the DBMS_SQLTUNE? Thanks! -
Hello
I have one query taking time to fetch the records. Table contains just 40,000 thousands records but lots of case statement in the query, I just remove lots of case statement there are lot more...
Can you please help me out to rewrite the query to fetch the records faster. Also Right now there are no indexes on the table....
SELECT O.cn,
O.BEN_LAST_NAME,
O.BEN_FIRST_NAME,
O.BEN_MI,
O.SSN,
O.DOB,
O.SEX,
CASE
WHEN O.SEX = 'F' AND O.AGE BETWEEN 00 AND 34 THEN
1
ELSE
0
END AS AGE_GROUP0_34_F,
CASE
WHEN O.SEX = 'F' AND O.AGE BETWEEN 35 AND 44 THEN
1
ELSE
0
END AS AGE_GROUP35_44_F,
CASE
WHEN O.SEX = 'F' AND O.AGE BETWEEN 45 AND 54 THEN
1
ELSE
0
END AS AGE_GROUP45_54_F,
CASE
WHEN O.SEX = 'F' AND O.AGE BETWEEN 55 AND 59 THEN
1
ELSE
0
END AS AGE_GROUP55_59_F,
CASE
WHEN O.SEX = 'F' AND O.AGE BETWEEN 60 AND 64 THEN
1
ELSE
0
END AS AGE_GROUP60_64_F,
CASE
WHEN O.SEX = 'F' AND O.AGE BETWEEN 65 AND 69 THEN
1
ELSE
0
END AS AGE_GROUP65_69_F,
CASE
WHEN O.SEX = 'F' AND O.AGE BETWEEN 70 AND 74 THEN
1
ELSE
0
END AS AGE_GROUP70_74_F,
CASE
WHEN O.SEX = 'F' AND O.AGE BETWEEN 75 AND 79 THEN
1
ELSE
0
END AS AGE_GROUP75_79_F,
CASE
WHEN O.SEX = 'F' AND O.AGE BETWEEN 80 AND 84 THEN
1
ELSE
0
END AS AGE_GROUP80_84_F,
CASE
WHEN O.SEX = 'F' AND O.AGE BETWEEN 85 AND 89 THEN
1
ELSE
0
END AS AGE_GROUP85_89_F,
CASE
WHEN O.SEX = 'F' AND O.AGE BETWEEN 90 AND 94 THEN
1
ELSE
0
END AS AGE_GROUP90_94_F,
CASE
WHEN O.SEX = 'F' AND O.AGE BETWEEN 95 AND 00 THEN
1
ELSE
0
END AS AGE_GROUP95_GT_F,
CASE
WHEN O.SEX = 'M' AND O.AGE BETWEEN 00 AND 34 THEN
1
ELSE
0
END AS AGE_GROUP0_34_M,
CASE
WHEN O.SEX = 'M' AND O.AGE BETWEEN 35 AND 44 THEN
1
ELSE
0
END AS AGE_GROUP35_44_M,
CASE
WHEN O.SEX = 'M' AND O.AGE BETWEEN 45 AND 54 THEN
1
ELSE
0
END AS AGE_GROUP45_54_M,
CASE
WHEN O.SEX = 'M' AND O.AGE BETWEEN 45 AND 59 THEN
1
ELSE
0
END AS AGE_GROUP55_59_M,
CASE
WHEN O.SEX = 'M' AND O.AGE BETWEEN 60 AND 64 THEN
1
ELSE
0
END AS AGE_GROUP60_64_M,
CASE
WHEN O.SEX = 'M' AND O.AGE BETWEEN 65 AND 69 THEN
1
ELSE
0
END AS AGE_GROUP65_69_M,
CASE
WHEN O.SEX = 'M' AND O.AGE BETWEEN 70 AND 74 THEN
1
ELSE
0
END AS AGE_GROUP70_74_M,
CASE
WHEN O.SEX = 'M' AND O.AGE BETWEEN 75 AND 79 THEN
1
ELSE
0
END AS AGE_GROUP75_79_M,
CASE
WHEN O.SEX = 'M' AND O.AGE BETWEEN 80 AND 84 THEN
1
ELSE
0
END AS AGE_GROUP80_84_M,
CASE
WHEN O.SEX = 'M' AND O.AGE BETWEEN 85 AND 89 THEN
1
ELSE
0
END AS AGE_GROUP85_89_M,
CASE
WHEN O.SEX = 'M' AND O.AGE BETWEEN 90 AND 94 THEN
1
ELSE
0
END AS AGE_GROUP90_94_M,
CASE
WHEN O.SEX = 'M' AND O.AGE BETWEEN 95 AND 00 THEN
1
ELSE
0
END AS AGE_GROUP95_GT_M,
O.YEAR,
CASE WHEN EXISTS (SELECT m1.hcc_model_category1 FROM HCC_MODEL_DIAGNOSIS M1 , HCC_MODEL_DIAGNOSIS_MAPPING HM
,mor222 m2 WHERE m1.map_id = hm.map_id_ref
AND m2.YEAR = hm.YEAR
AND o.cn = m2.cn
AND o.YEAR = hm.YEAR
AND m1.hcc_model_category1 = 1
AND m2.diag_code = m1.icd9cmscode) THEN 1 ELSE 0 END AS DISEASE_COEF_HCC1,
CASE WHEN EXISTS (SELECT m1.hcc_model_category1 FROM HCC_MODEL_DIAGNOSIS M1 , HCC_MODEL_DIAGNOSIS_MAPPING HM
,mor222 m2 WHERE m1.map_id = hm.map_id_ref
AND m2.YEAR = hm.YEAR
AND o.cn = m2.cn
AND o.YEAR = hm.YEAR
AND m1.hcc_model_category1 = 2
AND m2.diag_code = m1.icd9cmscode) THEN 1 ELSE 0 END AS DISEASE_COEF_HCC2,
CASE WHEN EXISTS (SELECT m1.hcc_model_category1 FROM HCC_MODEL_DIAGNOSIS M1 , HCC_MODEL_DIAGNOSIS_MAPPING HM
,mor222 m2 WHERE m1.map_id = hm.map_id_ref
AND m2.YEAR = hm.YEAR
AND o.cn = m2.cn
AND o.YEAR = hm.YEAR
AND m1.hcc_model_category1 = 5
AND m2.diag_code = m1.icd9cmscode) THEN 1 ELSE 0 END AS DISEASE_COEF_HCC5,
CASE WHEN EXISTS (SELECT m1.hcc_model_category1 FROM HCC_MODEL_DIAGNOSIS M1 , HCC_MODEL_DIAGNOSIS_MAPPING HM
,mor222 m2 WHERE m1.map_id = hm.map_id_ref
AND m2.YEAR = hm.YEAR
AND o.cn = m2.cn
AND o.YEAR = hm.YEAR
AND m1.hcc_model_category1 = 7
AND m2.diag_code = m1.icd9cmscode) THEN 1 ELSE 0 END AS DISEASE_COEF_HCC7,
CASE WHEN EXISTS (SELECT m1.hcc_model_category1 FROM HCC_MODEL_DIAGNOSIS M1 , HCC_MODEL_DIAGNOSIS_MAPPING HM
,mor222 m2 WHERE m1.map_id = hm.map_id_ref
AND m2.YEAR = hm.YEAR
AND o.cn = m2.cn
AND o.YEAR = hm.YEAR
AND m1.hcc_model_category1 = 8
AND m2.diag_code = m1.icd9cmscode) THEN 1 ELSE 0 END AS DISEASE_COEF_HCC8
FROM (SELECT T.cn,
T.BEN_LAST_NAME,
T.BEN_FIRST_NAME,
T.BEN_MI,
T.SSN,
TO_DATE(T.DOB, 'YYYYMMDD') AS DOB,
T.SEX,
TRUNC(MONTHS_BETWEEN(TO_DATE('01/01/' || T.YEAR, 'MM/DD/YYYY'),
TO_DATE(T.DOB, 'YYYYMMDD')) / 12) AS AGE,
T.YEAR
FROM mor111 T ) O Thanks in advance!
Kind regards,
NikOk, so I am going to be a little bit kinder then your first reply, but not much.
From what can tell you are doing medical management and are trying to select by AGE/GENDER CELLS and this is common when trying to deal with RBRVS.
This is by far some of the worst sql I have ever seen, sorry but it just is.
So please report this either as a new post or as a reply and:
1. At least post the table definitions and if you can some sample data.
2. Get rid of almost all the case selectors.
3. Describe the output you need.
As it is this is unreadable.
After that we can talk more.
Edited by: FlyingGuy on Oct 11, 2011 5:13 PM -
Hello,
I would like your help for a query.
I know that the logic is really bad,but i am not the one who will decide it.
SELECT
A.c1
, B.c1
, B.c2
, B.c3
FROM TABLE1 A
INNER JOIN Table2 B
ON B.c4 ='xxx'
AND B.5 = 'xxxx'
AND (A.2=B.c6 OR B.c6 = '*' )
AND (A.3=B.c7 OR B.c7 = '*' )
How can we rewrite this in order not to bring us a cartesian product?
I have tried with
1.case when
2.union
but nothing.....
I really need your help.
ThanksAnother one (just to update the duplicate)
could hardly be faster (maybe on Exadata) than the previous one
select a.c1,b.c1,b.c2,b.c3
from (select c1,c2,c3
from table1
where c2 != '*'
and c3 != '*'
) a
(select c1,c2,c3,c6,c7
from table2
where c4 = 'xxx'
and c5 = 'xxxx'
and c6 != '*'
and c7 != '*'
) b
where (a.c2 = b.c6)
and (a.c3 = b.c7)
union all
select a.c1,b.c1,b.c2,b.c3
from (select c1
from table1
where c2 = '*'
and c3 = '*'
) a
(select c1,c2,c3
from table2
where c4 = 'xxx'
and c5 = 'xxxx'
and c6 = '*'
and c7 = '*'
) bRegards
Etbin
Edited by: Etbin on 24.6.2012 8:57 -
Any room for improvement for this query? Explain Plan attached.
Is there any room for improvement for this query? Table stats are up-to-date. Any suggestions Query rewrite, addition of indexes,...etc ??
select sum(CONF
when (cd.actl_qty - cd.total_alloc_qty - lsd.Q < 0) then
0
else
cd.actl_qty - cd.total_alloc_qty - lsd.Q
end)
from (select sum(reqd_qty) as Q, ITEM_ID as ITEM
from SHIP_DTL SD
where exists (select 1
from CONF_dtl
where CONF_nbr = '1'
and ITEM_id = SD.ITEM_id)
group by ITEM_id) lsd,
CONF_dtl cd
where lsd.ITEM = cd.ITEM_id
and cd.CONF_nbr = '1'Total number of rows in the tables involved
select count(*) from CONF_DTL;
COUNT(*)
1785889
select count(*) from shp_dtl;
COUNT(*)
286675
Explain Plan
PLAN_TABLE_OUTPUT
Plan hash value: 2325658044
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 1 | 39 | 4 (25)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 39 | | |
| 2 | VIEW | | 1 | 39 | 4 (25)| 00:00:01 |
| 3 | HASH GROUP BY | | 1 | 117 | 4 (25)| 00:00:01 |
| 4 | TABLE ACCESS BY INDEX ROWID | SHIP_DTL | 1 | 15 | 1 (0)| 00:00:01
| 5 | NESTED LOOPS | | 1 | 117 | 3 (0)| 00:00:01 |
| 6 | MERGE JOIN CARTESIAN | | 1 | 102 | 2 (0)| 00:00:01 |
| 7 | TABLE ACCESS BY INDEX ROWID | CONF_DTL | 1 | 70 | 1 (0)| 00:00:01 |
|* 8 | INDEX RANGE SCAN | PK_CONF_DTL | 1 | | 1 (0)| 00:00:01 |
| 9 | BUFFER SORT | | 1 | 32 | 1 (0)| 00:00:01 |
| 10 | SORT UNIQUE | | 1 | 32 | 1 (0)| 00:00:01 |
| 11 | TABLE ACCESS BY INDEX ROWID| CONF_DTL | 1 | 32 | 1 (0)| 00:00:01 |
|* 12 | INDEX RANGE SCAN | PK_CONF_DTL | 1 | | 1 (0)| 00:00:01 |
|* 13 | INDEX RANGE SCAN | SHIP_DTL_IND_6 | 1 | | 1 (0)| 00:00:01 |
Predicate Information (identified by operation id):
8 - access("CD"."CONF_NBR"='1')
12 - access("CONF_NBR"='1')
13 - access("ITEM_ID"="SD"."ITEM_ID")
filter("ITEM_ID"="CD"."ITEM_ID")Citizen_2 wrote:
Is there any room for improvement for this query? Table stats are up-to-date. Any suggestions Query rewrite, addition of indexes,...etc ??You say that the table stats are up-to-date, but is the following assumption of the optimizer correct:
select count(*)
from CONF_dtl
where CONF_nbr = '1';Does this query return a count of 1? I doubt that, but that's what Oracle estimates in the EXPLAIN PLAN output. Based on that assumption you get a cartesian join between the two CONF_DTL table instances, and the result - which is still expected to be one row at most - is then joined to the SHIP_DTL table using a NESTED LOOP.
If above assumption is incorrect, the number of rows generated by the cartesian join can be tremendous rendering the NESTED LOOP operation quite inefficient.
You can verify this by using the DBMS_XPLAN.DISPLAY_CURSOR function together with the GATHER_PLAN_STATISTICS hint, if you're already on 10g or later.
For more information regarding the DISPLAY_CURSOR function, see e.g. here: http://jonathanlewis.wordpress.com/2006/11/09/dbms_xplan-in-10g/
It will show you the actual cardinalities compared to the estimated cardinalities.
If the estimate of the optimizer is incorrect, you should find out why. There still might be some issues with the statistics, since this is most obvious reason for incorrect estimates.
Are your index statistics up-to-date?
Regards,
Randolf
Oracle related stuff blog:
http://oracle-randolf.blogspot.com/
SQLTools++ for Oracle (Open source Oracle GUI for Windows):
http://www.sqltools-plusplus.org:7676/
http://sourceforge.net/projects/sqlt-pp/
Maybe you are looking for
-
ITunes 7.5 and OSX 10.4.11 - CANNOT CONNECT TO iTUNES STORE
After a recent upgrade to iTunes 7.5 and OSX 10.4.11, I can no longer connect to the iTunes store. I have tried reinstalling iTunes 7.5 (and Quicktime - just in case!). I have also tried Keychain First Aid. Still it is broken. Please help me with thi
-
Ipod classic not recognized in itunes because of ipodservice.exe
My ipod classic (80gb) is frequently not recognized in itunes 11 running on Windows 8 unless I close itunes, eject the ipod using windows, stop ipodservice.exe (64 bit) using task manager, and restart itunes. Anybody know of a more permanent fix?
-
How do I change back the print pages box?
I refreshed Firefox and my print pages box changed. It went from having a long box allowing me to type in say the 1-3, 6,10 pages to two small "from" & "to" boxes. I really need this back to the way it was for my business. I checked IE and that print
-
How to use CHANGEDOCU functions for audit trail?
Hi, I have a report screen that requires audit trails on the changes made to the data dic fields on the screen. Which CHANGEDOCU functions should I use for audit trail? And where should I implement the functions? In the 'save' subrountine that I crea
-
Is Forms10g web based or web enabled ?
Hello every body. I want to know if Oracle Forms10g is web based or web enabled ? BTW: what is the difference between both terms ? Yours