1
SEL * FROM TABLE WHERE a=10
VS這些2個查詢差異在TERADATA
SEL * FROM TABLE WHERE a='10'
這裏一個是BIGINT,解釋計劃並沒有表現出任何的區別,Teradata的如何處理這一點,並在這些查詢有什麼區別?
SEL * FROM TABLE WHERE a=10
VS這些2個查詢差異在TERADATA
SEL * FROM TABLE WHERE a='10'
這裏一個是BIGINT,解釋計劃並沒有表現出任何的區別,Teradata的如何處理這一點,並在這些查詢有什麼區別?
如果您比較不同的數據類型(通常但不總是),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'))
是我檢查查詢是否執行的第一件事情之一。
相反情況下的大問題是什麼?如果在列爲BIGINT時它很容易對CHAR進行轉換,那麼當列爲CHAR並傳遞INT值時,爲什麼會出現這麼多問題 –
在我的情況中,列a中存在一個PI,因此,如果您已指出優化程序我不知道10以前是絃樂。 –
@VivekKeshri:原因很簡單,值'1'由許多不同的字符串表示,例如「1」,「1」,「1e + 0」,「1.0」,「 + 1'',所以唯一的保存方式是將字符串轉換爲數字:-) – dnoeth