Doubt in rewriting SQL
Date: Thu, 25 Sep 2008 21:33:01 +0530
Message-ID: <607321dc0809250903o6d3114cakfa1f6b86d499bdc2@mail.gmail.com>
Hi,I have a query which is performing bad and am trying to rewrite it.
This is the existing Query
SELECT substr(ppf.employee_number,1,10) employee_number,
substr(paf.assignment_number,1,12) assignment_number,
substr(ppf.full_name,1,50) full_name,
decode(ppf.employee_number,lag(ppf.employee_number) over
(order by paf.assignment_number), 0,1) emp_count,
1 assignment_count,
(SELECT hrl.meaning
FROM hr_lookups hrl
WHERE hrl.lookup_type = 'EMP_CAT'
AND hrl.enabled_flag = 'Y'
AND hrl.lookup_code = paf.employment_category) employment_category FROM per_time_periods ptp
,per_assignments_f paf
,per_people_f ppf
,(SELECT paa.assignment_id
FROM per_time_periods ptp
,pay_payroll_actions ppa
,pay_assignment_actions paa
WHERE ptp.time_period_id = 386582
AND ppa.action_type IN ('Q', 'R','V')
AND ppa.action_status = 'C'
AND ppa.payroll_id = 1119
AND ppa.date_earned between ptp.start_date and
ptp.end_date
AND ppa.payroll_action_id = paa.payroll_action_id
AND paa.run_type_id IS NULL) paid
WHERE paf.payroll_id = 1119
AND ptp.time_period_id = 386582
AND ptp.end_date BETWEEN paf.effective_start_date AND
paf.effective_end_date
AND paf.assignment_id = paid.assignment_id(+)
AND paid.assignment_id IS NULL
AND paf.person_id = ppf.person_id
AND paf.assignment_type = 'E'
AND ptp.end_date BETWEEN ppf.effective_start_date AND
ppf.effective_end_date
order by 1,2
I am rewriting it as
SELECT substr(ppf.employee_number,1,10) employee_number,
substr(paf.assignment_number,1,12) assignment_number,
substr(ppf.full_name,1,50) full_name,
decode(ppf.employee_number,lag(ppf.employee_number) over
(order by paf.assignment_number), 0,1) emp_count,
1 assignment_count,
(SELECT hrl.meaning
FROM hr_lookups hrl
WHERE hrl.lookup_type = 'EMP_CAT'
AND hrl.enabled_flag = 'Y'
AND hrl.lookup_code = paf.employment_category) employment_category FROM per_time_periods ptp
,per_assignments_f paf
,per_people_f ppf
WHERE paf.payroll_id = 1119
AND ptp.time_period_id = 386582
AND ptp.end_date BETWEEN paf.effective_start_date AND
paf.effective_end_date
/*AND paf.assignment_id = paid.assignment_id(+)
AND paid.assignment_id IS NULL*/
AND NOT exists (SELECT paa.assignment_id
FROM per_time_periods ptp
,pay_payroll_actions ppa
,pay_assignment_actions paa
WHERE ptp.time_period_id = 386582
AND ppa.action_type IN ('Q', 'R','V')
AND ppa.action_status = 'C'
AND ppa.payroll_id = 1119
AND ppa.date_earned between ptp.start_date and
ptp.end_date
AND ppa.payroll_action_id = paa.payroll_action_id
AND paa.run_type_id IS NULL)
AND paf.person_id = ppf.person_id
AND paf.assignment_type = 'E'
AND ptp.end_date BETWEEN ppf.effective_start_date AND
ppf.effective_end_date
order by 1,2
I am moving the inline View 'Paid' to the where clause.
I have two doubts here.
1- Are both the queries equivalent? (I am not able to test this query with
live data as of now so that i could confirm if both are equivalent using the
results fetched)
2-Though I see a little reduction in the Cost when Explained, Still I
am skeptic how it would perform in the Customer site
Please let me know if I am making any grave mistake :)
-- Thanks, Dwarak.K -- http://www.freelists.org/webpage/oracle-lReceived on Thu Sep 25 2008 - 11:03:01 CDT
