从数据仓库中的星型模式创建视图

时间:2013-01-18 10:47:51

标签: sql postgresql data-warehouse

我们的数据仓库中有很多星型模式。我以为我可以创建视图以简化数据的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

我的问题是 - 这种方法有任何表现或其他问题吗?

1 个答案:

答案 0 :(得分:0)

您没有提及环境问题。在通用模型中,您的方法似乎没问题,但您错过了一个重点。请记住,您将在该视图中显示所有列。如果有100列并且有一个行链,那将是噩梦。所以重写查询并构建视图(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)
);