2013-09-23 26 views
0

我有多種表,我將它們連接在一起。每個表都有一個主索引,大多數但不是全部都在日期字段上進行分區。每個表都有一個關聯的視圖。Teradata連接表與連接視圖的性能

如果我寫了一個查詢形式

select 
* 
from view1 
join view2 
on pi1 = pi2 
join view3 
on pi1 = pi3 
join view4 
on pi1 = pi4 

...

我碰上了閥芯空間的問題。直接查詢表格會更好嗎?創建一些中間表並一次完成一些連接,然後在中間表上創建新的索引和分區會更好嗎?

+0

您的代碼示例建議使用笛卡爾積,因爲您沒有加入任何字段。這是否代表你的實際嘗試? –

+0

對不起,今天不小心。我加入索引,在某些應用程序中,我還將使用分區日期進行篩選 – JCWong

+0

您說每個表都有一個關聯的視圖。桌子和視圖有區別嗎?如果不是,該觀點的目的是什麼? –

回答

3

創建中間表不應該是必需的。

不知道進一步的細節有可能是一個簡單的原因:

  • 有一兩個表像發票發票 _line,邏輯 PK是(INVOICE_NUMBER)和(INVOICE_NUMBER,LINE_NUMBER) 。

  • 這兩個表的主要INdex都是(invoice_number),以獲取單個AMP上的發票的所有行 以加快處理速度。 (其實保持在invoice_line的 invoice_date是不需要的,因爲它是相同的 日期每一行。它的完成得到匹配的分區上都 表)

  • 兩個表由invoice_date劃分

  • 加入不包含invoice_date,它僅基於 invoice_number。這在PK-FK的基礎上是正確的,但會導致非常緩慢的連接,因爲優化器不知道哪個012voinvoice_number存儲在哪個分區 - >所有分區都需要訪問 。

在像你必須使用invoice_date作爲一個額外的連接條件的情況下。

否則,您必須提供更多的信息:

前面已經提到:你應該張貼的解釋。

此外,它可能有助於獲得PI定義(加上分區)和一些統計信息。 獲取所有對象的DDL的最簡單方法是在選擇前面的SHOW(除非DBA受限制),統計信息返回HELP STATS tablename;

+0

謝謝!即使連接真的基於主鍵 - 外鍵,添加用於分區的日期字段也會更快 – JCWong

2

您應該首先檢查查詢的「解釋」輸出。 [如果您使用的是Teradata SQL Assistant,那麼只需選擇您的查詢並按F6鍵 - 這將輸出關於如何執行查詢的解析引擎(PE)計劃]。

我懷疑你會在解釋輸出中看到很多「重新分配」[我認爲Teradata是一個社會主義者] - 記住要連接兩行,它們必須位於同一個AMP中。如果他們不是,根據您通過視圖加入的每張表格的不同PI,重新分配將是必要的。

您還需要檢查是否需要收集某些列的統計信息。不正確的統計數據可能會導致PE提出令人懷疑的查詢計劃。例如:如果你正在加入的表格中有一個是巨大的,但是是一張傾斜的表格--PE可能會錯誤地檢測到它實際上是一個小表格,並試圖將其複製到所有AMPS(而不是重新分配),並且這通常會導致在你空間不足的時候。

爲什麼不繼續發佈查詢的「解釋」? 首先設置此選項:爲診斷開啓診斷幫助功能;

沒有看這些意見在做什麼,這很難說。