vensali
asked on
MySql Qry performance (Ver 5.5.17)
I have the following qry to get the amont & tax where unit_is_pharmacy = 1
Scenario 1
SELECT SUM(Amount),SUM(tax)
FROM
(
SELECT unit_code,unit_is_pharmacy ,SUM(IF(ba d_payer_ty pe = 'A', 0, bad_gross_amt-bad_package_ amt - (IF(bah_tran_type = 40103,-1 * IFNULL(ROUND((issd_gross_a mt-(issd_g ross_amt*i ssd_gross_ amt)/(issd _gross_amt *issd_sale _tax_perc/ 100+issd_g ross_amt)) , 3),0),IFNULL(ROUND((issd_g ross_amt-( issd_gross _amt*issd_ gross_amt) /(issd_gro ss_amt*iss d_sale_tax _perc/100+ issd_gross _amt)), 3),0))))) amount,
SUM(IF(bad_payer_type='N', IF(bah_tra n_type = 40103,-1 * ROUND((issd_gross_amt-(iss d_gross_am t*issd_gro ss_amt)/(i ssd_gross_ amt*issd_s ale_tax_pe rc/100+iss d_gross_am t)), 3),ROUND((issd_gross_amt-( issd_gross _amt*issd_ gross_amt) /(issd_gro ss_amt*iss d_sale_tax _perc/100+ issd_gross _amt)), 3)),0)) tax
FROM
bill_accounting_details
JOIN bill_accounting_header ON bah_rid = bad_bah_rid
JOIN bill_header ON (bad_bd_bill_rid = bill_rid)
LEFT JOIN pharmacy_issue_d ON bad_order_rid = issd_rid AND bad_charge_type IN ('D','M')
LEFT JOIN pharmacy_issue_h ON (issh_rid = issd_issh_rid)
LEFT JOIN u_unit drugprocessingunit ON (drugprocessingunit.unit_r id = issh_location_rid AND unit_is_pharmacy= 1 )
WHERE bah_effective_date BETWEEN '2016-07-01' AND '2016-07-31'
AND bah_entity_rid = 4 AND bah_category = 'R'
GROUP BY unit_code,unit_is_pharmacy
) a
WHERE unit_is_pharmacy = 1
This qry runs pretty fast < 2 sec
Scenario 2
But the same qry written as below takes ages
SELECT unit_code,unit_is_pharmacy ,SUM(IF(ba d_payer_ty pe = 'A', 0, bad_gross_amt-bad_package_ amt - (IF(bah_tran_type = 40103,-1 * IFNULL(ROUND((issd_gross_a mt-(issd_g ross_amt*i ssd_gross_ amt)/(issd _gross_amt *issd_sale _tax_perc/ 100+issd_g ross_amt)) , 3),0),IFNULL(ROUND((issd_g ross_amt-( issd_gross _amt*issd_ gross_amt) /(issd_gro ss_amt*iss d_sale_tax _perc/100+ issd_gross _amt)), 3),0))))) amount,
SUM(IF(bad_payer_type='N', IF(bah_tra n_type = 40103,-1 * ROUND((issd_gross_amt-(iss d_gross_am t*issd_gro ss_amt)/(i ssd_gross_ amt*issd_s ale_tax_pe rc/100+iss d_gross_am t)), 3),ROUND((issd_gross_amt-( issd_gross _amt*issd_ gross_amt) /(issd_gro ss_amt*iss d_sale_tax _perc/100+ issd_gross _amt)), 3)),0)) tax
FROM
bill_accounting_details
JOIN bill_accounting_header ON bah_rid = bad_bah_rid
JOIN bill_header ON (bad_bd_bill_rid = bill_rid)
LEFT JOIN pharmacy_issue_d ON bad_order_rid = issd_rid AND bad_charge_type IN ('D','M')
LEFT JOIN pharmacy_issue_h ON (issh_rid = issd_issh_rid)
LEFT JOIN u_unit drugprocessingunit ON (drugprocessingunit.unit_r id = issh_location_rid AND unit_is_pharmacy= 1 )
WHERE bah_effective_date BETWEEN '2016-07-01' AND '2016-07-31'
AND bah_entity_rid = 4 AND bah_category = 'R' AND unit_is_pharmacy= 1
GROUP BY unit_code,unit_is_pharmacy
Or
SELECT unit_code,unit_is_pharmacy ,SUM(IF(ba d_payer_ty pe = 'A', 0, bad_gross_amt-bad_package_ amt - (IF(bah_tran_type = 40103,-1 * IFNULL(ROUND((issd_gross_a mt-(issd_g ross_amt*i ssd_gross_ amt)/(issd _gross_amt *issd_sale _tax_perc/ 100+issd_g ross_amt)) , 3),0),IFNULL(ROUND((issd_g ross_amt-( issd_gross _amt*issd_ gross_amt) /(issd_gro ss_amt*iss d_sale_tax _perc/100+ issd_gross _amt)), 3),0))))) amount,
SUM(IF(bad_payer_type='N', IF(bah_tra n_type = 40103,-1 * ROUND((issd_gross_amt-(iss d_gross_am t*issd_gro ss_amt)/(i ssd_gross_ amt*issd_s ale_tax_pe rc/100+iss d_gross_am t)), 3),ROUND((issd_gross_amt-( issd_gross _amt*issd_ gross_amt) /(issd_gro ss_amt*iss d_sale_tax _perc/100+ issd_gross _amt)), 3)),0)) tax
FROM
bill_accounting_details
JOIN bill_accounting_header ON bah_rid = bad_bah_rid
JOIN bill_header ON (bad_bd_bill_rid = bill_rid)
LEFT JOIN pharmacy_issue_d ON bad_order_rid = issd_rid AND bad_charge_type IN ('D','M')
LEFT JOIN pharmacy_issue_h ON (issh_rid = issd_issh_rid)
JOIN u_unit drugprocessingunit ON (drugprocessingunit.unit_r id = issh_location_rid AND unit_is_pharmacy= 1 )
WHERE bah_effective_date BETWEEN '2016-07-01' AND '2016-07-31'
AND bah_entity_rid = 4 AND bah_category = 'R'
GROUP BY unit_code,unit_is_pharmacy
I ran the explain Select - and the o/p is enclosed for each scenario.
Request an expert to explain the difference in the qry performance.
Explain-Qry-op-mysql.xlsx
Scenario 1
SELECT SUM(Amount),SUM(tax)
FROM
(
SELECT unit_code,unit_is_pharmacy
SUM(IF(bad_payer_type='N',
FROM
bill_accounting_details
JOIN bill_accounting_header ON bah_rid = bad_bah_rid
JOIN bill_header ON (bad_bd_bill_rid = bill_rid)
LEFT JOIN pharmacy_issue_d ON bad_order_rid = issd_rid AND bad_charge_type IN ('D','M')
LEFT JOIN pharmacy_issue_h ON (issh_rid = issd_issh_rid)
LEFT JOIN u_unit drugprocessingunit ON (drugprocessingunit.unit_r
WHERE bah_effective_date BETWEEN '2016-07-01' AND '2016-07-31'
AND bah_entity_rid = 4 AND bah_category = 'R'
GROUP BY unit_code,unit_is_pharmacy
) a
WHERE unit_is_pharmacy = 1
This qry runs pretty fast < 2 sec
Scenario 2
But the same qry written as below takes ages
SELECT unit_code,unit_is_pharmacy
SUM(IF(bad_payer_type='N',
FROM
bill_accounting_details
JOIN bill_accounting_header ON bah_rid = bad_bah_rid
JOIN bill_header ON (bad_bd_bill_rid = bill_rid)
LEFT JOIN pharmacy_issue_d ON bad_order_rid = issd_rid AND bad_charge_type IN ('D','M')
LEFT JOIN pharmacy_issue_h ON (issh_rid = issd_issh_rid)
LEFT JOIN u_unit drugprocessingunit ON (drugprocessingunit.unit_r
WHERE bah_effective_date BETWEEN '2016-07-01' AND '2016-07-31'
AND bah_entity_rid = 4 AND bah_category = 'R' AND unit_is_pharmacy= 1
GROUP BY unit_code,unit_is_pharmacy
Or
SELECT unit_code,unit_is_pharmacy
SUM(IF(bad_payer_type='N',
FROM
bill_accounting_details
JOIN bill_accounting_header ON bah_rid = bad_bah_rid
JOIN bill_header ON (bad_bd_bill_rid = bill_rid)
LEFT JOIN pharmacy_issue_d ON bad_order_rid = issd_rid AND bad_charge_type IN ('D','M')
LEFT JOIN pharmacy_issue_h ON (issh_rid = issd_issh_rid)
JOIN u_unit drugprocessingunit ON (drugprocessingunit.unit_r
WHERE bah_effective_date BETWEEN '2016-07-01' AND '2016-07-31'
AND bah_entity_rid = 4 AND bah_category = 'R'
GROUP BY unit_code,unit_is_pharmacy
I ran the explain Select - and the o/p is enclosed for each scenario.
Request an expert to explain the difference in the qry performance.
Explain-Qry-op-mysql.xlsx
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.