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 的子查询可以呈现规划器无法看到的边界。

高温高压

于 2013-01-18T11:39:02.207 回答
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)
);
于 2013-01-21T23:26:38.033 回答