0

データ ウェアハウスには多くのスター スキーマがあります。データの SQL 分析を簡素化するために、ビューを作成できると考えました。

利益と損失の星の SQL の例:

select
    month_number,
    sum(amount)
from 
    bizdata.dw_daily_pl_fact dwdpf
    join bizdata.dw_distance dwdis on (dwdis.distance_key= dwdpf.distance_key)
    join bizdata.dw_ledger_account dwled on (dwled.ledger_account_key= dwdpf.ledger_account_key)
    join bizdata.dw_party dwpar on (dwpar.party_key= dwdpf.company_key)
    join bizdata.dw_party dwpar2 on (dwpar2.party_key= dwdpf.supplier_key)
    join bizdata.dw_budget_code dwbud on (dwbud.budget_code_key= dwdpf.budget_code_key)
    join bizdata.dw_time dwtim on (dwtim.time_key= dwdpf.time_key)
    join bizdata.dw_project dwpro on (dwpro.project_key= dwdpf.project_key)
where
    year_number = 2012
    and budget_code = 'SALARIES'
group by
    month_number

(この星には約 200 列と 100k 行があります)

ビューがある場合:

create or replace view bizdata.dwv_pl_fact as (
select
    *
from 
    bizdata.dw_daily_pl_fact dwdpf
    join bizdata.dw_distance dwdis on (dwdis.distance_key= dwdpf.distance_key)
    join bizdata.dw_ledger_account dwled on (dwled.ledger_account_key= dwdpf.ledger_account_key)
    join bizdata.dw_party dwpar on (dwpar.party_key= dwdpf.company_key)
    join bizdata.dw_party dwpar2 on (dwpar2.party_key= dwdpf.supplier_key)
    join bizdata.dw_budget_code dwbud on (dwbud.budget_code_key= dwdpf.budget_code_key)
    join bizdata.dw_time dwtim on (dwtim.time_key= dwdpf.time_key)
    join bizdata.dw_project dwpro on (dwpro.project_key= dwdpf.project_key)
);

ステートメントを次のように簡略化できます。

select
    month_number,
    sum(amount)
from 
    bizdata.dwv_pl_fact
where
    year_number = 2012
    and budget_code = 'SALARIES'
group by
    month_number

私の質問は - そのようなアプローチでパフォーマンスやその他の問題はありますか?

4

2 に答える 2

1

PostgreSQL のビューは単なるクエリ書き換えメカニズムです。したがって、基本的に、ユーザーが指定した条件がビューの定義にマージされ、結果のクエリが実行されると想定できます。

9.0 以降、プランナーは、結果のクエリの一部の結合が不要であることに気付き、それらをスキップする必要があります。それはあなたの場合に特に役立つようです。

ただし、一部の基準がビュー定義の「内部」句にプッシュされない可能性があります。これらは、サブクエリで表示される場合と同じです。たとえば、order-by + limit を使用したサブクエリは、プランナーが見通せない境界を提示できます。

HTH

于 2013-01-18T11:39:02.207 に答える
0

あなたは環境について言及していません。一般的なモデルでは、あなたのアプローチは問題ないように見えますが、1 つの重要な点を見逃しています。そのビューにすべての列を表示していることに注意してください。数百の列があり、行チェーンがある場合、それは悪夢になります。したがって、クエリを書き直して、次のようにビュー (dwv_plk_fact) を構築すれば問題ありません。

create or replace view bizdata.dwv_pl_fact as (
select
    <table_name>.month_number,
    <table_name>.amount
from 
    bizdata.dw_daily_pl_fact dwdpf
    join bizdata.dw_distance dwdis on (dwdis.distance_key= dwdpf.distance_key)
    join bizdata.dw_ledger_account dwled on (dwled.ledger_account_key= dwdpf.ledger_account_key)
    join bizdata.dw_party dwpar on (dwpar.party_key= dwdpf.company_key)
    join bizdata.dw_party dwpar2 on (dwpar2.party_key= dwdpf.supplier_key)
    join bizdata.dw_budget_code dwbud on (dwbud.budget_code_key= dwdpf.budget_code_key)
    join bizdata.dw_time dwtim on (dwtim.time_key= dwdpf.time_key)
    join bizdata.dw_project dwpro on (dwpro.project_key= dwdpf.project_key)
);
于 2013-01-21T23:26:38.033 に答える