2013-01-18 77 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上(請注意我的問題下面的標籤) –

相關問題