クエリを最適化するための助けが必要です。Oracleクエリの最適化:列全体の合計
accounttype1は、アカウントIDが「2000」と言う含まれており、accounttype1は、アカウントIDが含まれている場合、対応する値は、chargeamount1である場合、私は多くのアカウントの種類の列と対応する値
を持つテーブルを持っています「2500」とし、対応する値はchargeamount2などにあります。
私は、対応するchargeamountの値を合計することによって、すべてのアカウントの種類の列にわたって指定したアカウントの種類の合計を取得する必要があります。以下に示すように、私は...機能でこれを達成しようとしてい
select msisdn,
fn_get_acc_amount ('2000', accounttype1, chargeamount1, accounttype1_a, chargeamount1_a, accounttype2, chargeamount2, accounttype2_a,
chargeamount2_a,accounttype3, chargeamount3,accounttype3_a,chargeamount3_a
)data_account_4508_usage
from data_cdr partition (p20160521)
機能:
これが実行され、値を返す...しかし、作成したり、挿入した私のIDEに
CREATE OR REPLACE function fn_get_acc_amount(p_account varchar2,
p_accounttype1 varchar2, p_chargeamount1 varchar2,p_accounttype1_a varchar2, p_chargeamount1_a varchar2,
p_accounttype2 varchar2, p_chargeamount2 varchar2,p_accounttype2_a varchar2, p_chargeamount2_a varchar2,
p_accounttype3 varchar2, p_chargeamount3 varchar2,p_accounttype3_a varchar2, p_chargeamount3_a varchar2)
return number as
v_accum number := 0;
begin
if p_accounttype1 = p_account then
v_accum := v_accum + to_number(nvl(p_chargeamount1,0));
end if;
if p_accounttype1_a = p_account then
v_accum := v_accum + to_number(nvl(p_chargeamount1_a,0));
end if;
if p_accounttype2 = p_account then
v_accum := v_accum + to_number(nvl(p_chargeamount2,0));
end if;
if p_accounttype2_a = p_account then
v_accum := v_accum + to_number(nvl(p_chargeamount2_a,0));
end if;
if p_accounttype3 = p_account then
v_accum := v_accum + to_number(nvl(p_chargeamount3,0));
end if;
if p_accounttype3_a = p_account then
v_accum := v_accum + to_number(nvl(p_chargeamount3_a,0));
end if;
return nvl(v_accum,0);
end;
/
表data_cdrには約3,000万レコードがあるため、別の表への出力はこれまで以上に必要です。それはまだ永遠に実行されている
CREATE OR REPLACE function fn_get_acc_amount(
p_account varchar2,
p_accounttype1 varchar2, p_chargeamount1 varchar2,p_accounttype1_a varchar2, p_chargeamount1_a varchar2,
p_accounttype2 varchar2, p_chargeamount2 varchar2,p_accounttype2_a varchar2, p_chargeamount2_a varchar2,
p_accounttype3 varchar2, p_chargeamount3 varchar2,p_accounttype3_a varchar2, p_chargeamount3_a varchar2)
return number
result_cache
is
v_accum number;
v_sql varchar2 (4000);
begin
v_accum :=0;
v_sql:='with acc_table as
(
select :1 accounttype, nvl(:2,0) chargeamount from dual union all
select :3, nvl (:4,0) from dual union all
select :5, nvl (:6,0) from dual union all
select :7, nvl (:8,0) from dual union all
select :9, nvl (:10,0) from dual union all
select :11, nvl (:12,0) from dual
)
select sum(chargeamount) from acc_table
where accounttype ='||p_account;
execute immediate v_sql into v_accum
using p_accounttype1 , p_chargeamount1 ,p_accounttype1_a , p_chargeamount1_a ,
p_accounttype2 , p_chargeamount2 ,p_accounttype2_a , p_chargeamount2_a ,
p_accounttype3 , p_chargeamount3 ,p_accounttype3_a , p_chargeamount3_a ;
return nvl(v_accum,0);
end;
/
:
は、以下の機能を最適化する私の試みです。 私はこれを最適化することができるという提案が必要です。私は、ピボットクエリを探してみましたが、私はそれを動作させることができませんでした。私が得ることができるどんな洞察にも感謝します。
は
これは私にとってあなたがしたことがちょうど1つの勘定科目勘定(2000)のためであるかのように、私は本当に切れません...私は15勘定まで行う必要があります....別のサブクエリを取得し、後でmsisdnにすべて参加する必要がありますか? – Oxax
@Oxax IN(#、#...)を使用することができます –