2015-05-19 34 views
1
SEL * FROM TABLE WHERE a=10 

VS這些2個查詢差異在TERADATA

SEL * FROM TABLE WHERE a='10' 

這裏一個是BIGINT,解釋計劃並沒有表現出任何的區別,Teradata的如何處理這一點,並在這些查詢有什麼區別?

回答

1

如果您比較不同的數據類型(通常但不總是),Teradata會自動應用數據類型轉換。

每當字符串與數字進行比較時,字符串將被轉換爲FLOAT,這是最靈活的數字格式。

在你的情況下,這個轉換已經由解析器完成了,所以優化器不知道10是s字符串。

如果你這樣做的另一種方式:

SEL * FROM TABLE WHERE a=10 -- column a is a character 

你能發現這個轉換中解釋:

"(table.last_name (FLOAT, FORMAT '-9.99999999999999E-999'))= 1.00000000000000E 001" 

有時這種自動轉換方便,但在的情況下這樣說,這是非常糟糕的:不能使用索引,並且所有現有的統計信息都會丟失。所以你最好知道你的數據類型:-)

Explain中的這個(FLOAT, FORMAT '-9.99999999999999E-999'))是我檢查查詢是否執行的第一件事情之一。

+0

相反情況下的大問題是什麼?如果在列爲BIGINT時它很容易對CHAR進行轉換,那麼當列爲CHAR並傳遞INT值時,爲什麼會出現這麼多問題 –

+0

在我的情況中,列a中存在一個PI,因此,如果您已指出優化程序我不知道10以前是絃樂。 –

+0

@VivekKeshri:原因很簡單,值'1'由許多不同的字符串表示,例如「1」,「1」,「1e + 0」,「1.0」,「 + 1'',所以唯一的保存方式是將字符串轉換爲數字:-) – dnoeth