MT#11509 Optimize query

Further optimization described in the ticket.

Change-Id: Ie559a888a0e7fb8ed3ffc470349a2faab1b894ab
changes/49/3949/1
Irina Peshinskaya 10 years ago committed by Kirill Solomko
parent 74f02786b7
commit ee0577e11b

@ -25,28 +25,31 @@ my $o = Sipwise::Provisioning::Billing->new();
my $db = $o->{database};
my $a = $db->sql_get_all_arrayref(<<"!");
SELECT 'profile_limit' as type, cdr.source_account_id, SUM(cdr.source_customer_cost) AS daily_cost,
contracts.id,
billing_profiles.fraud_daily_limit, billing_profiles.fraud_daily_lock, billing_profiles.fraud_daily_notify
FROM accounting.cdr
JOIN billing.contracts ON cdr.source_account_id = contracts.id
JOIN billing.billing_mappings ON contracts.id = billing_mappings.contract_id
JOIN billing.billing_profiles
ON (billing_profiles.id =
(SELECT m.billing_profile_id
FROM billing.billing_mappings m
WHERE ((m.start_date IS NULL) OR (m.start_date <= NOW()))
AND ((m.end_date IS NULL) OR (m.end_date >= NOW()))
AND (m.contract_id = contracts.id)
ORDER BY m.start_date DESC LIMIT 1
)
SELECT 'profile_limit' as type, cdr.source_account_id, SUM(cdr.source_customer_cost) AS daily_cost, bpinfo.contract_id,
bpinfo.fraud_daily_limit, bpinfo.fraud_daily_lock, bpinfo.fraud_daily_notify
FROM (
SELECT contracts.id as contract_id,
billing_profiles.fraud_daily_limit, billing_profiles.fraud_daily_lock, billing_profiles.fraud_daily_notify
FROM billing.contracts
JOIN billing.billing_mappings ON contracts.id = billing_mappings.contract_id
JOIN billing.billing_profiles
ON (billing_profiles.id =
(SELECT m.billing_profile_id
FROM billing.billing_mappings m
WHERE ((m.start_date IS NULL) OR (m.start_date <= NOW()))
AND ((m.end_date IS NULL) OR (m.end_date >= NOW()))
AND (m.contract_id = contracts.id)
ORDER BY m.start_date DESC LIMIT 1
)
WHERE (contracts.status = 'active')
AND (DATEDIFF(FROM_UNIXTIME(cdr.start_time), CURDATE()) = 0)
AND (billing_profiles.fraud_daily_limit IS NOT NULL)
AND (billing_profiles.fraud_daily_limit > 0)
)
WHERE (contracts.status = 'active')
AND (billing_profiles.fraud_daily_limit IS NOT NULL)
AND (billing_profiles.fraud_daily_limit > 0)
) as bpinfo
JOIN accounting.cdr ON cdr.source_account_id = bpinfo.contract_id
WHERE (DATEDIFF(FROM_UNIXTIME(cdr.start_time), CURDATE()) = 0)
GROUP BY cdr.source_account_id
HAVING (daily_cost > billing_profiles.fraud_daily_limit)
HAVING (daily_cost > bpinfo.fraud_daily_limit)
UNION ALL

Loading…
Cancel
Save