【问题标题】:Creating views from star schema in data warehouse在数据仓库中从星型模式创建视图
【发布时间】:2013-01-18 10:47:51
【问题描述】:

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

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

【问题讨论】:

  • 使用 EXPLAIN 和 EXPLAIN ANALYZE 查看任何差异。如果有的话。
  • @FrankHeikens 对于这种情况,没有区别。但是我不确定这是否适用于所有情况。

标签: sql postgresql data-warehouse


【解决方案1】:

PostgreSQL 中的视图只是一种查询重写机制。因此,您基本上可以假设您的用户提供的条件已合并到视图的定义中,并运行生成的查询。

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

但是,某些条件可能不会被推送到视图定义中的“内部”子句中——尽管这些条件与您在子查询中看到的相同。例如,带有 order-by + limit 的子查询可能会出现规划器无法看到的边界。

HTH

【讨论】:

    【解决方案2】:

    你还没有提到环境。在通用模型中,您的方法似乎还可以,但您错过了一个重要点。请记住,您将所有列都带入该视图。如果有 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)
    );
    

    【讨论】:

    • 对不起,我不明白你的意思。你能以某种方式改进你的答案吗?我们在 postgres 上(请在我的问题下方注明标签)
    • 如果在星型模式中需要这样做会很奇怪。避免 * 在查询中可能很重要(特别是如果 PostgreSQL 不支持表消除),但在视图中则不然。
    猜你喜欢
    • 2013-12-29
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 2017-11-14
    • 2011-08-22
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    相关资源
    最近更新 更多