Need RAC Tuning - Query
Hi,
I have been facing a problem for the past two days. We have a two node RAC and the DB was working fine until Monday.
Suddenly we came across a lots of Deadlocks with two tables and their was repeated ORA-00060 error in the Alert. And when we analyzed we got the tables and query from the trace. We are not sure about the cause of deadlock because all the columns involved in the query are properly indexes and all foreign keys are also indexes.
When we try the same scenario locally it is working fine but when it get simultaneous hits say like 10 users the query hangs. This was working fine past week.
Below is the observation in ADDM:
FINDING 1: 100% impact (31499 seconds)
SQL statements were found waiting for row lock waits.
RECOMMENDATION 1: Application Analysis, 96% benefit (30314 seconds)
ACTION: Significant row contention was detected in the TABLE
"NIC_GS.T_INSURED_LIST" with object id 270988. Trace the cause of row
contention in the application logic using the given blocked SQL.
RELEVANT OBJECT: database object with id 270988
RATIONALE: The SQL statement with SQL_ID "41k7uj9f36tv0" was blocked on
row locks.
RELEVANT OBJECT: SQL statement with SQL_ID 41k7uj9f36tv0
update T_INSURED_LIST set UPDATE_TIME=:1, POLICY_ID=:2,
SUM_INSURED=:3, INSERT_TIME=:4, FIELD12=:5, FIELD13=:6 where
INSURED_ID=:7
RATIONALE: The SQL statement with SQL_ID "9dg72r8w5nap6" was blocked on
row locks.
RELEVANT OBJECT: SQL statement with SQL_ID 9dg72r8w5nap6
update T_INSURED_LIST set UPDATE_TIME=:1, POLICY_ID=:2,
INSERT_TIME=:3, FIELD12=:4, FIELD13=:5 where INSURED_ID=:6
RATIONALE: The SQL statement with SQL_ID "d6n84rch33cbq" was blocked on
row locks.
RELEVANT OBJECT: SQL statement with SQL_ID d6n84rch33cbq
update T_INSURED_LIST set sum_insured=:1 where insured_id=:2
FINDING 2: 98% impact (31024 seconds)
SQL statements consuming significant database time were found.
RECOMMENDATION 1: SQL Tuning, 53% benefit (16830 seconds)
ACTION: Investigate the SQL statement with SQL_ID "41k7uj9f36tv0" for
possible performance improvements.
RELEVANT OBJECT: SQL statement with SQL_ID 41k7uj9f36tv0 and
PLAN_HASH 610793629
update T_INSURED_LIST set UPDATE_TIME=:1, POLICY_ID=:2,
SUM_INSURED=:3, INSERT_TIME=:4, FIELD12=:5, FIELD13=:6 where
INSURED_ID=:7
RATIONALE: SQL statement with SQL_ID "41k7uj9f36tv0" was executed 63
times and had an average elapsed time of 267 seconds.
RATIONALE: Waiting for event "enq: TX - row lock contention" in wait
class "Application" accounted for 99% of the database time spent in
processing the SQL statement with SQL_ID "41k7uj9f36tv0".
Please suggest....
Hi,
Thanks for your response..
We have AIX server with oracle 10.2.0.4.
We have narrowed down the issue : The table contains multiple insurance products and the problem is not occurring all the products but in only one product.
I have been attaching the full trace of Deadlock.
----------enqueue 0x7000002cf73bff0------------------------
lock version : 37
Owner node : 0
grant_level : KJUSERNL
req_level : KJUSEREX
bast_level : KJUSERNL
notify_func : 0
resp : 7000002aa711890
procp : 7000002ca743c90
pid : 4460708
proc version : 0
oprocp : 0
opid : 0
group lock owner : 7000002c84f0398
possible pid : 4460708
xid : 101E-01EE-00000002
dd_time : 2.0 secs
dd_count : 0
timeout : 0.0 secs
On_timer_q? : N
On_dd_q? : Y
lock_state : OPENING CONVERTING
Open Options : KJUSERDEADLOCK
Convert options : KJUSERGETVALUE
History : 0x1495149a
Msg_Seq : 0x0
res_seq : 1
valblk : 0x00000000000000000000000000000000 .
DUMP LOCAL BLOCKER: initiate state dump for DEADLOCK
possible owner[494.4460708] on resource TX-0087002D-000012DF
Submitting asynchronized dump request [28]
*** 2012-08-22 15:51:13.021
kjddopr: skip converting lock 7000002c8a214d0 dd_cnt 1
user session for deadlock lock 7000002cf73c698
pid=242 serial=2 audsid=323336032 user: 103/Samp_GS
O/S info: user: Samp, term: , ospid: 1234, machine: Samp-PEBAAP1A-AR
program:
Current SQL Statement:
update T_POLICY_CT set UPDATE_TIME=:1, INSERT_TIME=:2, FIELD01=:3, FIELD02=:4, FIELD03=:5, FIELD04=:6, FIELD07=:7, FIELD66=:8 where POLICY_CT_ID=:9
user session for deadlock lock 7000002cf73c548
pid=244 serial=2 audsid=323336034 user: 103/Samp_GS
O/S info: user: Samp, term: , ospid: 1234, machine: Samp-PEBAAP1A-AR
program:
Current SQL Statement:
update T_INSURED_LIST set sum_insured=:1 where insured_id=:2
user session for deadlock lock 7000002c8adf120
pid=244 serial=2 audsid=323336034 user: 103/Samp_GS
O/S info: user: Samp, term: , ospid: 1234, machine: Samp-PEBAAP1A-AR
program:
Current SQL Statement:
update T_INSURED_LIST set sum_insured=:1 where insured_id=:2
user session for deadlock lock 7000002c8a21380
pid=242 serial=2 audsid=323336032 user: 103/Samp_GS
O/S info: user: Samp, term: , ospid: 1234, machine: Samp-PEBAAP1A-AR
program:
Current SQL Statement:
update T_POLICY_CT set UPDATE_TIME=:1, INSERT_TIME=:2, FIELD01=:3, FIELD02=:4, FIELD03=:5, FIELD04=:6, FIELD07=:7, FIELD66=:8 where POLICY_CT_ID=:9
Global blockers dump start:---------------------------------
DUMP LOCAL BLOCKER/HOLDER: block level 5 res [0x2d0025][0x4ff2],[TX]
----------resource 0x7000002aa711890----------------------
resname : [0x2d0025][0x4ff2],[TX]
Local node : 0
dir_node : 0
master_node : 0
hv idx : 118
hv last r.inc : 4
current inc : 4
hv status : 0
hv master : 1
open options : dd
grant_bits : KJUSERNL KJUSEREX
grant mode : KJUSERNL KJUSERCR KJUSERCW KJUSERPR KJUSERPW KJUSEREX
count : 1 0 0 0 0 1
val_state : KJUSERVS_NOVALUE
valblk : 0x00000000000000000000000000000000 .
access_node : 0
vbreq_state : 0
state : x0
resp : 7000002aa711890
On Scan_q? : N
Total accesses: 43
Imm. accesses: 39
Granted_locks : 1
Cvting_locks : 1
value_block: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
GRANTED_Q :
lp 7000002cf73c548 gl KJUSEREX rp 7000002aa711890 [0x2d0025][0x4ff2],[TX]
master 0 gl owner 7000002cf501998 possible pid 2551964 xid 100F-00F4-00000002 bast 0 rseq 5 mseq 0 history 0x14951495
open opt KJUSERDEADLOCK
CONVERT_Q:
lp 7000002cf73c698 gl KJUSERNL rl KJUSEREX rp 7000002aa711890 [0x2d0025][0x4ff2],[TX]
master 0 gl owner 7000002c8544830 possible pid 2588702 xid 100F-00F2-00000002 bast 0 rseq 5 mseq 0 history 0x1495149a
convert opt KJUSERGETVALUE
----------enqueue 0x7000002cf73c548------------------------
lock version : 109
Owner node : 0
grant_level : KJUSEREX
req_level : KJUSEREX
bast_level : KJUSERNL
notify_func : 0
resp : 7000002aa711890
procp : 7000002ca6f5870
pid : 2588702
proc version : 0
oprocp : 0
opid : 0
group lock owner : 7000002cf501998
possible pid : 2551964
xid : 100F-00F4-00000002
dd_time : 0.0 secs
dd_count : 0
timeout : 0.0 secs
On_timer_q? : N
On_dd_q? : N
lock_state : GRANTED
Open Options : KJUSERDEADLOCK
Convert options : KJUSERNOQUEUE
History : 0x14951495
Msg_Seq : 0x0
res_seq : 5
valblk : 0x00000000000000000000000000000000 .
DUMP LOCAL BLOCKER: initiate state dump for DEADLOCK
possible owner[244.2551964] on resource TX-002D0025-00004FF2
Submitting asynchronized dump request [28]
Please suggest....
Similar Messages
-
How to find which query need to tuned
Hi ,
How can i find , which query need to tuned . Is there any mechanism behind it?The mechanisms behind it are depending on your database version.
For example:
Oracle 9i has STATSPACK that helps you to identify possible problem queries.
Oracle 10g has AWR - Automatic Workload Repository
Oracle 11g has SPA - Database Replay SQL Performance Analyzer
but there are many more tools/mechanisms...trace/tkprof for example.
Go to http://tahiti.oracle.com and do a search on 'performance tuning guide', and pick the one that matches your (sofar unknown) database version, read a bit every now and then and see what tools are at your disposal and fit your requirement and situation.
Besides the links that Blu already posted, searches on http://asktom.oracle.com also give lots of pointers and explanations regarding the (neverending) tuning process (at least: helped me tremendously in understanding the tuning process, the do's and dont's).
Make sure you don't get CTD (Compulsive Tuning Disorder) from all this... ;) -
Need help tuning slow running query
Need help tuning below two Oracle queries:
Query #1:
======================
SELECT "WORK_ORDER_FACT_ALL_YESTERDAY"."WORK_ORDER_HISTORY_ID",
"WORK_ORDER_FACT_ALL_YESTERDAY"."ACCOUNT_NUMBER",
"ACCOUNT_DIM"."ACCOUNT_NUMBER", "ACCOUNT_DIM"."ACCOUNT_WS_DISC_DATE"
FROM "CDWD"."WORK_ORDER_FACT_ALL_YESTERDAY" "WORK_ORDER_FACT_ALL_YESTERDAY",
"CDWD"."ACCOUNT_DIM" "ACCOUNT_DIM"
WHERE (SUBSTR ("WORK_ORDER_FACT_ALL_YESTERDAY"."ACCOUNT_FIRST_NAME", 1, 1) =
SUBSTR ("ACCOUNT_DIM"."ACCOUNT_FIRST_NAME", 1, 1)
AND (SUBSTR ("WORK_ORDER_FACT_ALL_YESTERDAY"."ACCOUNT_LAST_NAME", 1, 4) =
SUBSTR ("ACCOUNT_DIM"."ACCOUNT_LAST_NAME", 1, 4)
AND ("WORK_ORDER_FACT_ALL_YESTERDAY"."ACCOUNT_DL_NUMBER" =
"ACCOUNT_DIM"."ACCOUNT_DL_NUMBER"
AND "WORK_ORDER_FACT_ALL_YESTERDAY"."WO_TYPE_CODE" IN ('25', '27')
AND ("ACCOUNT_DIM"."REVENUE_TYPE_ID" = 1)
AND ("WORK_ORDER_FACT_ALL_YESTERDAY"."TRANSFER_COUNT" = 0)
AND ("WORK_ORDER_FACT_ALL_YESTERDAY"."WINBACK_ADD_COUNT" = 0)
AND ("ACCOUNT_DIM"."ACCOUNT_WS_ENTRY_DATE" <
(TO_DATE ('2006.05.02', 'yyyy.mm.dd') - 11
AND ("WORK_ORDER_FACT_ALL_YESTERDAY"."IS_DERIVED" = 0)
AND ("ACCOUNT_DIM"."EXPIRATION_DATE" IS NULL)
AND ("WORK_ORDER_FACT_ALL_YESTERDAY"."ACT_ACCOUNT_TYPE_CD" <> '50');
Query #2
==================
UPDATE work_order_fact_all_yesterday g
SET returns_count = 1
WHERE EXISTS (SELECT 1
FROM (SELECT a.phone_dim_key AS transactional_phone_dim_key,
b.mdn_number AS transactional_mdn_number,
b.account_number AS transactional_account_number
FROM work_order_fact_all_yesterday a INNER JOIN phone_dim b ON a.phone_dim_key = b.phone_dim_key
WHERE a.gross_deactivations_count = 1) e
INNER JOIN (SELECT c.phone_dim_key AS historical_phone_dim_key,
d.mdn_number AS historical_mdn_number,
d.account_number AS historical_account_number
FROM (SELECT phone_dim_key
FROM work_order_activity_fact
WHERE gross_adds_count = 1
AND report_date >= :b1 - 66
AND NVL (is_derived, 0 ) = 0
UNION
SELECT phone_dim_key
FROM work_order_fact_all_yesterday
WHERE gross_adds_count = 1
AND is_derived = 0) c
INNER JOIN phone_dim d ON c.phone_dim_key = d.phone_dim_key ) f
ON e.transactional_mdn_number = f.historical_mdn_number
AND e.transactional_account_number = f.historical_account_number
WHERE e.transactional_phone_dim_key = g.phone_dim_key)
AND g.gross_deactivations_count = 1
AND g.account_revenue_type_id = 1;
I ran the DBMS_SQLTUNE on it for 10g and did not get any advice. How can I tune the above queries? Thanks!Tune the SQL? Looking at the join criteria of SUBSTR("WORK_ORDER_FACT_ALL_YESTERDAY"."ACCOUNT_FIRST_NAME", 1, 1) = SUBSTR ("ACCOUNT_DIM"."ACCOUNT_FIRST_NAME", 1, 1) and other substrings, it seems to me that you have basic flaws in your relation design.
Column must be atomic values. Having to extract a sub-set value from a column to create the intelligence needed to join to another table - that is just plain wrong in relation design. Never mind the performance impact and overheads it causes in the database. -
help needed for writing query
i have the following tables(with data) as mentioned below
FK*-foregin key (SUBJECTS)
FK**-foregin key (COMBINATION)
1)SUBJECTS(table name)
SUB_ID(NUMBER) SUB_CODE(VARCHAR2) SUB_NAME (VARCHAR2)
2 02 Computer Science
3 03 Physics
4 04 Chemistry
5 05 Mathematics
7 07 Commerce
8 08 Computer Applications
9 09 Biology
2)COMBINATION
COMB_ID(NUMBER) COMB_NAME(VARCHAR2) SUB_ID1(NUMBER(FK*)) SUB_ID2(NUMBER(FK*)) SUB_ID3(NUMBER(FK*)) SUBJ_ID4(NUMBER(FK*))
383 S1 9 4 2 3
384 S2 4 2 5 3
---------I actually designed the ABOVE table also like this
3) a)COMBINATION
COMB_ID(NUMBER) COMB_NAME(VARCHAR2)
383 S1
384 S2
b)COMBINATION_DET
COMBDET_ID(NUMBER) COMB_ID(FK**) SUB_ID(FK*)
1 383 9
2 383 4
3 383 2
4 383 3
5 384 4
6 384 2
7 384 5
8 384 3
Business rule: a combination consists of a maximum of 4 subjects (must contain)
and the user is less relevant to a COMB_NAME(name of combinations) but user need
the subjects contained in combinations
i need the following output
COMB_ID COMB_NAME SUBJECT1 SUBJECT2 SUBJECT3 SUBJECT4
383 S1 Biology Chemistry Computer Science Physics
384 S2 Chemistry Computer Science Mathematics Physics
or even this is enough(what i actually needed)
COMB_ID subjects
383 Biology,Chemistry,Computer Science,Physics
384 Chemistry,Computer Science,Mathematics,Physics
you can use any of the COMBINATION table(either (2) or (3))
and i want to know
1)which design is good in this case
(i think SUB_ID1,SUB_ID2,SUB_ID3,SUB_ID4 is not a
good method to link with same table but if 4 subjects only(and must) comes
detail table is not neccessary )
now i am achieving the result by program-coding in C# after getting the rows from oracle
i am using oracle 9i (also ODP.NET)
i want to know how can i get the result in the stored procedure itsef.
2)how it could be designed in any other way.
any help/suggestion is welcome
thanks for your time --PradeeshWell I forgot the table-alias, here now with:
SELECT C.COMB_ID
, C.COMB_NAME
, (SELECT SUB_NAME
FROM SUBJECTS
WHERE SUB_ID = C.SUB_ID1) AS SUBJECT_NAME1
, (SELECT SUB_NAME
FROM SUBJECTS
WHERE SUB_ID = C.SUB_ID2) AS SUBJECT_NAME2
, (SELECT SUB_NAME
FROM SUBJECTS
WHERE SUB_ID = C.SUB_ID3) AS SUBJECT_NAME3
, (SELECT SUB_NAME
FROM SUBJECTS
WHERE SUB_ID = C.SUB_ID4) AS SUBJECT_NAME4
FROM COMBINATION C;
As you need exactly 4 subjects, the columns-solution is just fine I would say. -
Need Help to query Lync Database for User Information
Need Help to Query the lync database to retrieve below user information.
1. SIP Address of the registered user
2. Phone Number configured to the particular account.
3. IP Address
4. Last Logged in time.
I am trying to pull the above information from rtc database for all the registered users. Please let me know if this is possible and it would be great if you can throw some light on what tables to look for the data. Thank You.Hi,
For SIP address and Phone number you can check RTC database.
IP Address:
You can refer to the link below to query IP address:
http://h30499.www3.hp.com/t5/Business-Service-Management-BAC/Monitoring-Lync-with-the-User-Registrations-Viewer-Free-NMC-tool/ba-p/5961497#.UtOU43mIrwo
Note: Microsoft is providing this information as a convenience to you. The sites are not controlled by Microsoft. Microsoft cannot make any representations regarding the quality, safety, or suitability of any software or information found there.
Please make sure that you completely understand the risk before retrieving any suggestions from the above link.
Last Logged in time:
You can refer to the link below:
http://blogs.technet.com/b/dodeitte/archive/2011/05/11/how-to-get-the-last-time-a-user-registered-with-a-front-end.aspx
Best Regards,
Eason Huang
Eason Huang
TechNet Community Support -
I have a dataset like below in two columns ( col1,col2 in table Mytable)
A | ab
A | cd
A | ef
B | xl
B | ik
E | 23
E | op
C | tk
I need a select query which will return first set of every group which I ask for .
For example, if I ask for data for A , B , the select query will return records
A | ab
B | xl
For example, if I ask for data for B ,E the select query will return records..
B | xl
E | 23
For example, if I ask for data for C the select query will return records..
C | tk
How do I write my select query ?Something like this ?
SCOTT@orcl> create table test(col1 varchar2(1),col2 varchar2(2));
Table created.
SCOTT@orcl> insert into test values('A','ab');
1 row created.
SCOTT@orcl> insert into test values('A','cd');
1 row created.
SCOTT@orcl> insert into test values('A','ef');
1 row created.
SCOTT@orcl> insert into test values('B','xl');
1 row created.
SCOTT@orcl> insert into test values('B','ik');
1 row created.
SCOTT@orcl> insert into test values('E','23');
1 row created.
SCOTT@orcl> insert into test values('E','op');
1 row created.
SCOTT@orcl> insert into test values('C','tk');
1 row created.
SCOTT@orcl> commit;
Commit complete.
SCOTT@orcl>
SCOTT@orcl> ed
Wrote file afiedt.buf
1 select * from (
2 select decode(lag(col1) over (order by col1,rownum),null,col1
3 ,col1,null
4 ,col1) col1
5 ,col2
6 from test) aaa
7* where aaa.col1='A'
SCOTT@orcl> /
C CO
A abHTH
Girish Sharma -
Need help in query to have all items in sap with PO data on order, date
Hello Everyone,
I need some help in writing a query to show all items in sap db to have itemcode, itemname, onhand, sellable(onhand-committed), on order, and the delivery date when that time should be received. I need to know what items are regular items, which ones are master and components. For the master I need to have the deliver date of the PO for the component.
I have written this.
SELECT DISTINCT TOP (100) PERCENT T1.ItemCode, SUM(T1.Sellable) AS Sellable, T1.OnOrder, MAX(T1.Docduedate) AS DeliveryDate, T1.WhsCode
FROM (SELECT ItemCode, Sellable, OnOrder, '1/1/1900' AS Docduedate, WhsCode
FROM dbo.V_RAZ_StoreInv
UNION ALL
SELECT TOP (100) PERCENT ItemCode, '0' AS Sellable, Quantity AS Onorder, DocDueDate, WhsCode
FROM dbo.V_RAZ_OPENPOSDATA
ORDER BY ItemCode) AS T1 LEFT OUTER JOIN
dbo.V_RAZ_ItemInfo ON T1.ItemCode = dbo.V_RAZ_ItemInfo.ItemCode
GROUP BY T1.ItemCode, T1.OnOrder, T1.WhsCode, dbo.V_RAZ_ItemInfo.OnHold
HAVING (dbo.V_RAZ_ItemInfo.OnHold = 'n')
ORDER BY T1.ItemCode, T1.WhsCode
and for the v_raz_openposdata I have the following query
SELECT dbo.OPOR.DocNum, dbo.OPOR.DocStatus, dbo.POR1.WhsCode, dbo.POR1.ItemCode, dbo.POR1.Dscription, dbo.POR1.Quantity, dbo.POR1.OpenQty,
dbo.POR1.LineStatus, dbo.OPOR.DocDueDate
FROM dbo.OPOR LEFT OUTER JOIN
dbo.POR1 ON dbo.OPOR.DocEntry = dbo.POR1.DocEntry
WHERE (dbo.OPOR.DocStatus = 'O')
Any help is greatly appreciated.
Right now I do get the delivery date for regular items and components but the master sku for the component all of them have 1/1/1900.
Thank youThank you for replying Gordon. I did not remember I had asked this before. I no longer have access to the other account.
What I need on the query is that I want a list of items with the on order quantity and when we are expecting this order to be received. The receiving date is based on the PO delivery date. The trick here is that I need to Master sku to show the delivery date of the component sku. In my scenario all components have the same delivery date for the Master sku. If there are mulitple delivery dates because each warehouse is getting them on a different date then I want to get the delivery date for that warehouse.
Let me know if this is possible and if yes please guide towards a query for it.
Thank you. -
hi i want to test query in query analyzer befor using in programe.
i need tcode for query analyzer.
thanks in advanced.hi,,
SE30 - gives you a run time analysis and points out the issues more at design time.
ST05 - Is the most useful if you want to track time taken for execution of each of the sections.
SM50 - Will give you a work process overview, not sure at a program level how can it help you.
Some times you will have to use a combination of SE30 and ST05.
I would like to use St05 personally.
rgds
anver
if hlped mark points -
Need help in query to display lot and serial numbers for a Wip Job Component
Hi ALL,
I have a requirement as below.
I need to display lot and serial numbers for a Wip Job Component, i have a xml report in that for each wip job component i need to check whether it is a lot control item or serial control item based on that i need to display some data. so can you please help me to get the query to indentify the lot and serial number for a wip job component.
ThanksThank you for replying Gordon. I did not remember I had asked this before. I no longer have access to the other account.
What I need on the query is that I want a list of items with the on order quantity and when we are expecting this order to be received. The receiving date is based on the PO delivery date. The trick here is that I need to Master sku to show the delivery date of the component sku. In my scenario all components have the same delivery date for the Master sku. If there are mulitple delivery dates because each warehouse is getting them on a different date then I want to get the delivery date for that warehouse.
Let me know if this is possible and if yes please guide towards a query for it.
Thank you. -
Need help with query joining several tables into a single return line
what i have:
tableA:
puid, task
id0, task0
id1, task1
id2, task2
tableB:
puid, seq, state
id0, 0, foo
id0, 1, bar
id0, 2, me
id1, 0, foo
id2, 0, foo
id2, 1, bar
tableC:
puid, seq, date
id0, 0, 12/21
id0, 1, 12/22
id0, 2, 12/22
id1, 0, 12/23
id2, 0, 12/22
id2, 1, 12/23
what i'd like to return:
id0, task0, 12/21, 12/22, 12/22
id1, task1, 12/23, N/A, N/A
id2, task2, 12/22, 12/23, N/A
N/A doesn't mean return the string "N/A"... it just means there was no value, so we don't need anything in this column (null?)
i can get output like below through several joins, however i was hoping to condense each "id" into a single line...
id0, task0, 12/21
id0, task0, 12/22
id0, task0, 12/23
id1, task1, 12/23
is this possible fairly easily?
Edited by: user9979830 on Mar 29, 2011 10:53 AM
Edited by: user9979830 on Mar 29, 2011 10:58 AMHi,
Welcome to the forum!
user9979830 wrote:
what i have:...Thanks for posting that so clearly!
Whenever you have a question, it's even better if you post CREATE TABLE and INSERT statements for your sample data, like this:
CREATE TABLE tablea
( puid VARCHAR2 (5)
, task VARCHAR2 (5)
INSERT INTO tablea (puid, task) VALUES ('id0', 'task0');
INSERT INTO tablea (puid, task) VALUES ('id1', 'task1');
INSERT INTO tablea (puid, task) VALUES ('id2', 'task2');
CREATE TABLE tablec
( puid VARCHAR2 (5)
, seq NUMBER (3)
, dt DATE -- DATE is not a good column name
INSERT INTO tablec (puid, seq, dt) VALUES ('id0', 0, DATE '2010-12-21');
INSERT INTO tablec (puid, seq, dt) VALUES ('id0', 1, DATE '2010-12-22');
INSERT INTO tablec (puid, seq, dt) VALUES ('id0', 2, DATE '2010-12-22');
INSERT INTO tablec (puid, seq, dt) VALUES ('id1', 0, DATE '2010-12-23');
INSERT INTO tablec (puid, seq, dt) VALUES ('id2', 0, DATE '2010-12-22');
INSERT INTO tablec (puid, seq, dt) VALUES ('id2', 1, DATE '2010-12-23');This way, people can re-create the problem and test their ideas.
It doesn't look like tableb plays any role in this problem, so I didn't post it.
Explain how you get the results from that data. For example, why do you want this row in the results:
PUID TASK DT1 DT2 DT3
id0 task0 12/21/2010 12/22/2010 12/22/2010rather than, say
PUID TASK DT1 DT2 DT3
id0 task0 12/22/2010 12/21/2010 12/22/2010? Does 12/21 have to go in the first column because it is the earliest date, or is it because 12/21 is related to the lowest seq value? Or do you even care about the order, just as long as all 3 dates are shown?
Always say what version of Oracle you're uisng. The query below will work in Oracle 9 (and up), but starting in Oracle 11, the SELECT ... PIVOT feature could help you.
i can get output like below through several joins, however i was hoping to condense each "id" into a single line... Condensing the output, so that there's only one line for each puid, sounds like a job for "GROUP BY puid":
WITH got_r_num AS
SELECT puid
, dt
, ROW_NUMBER () OVER ( PARTITION BY puid
ORDER BY seq -- and/or dt
) AS r_num
FROM tablec
-- WHERE ... -- If you need any filtering, put it here
SELECT a.puid
, a.task
, MIN (CASE WHEN r.r_num = 1 THEN r.dt END) AS dt1
, MIN (CASE WHEN r.r_num = 2 THEN r.dt END) AS dt2
, MIN (CASE WHEN r.r_num = 3 THEN r.dt END) AS dt3
, MIN (CASE WHEN r.r_num = 4 THEN r.dt END) AS dt4
FROM tablea a
JOIN got_r_num r ON a.puid = r.puid
GROUP BY a.puid
, a.task
ORDER BY a.puid
;I'm guessing that you want the dates arranged by seq; that is, for each puid, the date related to the lowest seq comes first, regardless of whther that date is the earliest date for that puid or not. If that's not what you need, then change the analytic ORDER BY clause.
This does not assume that the seq values are always consecutive integers (0, 1, 2, ...) for each puid. You can skip, or even duplicate values. However, if the values are always consecutive integers, starting from 0, then you could simplify this. You won't need a sub-query at all; just use seq instead of r_num in the main query.
Here's the output I got from the query above:
PUID TASK DT1 DT2 DT3 DT4
id0 task0 12/21/2010 12/22/2010 12/22/2010
id1 task1 12/23/2010
id2 task2 12/22/2010 12/23/2010As posted, the query will display the first 4 dts for each puid.
If there are fewer than 4 dts for a puid, the query will still work. It will leave some columns NULL at the end.
If there are more than 4 dts for a puid, the query will still work. It will display the first 4, and ignore the others.
There's nothing special about the number 4; you could make it 3, or 5, or 35, but whatever number you choose, you have to hard-code that many columns into the query, and always get that many columns of output.
For various ways to deal with a variable number of pivoted coolumns, see the following thread:
PL/SQL
This question actually doesn't have anything to do with SQL*Plus; it's strictly a SQL question, and SQL questions are best posted on the "SQL and PL/SQL" forum:
PL/SQL
If you're not sure whether a question is more of a SQL question or a SQL*Plus question, then post it on the SQL forum. Many more people pay attention to that forum than to this one. -
I need that this query return only one value
Hi, please. I need your help. I have this query:
SELECT c.charvalue "Comentario", max(pi.id) as "id" --into :gcpe_last_comment
FROM twflprocessinstances pi, twfliprocessparameters c
WHERE pi.id = c.iprocess_id
AND c.param_id = 1002286
AND c.charvalue IS NOT NULL
AND pi.processdef_id = 1600
AND to_number(pi.id) <> 3817940
AND to_number(pi.seeparameter1) =80137377
group by c.charvalue
having max(pi.id)
This query return 3 rows, but I need that this query return only one row. The row that this query should return is the row before at the max id. ThanksMmmm...I don't get it.
You might need to post some sample data and expected results. -
WHEN-TREE-NODE-SELECTED need 2 Execute-Query on Master-Detail data block
I optimize tree using this link
http://andreas.weiden.orcl.over-blog.de/article-29307730.html_+
For huge amount of data (Accountings)
All i need for now is
WHEN-TREE-NODE-SELECTED need 2 Execute-Query on the data block
DECLARE
htree ITEM;
node_value VARCHAR2(100);
BEGIN
IF :SYSTEM.TRIGGER_NODE_SELECTED = 'TRUE' THEN
-- Find the tree itself.
htree := FIND_ITEM ('BL_TREE.IT_TREE');
node_value := FTREE.GET_TREE_NODE_PROPERTY( htree, :SYSTEM.TRIGGER_NODE , ftree.node_value );
GO_BLOCK ('GL_ACCOUNTS');
set_block_property('GL_ACCOUNTS', DEFAULT_WHERE , 'ACCOUNT_ID ='|| node_value );
EXECUTE_QUERY;
END IF;
END;The above code is working fine 4 the detail block which is *'GL_ACCOUNTS'*
when i substitute is Master block which is 'GL_ACCOUNTS_TYPES' it doesn't display all data
Help is Appriciated pls.
Regards,
Abdetu...Hello
In WHEN-TREE-NODE-SELECTED i modified the following code :_
DECLARE
htree ITEM;
node_value VARCHAR2(100);
parent_node FTREE.NODE;
BEGIN
IF :SYSTEM.TRIGGER_NODE_SELECTED = 'TRUE' THEN
-- Find the tree itself.
htree := FIND_ITEM ('BL_TREE.IT_TREE');
-- Get the parent of the node clicked on.
parent_node := FTREE.GET_TREE_NODE_PARENT ( htree, :SYSTEM.TRIGGER_NODE );
GO_BLOCK('GL_TYPES');
set_block_property('GL_TYPES', DEFAULT_WHERE , 'TYPE_ID ='|| parent_node );
EXECUTE_QUERY;
-- Get the detail of the parent node
node_value := FTREE.GET_TREE_NODE_PROPERTY( htree, :SYSTEM.TRIGGER_NODE , ftree.node_value );
GO_BLOCK('GL_ACCOUNTS');
set_block_property('GL_ACCOUNTS', DEFAULT_WHERE , 'ACCOUNT_ID ='|| node_value );
EXECUTE_QUERY;
END IF;
END;
FRM-40350 : Query caused no records to be retrieved but i have records in the data base ...!
Well, Do u think that's because in ur package i retrieve only the detail block ?
Regards,
Abdetu... -
Need a FMS Query on Sales Order!!!!
Dear Experts,
I need a FMS query on SO with Following Conditions...
**Current Stock(UDF @Raw Level)
1.If InStock(as selected warehouse Quantity)>=Ordered Quantity Then Current stock Field should be taken Ordered Quantity.
2.If InStock< Ordered quantity Then Current stock should be taken InStock Quantity
Please provide me same...
Thanks in advance...Hi Param,
Assign the following FMS to the row level UDF 'Current Stock'.
Declare @a varchar(50)
declare @b VARCHAR(50)
declare @e varchar(50)
declare @c integer
declare @d integer
set @b = (select $[RDR1.ItemCode])
set @e = (select $[RDR1.WhsCode])
SET @c = (select onhand from OITW where ItemCode = @b AND WhsCode = @e)
set @d = (select OnOrder from OITW where ItemCode = @b AND WhsCode = @e)
IF @c>=@d
Begin
set @a=@d
select @a
End
ELSE IF @c<@d
BEGIN
set @a=@c
select @a
End
Regards
Sattanatha Raja -
Hi,
I need some help in performing tuning of a big query. Explain plan is as under:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
Edited by: AbdulHadi on Sep 16, 2011 3:56 PM
Edited by: AHadi on Sep 19, 2011 10:02 AM3 SORT GROUP BY 47916 25M 491G 15M (3) 17:30:31
4 VIEW 870M 445G 15M (2) 17:24:08
5 HASH GROUP BY 870M 427G 885G 15M (2) 17:24:08
In above steps its using very high temporary tablespace usage. please try to tune your query.
- dynamic sampling used for this statement
The statistics appears to be stale. -
Need help th tuning query or re write the query--
Hi,
Need help to tune the below query or rewrite th query for reducing the execution time Please find the query and explain plan.
QUERY
explain plan FOR SELECT consumer_key,product_key,days_in_product,20100201 period_key FROM
(SELECT consumer_key,
product_key,
days_in_product,
row_number() over ( Partition BY consumer_key order by Days_in_product DESC) row_num
FROM
(SELECT consumer_key,
product_key,
SUM(no_ofdays) days_in_product
FROM
(SELECT pcv.consumer_key,
pcv.product_key,
pcv.product_consumer_valid_from,
pcv.product_consumer_valid_to,
DECODE (SIGN(20100201000000-product_consumer_valid_from),1,20100201000000,product_consumer_valid_from) period_start,
DECODE (SIGN(20100228235959-product_consumer_valid_to),1,product_consumer_valid_to,20100228235959) period_end,
CASE
WHEN to_number(TO_CHAR(cd.activation_date,'YYYYMMDDHH24MISS')) BETWEEN 20100201000000 AND 20100228235959
AND activation_date > to_Date(product_consumer_valid_to,'YYYYMMDDHH24MISS')
THEN 0
WHEN to_number(TO_CHAR(cd.activation_date,'YYYYMMDDHH24MISS')) BETWEEN 20100201000000 AND 20100228235959
AND activation_date BETWEEN to_Date(product_consumer_valid_from,'YYYYMMDDHH24MISS') AND to_Date(product_consumer_valid_to,'YYYYMMDDHH24MISS')
THEN
--to_char(activation_date,'MON-YYYY')='PERIOD_ACTIVE' and activation_date >= to_Date(product_consumer_valid_from,'YYYYMMDDHH24MISS') then
(to_date(DECODE (SIGN(20100228235959-product_consumer_valid_to),1,product_consumer_valid_to,20100228235959),'YYYYMMDDHH24MISS') - to_date(TO_CHAR(activation_date,'YYYYMMDDHH24MISS'),'YYYYMMDDHH24MISS') )
WHEN to_number(TO_CHAR(cd.activation_date,'YYYYMMDDHH24MISS')) < 20100201000000
THEN (to_date(DECODE (SIGN(20100228235959-product_consumer_valid_to),1,product_consumer_valid_to,20100228235959),'YYYYMMDDHH24MISS') - to_Date(DECODE (SIGN(20100201000000-product_consumer_valid_from),1,20100201000000,product_consumer_valid_from),'YYYYMMDDHH24MISS') )
WHEN to_number(TO_CHAR(cd.activation_date,'YYYYMMDDHH24MISS')) > 20100228235959
THEN 0
ELSE
--unusual situation
(to_date(DECODE (SIGN(20100228235959-product_consumer_valid_to),1,product_consumer_valid_to,20100228235959),'YYYYMMDDHH24MISS') - to_Date(DECODE (SIGN(20100201000000-product_consumer_valid_from),1,20100201000000,product_consumer_valid_from),'YYYYMMDDHH24MISS') )
END No_ofDays
FROM cimtran.product_consumer_validity pcv,
consumer_dimension cd
WHERE pcv.consumer_key =cd.consumer_key
AND product_consumer_valid_to >= 20100201000000
AND product_consumer_valid_from <= 20100228235959
--and product_consumer_valid_from > '20090801000000'
ORDER BY consumer_key,
product_key,
product_consumer_valid_from
) a
GROUP BY consumer_key,
product_key
ORDER BY consumer_key,
product_key
) WHERE row_num=1 ;EXPLAIN PLAN
"PLAN_TABLE_OUTPUT"
"Plan hash value: 3823907703"
"| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |"
"| 0 | SELECT STATEMENT | | 4665K| 231M| | 133K (1)| 00:31:08 |"
"|* 1 | VIEW | | 4665K| 231M| | 133K (1)| 00:31:08 |"
"|* 2 | WINDOW SORT PUSHED RANK| | 4665K| 173M| 232M| 133K (1)| 00:31:08 |"
"| 3 | VIEW | | 4665K| 173M| | 104K (1)| 00:24:18 |"
"| 4 | SORT GROUP BY | | 4665K| 182M| 729M| 104K (1)| 00:24:18 |"
"|* 5 | HASH JOIN | | 13M| 533M| 65M| 44241 (1)| 00:10:20 |"
"| 6 | TABLE ACCESS FULL | CONSUMER_DIMENSION | 2657K| 35M| | 4337 (1)| 00:01:01 |"
"|* 7 | TABLE ACCESS FULL | PRODUCT_CONSUMER_VALIDITY | 13M| 351M| | 15340 (2)| 00:03:35 |"
"Predicate Information (identified by operation id):"
" 1 - filter(""ROW_NUM""=1)"
" 2 - filter(ROW_NUMBER() OVER ( PARTITION BY ""CONSUMER_KEY"" ORDER BY "
" INTERNAL_FUNCTION(""DAYS_IN_PRODUCT"") DESC )<=1)"
" 5 - access(""PCV"".""CONSUMER_KEY""=""CD"".""CONSUMER_KEY"")"
" 7 - filter(""PRODUCT_CONSUMER_VALID_FROM""<=20100228235959 AND "
" ""PRODUCT_CONSUMER_VALID_TO"">=20100201000000)"I doubt that this query can be tuned without using indexes. There is a lot of unnecessary work specified in your query, like unnecessary intermediate sorting and selecting unused columns. The cost based optimizer recognized it and skips some of that unnecessary work, it seems. For clarity's sake, I would rewrite your query like below. Note that the query is untested:
select consumer_key
, max(product_key) keep (dense_rank last order by days_in_product) product_key
, max(days_in_product) days_in_product
, 20100201 period_key
from ( select pcv.consumer_key
, pcv.product_key
, sum
( case
when to_number(to_char(cd.activation_date,'yyyymmddhh24miss')) between 20100201000000 and 20100228235959
then
case
when cd.activation_date > to_date(pcv.product_consumer_valid_to,'yyyymmddhh24miss')
then
0
when cd.activation_date between to_date(pcv.product_consumer_valid_from,'yyyymmddhh24miss') and to_date(product_consumer_valid_to,'yyyymmddhh24miss')
then
to_date(to_char(pcv.product_consumer_valid_to),'yyyymmddhh24miss'))
- to_date(to_char(activation_date,'yyyymmddhh24miss'),'yyyymmddhh24miss')
end
when to_number(to_char(cd.activation_date,'yyyymmddhh24miss')) < 20100201000000
then
to_date(to_char(pcv.product_consumer_valid_to),'yyyymmddhh24miss'))
- to_date(to_char(pcv.product_consumer_valid_from),'yyyymmddhh24miss'))
when to_number(to_char(cd.activation_date,'yyyymmddhh24miss')) > 20100228235959
then
0
end
) days_in_product
from cimtran.product_consumer_validity pcv
, consumer_dimension cd
where pcv.consumer_key = cd.consumer_key
and product_consumer_valid_to >= 20100201000000
and product_consumer_valid_from <= 20100228235959
group by consumer_key
, product_key
group by consumer_keyRegards,
Rob.
Maybe you are looking for
-
Need to create Stock order on creation of Delivery
A business requirement - to create Stock transport order using ME21N after a delivery is created by tcode VL01N depending on few conditions. Is there a user exit which can be utilised for achieving this, Any body have a andwer, plz reply
-
Replaced an asset and now project won't open
I was finishing up some subtitles when I noticed an audio problem that needed to be corrected. So I saved my DVDSP4 project, quit the program, then made a quick audio cut in FCP. The amount of audio cut was less than a second. And because I cut my au
-
To import a .jar file in NWDS 7.0
Hi All, I have to establish connection between NWDS 7.0 and MDM . Therefore, I want some .jar files to be used in my application. But, I am unable to include them. Have tried a lot of threads but still am unable to include them. Please help me. Thank
-
How To Modify Interactive Report Search Input?
Hello All, I am running version 3.2 and attempting to modify (validate) the search input value on an interactive report. For example, after a user enters a string in the search textbox, I want to strip any space characters from the string and perform
-
Unable to view in line images embedded in forum messages
Using Firefox 4.01 on win 7 - 64 Viewing a Yahoo forum message the in line images are not visible to me but other users do see them (do not know which browser they use) I can see the images as attachments - just not when embedded in the message body