From ee0577e11bd10c16bd3d3f1b7d46f0bb33788921 Mon Sep 17 00:00:00 2001 From: Irina Peshinskaya <ipeshinskaya@sipwise.com> Date: Wed, 18 Feb 2015 15:55:25 +0200 Subject: [PATCH] MT#11509 Optimize query Further optimization described in the ticket. Change-Id: Ie559a888a0e7fb8ed3ffc470349a2faab1b894ab --- bin/ngcp-fraud-daily-lock | 43 +++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/bin/ngcp-fraud-daily-lock b/bin/ngcp-fraud-daily-lock index f90402c..9062692 100755 --- a/bin/ngcp-fraud-daily-lock +++ b/bin/ngcp-fraud-daily-lock @@ -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