2015-02-11 79 views
0

我有一個表(比如T1),它在列c1,c2和c3上定義了一個PI。強制對teradata表進行PI掃描

在一個查詢中,需要對c1進行過濾,並且對於給定的未知原因,我不能在列c1上創建二級索引。

我試着寫一個這樣的查詢 -

select * 
from T1 
where C1 = <some Value> 
and c2 = c2 
and c3 = c3 

因爲對於C2和C3條件是同義反復,結果集將不會受到影響。但是,我「期待」欺騙Teradata爲此查詢調用PI,但這並未發生。

有什麼解釋?

+0

您的統計數據是否最新?另外,當你說你試圖「欺騙」Teradata時,Teradata中的主索引不像SQL Server或Oracle中的索引。你能爲我澄清這一點嗎? – Nick 2015-02-11 17:42:12

+0

嗯,我的意思是,當我使用「傻瓜」這個詞時,並不尊重。唯一的一點是,該索引是一個包含3列的複合索引,我的過濾器只需要一個索引。我也嘗試使用c2 <>'junk value',並且c2不是null類型的條件,它們都不會調用PI,只有當我在提供具有相等條件的文字時調用PI時(c2 = ) ,那是什麼促使我使用c2 = c2 anology .. 想知道在這種情況下是否有辦法調用PI? – Gyan 2015-02-11 18:01:26

+0

你可以發佈解釋計劃嗎? – Nick 2015-02-11 18:56:49

回答

0

您可以使用列'C1'的主索引創建散列索引或單個表連接索引。這將允許您對索引進行單一或組AMP訪問,然後對基表進行行ID訪問。另一個選項,如果'C1'是唯一的,則在該列上創建一個USI。如果在符合條件時提供多個值,這將最多爲您提供帶有單個值或組AMP選項的雙AMP操作。

我不知道一種方法來查詢基本表,因爲你有它的定義和訪問主索引沒有完全限定它。

1

Teradata的PI是基於散列的,因此所有三列必須基於相等性與ANDed條件進行引用。

當只有一列已知時,無法獲得PI訪問。 但是,當然你可以創建一個二級索引(爲什麼失敗?)。如果這是反覆出現的要求,您最好考慮更改PI和/或添加分區。

+0

那麼,二級索引並沒有真正失敗,因爲我們是這個數據庫的消費者,所有者不允許我們干涉數據結構,讓我們留下它。 我很欣賞你對輔助/連接索引/連接表等的建議。我把這個想法放在一起,實際上是在AND條件中引用所有的PI列。如果它真的不調用PI? – Gyan 2015-02-12 10:11:31

+0

這是所有三列與AND條件加上相等,但沒有辦法根據該信息計算散列:散列(,<未知值>,<未知值>)?如果您無法更改表格的DDL,則必須使用全表掃描。這張桌子有多大? – dnoeth 2015-02-12 15:19:52