2013-01-18 74 views
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列和10万行的这颗星)

如果我有一个观点:

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 

我的问题是 - 这种方法是否存在性能问题或其他问题?

+0

使用EXPLAIN和EXPLAIN ANALYZE查看任何差异。如果有的话。 –

+0

@FrankHeikens对于这种情况,没有区别。但我不确定这在所有情况下都是如此。 –

回答

1

PostgreSQL中的视图只是一个查询重写机制。所以你基本上可以假设你的用户提供的条件被合并到视图的定义中,并且结果查询得到运行。

从9.0开始,规划人员甚至应该注意到生成的查询中的一些连接是不必要的,并跳过它们。这在你的情况下似乎特别有用。

但是,有些标准可能不会推入视图定义中的“内部”子句 - 这些可能与您在子查询中看到的相同。例如,具有order-by + limit的子查询可以呈现策划者无法看到的边界。

HTH

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) 
); 
+0

我很抱歉,但我不明白你的意思。你能以某种方式改善你的答案吗?我们在postgres上(请注意我的问题下面的标签) –

相关问题