Postgresql

查詢有時因轉換錯誤而失敗

  • May 29, 2020

我有一個查詢可以在同一個數據集上執行,有時會失敗,有時會成功

查詢是由 hive 元數據服務生成的,我無法修改。

這是查詢的簡化版本:

select
   "TBLS"."TBL_ID",
   "FILTER0"."PART_ID",
   "TBLS"."TBL_NAME",
   "FILTER0"."PART_KEY_VAL"
from
   "PARTITIONS"
inner join "TBLS" on
   "PARTITIONS"."TBL_ID" = "TBLS"."TBL_ID"
   and "TBLS"."TBL_NAME" = 'test_table_int'
inner join "PARTITION_KEY_VALS" "FILTER0" on
   "FILTER0"."PART_ID" = "PARTITIONS"."PART_ID"
where
   cast("FILTER0"."PART_KEY_VAL" as decimal(21, 0)) = 1

當我啟動一個新數據庫並填充相關表時,這就是整個數據的樣子(沒有任何過濾器的查詢):

在此處輸入圖像描述

並執行上面的查詢將返回一行(PART_KEY_VAL= 1 的那一行)

在我執行一些寫入這些表的自動化測試後,問題就開始了。我找不到任何模式,我只是執行了一些寫入這些表的複雜測試

現在,如果我再次填充這些表,數據看起來很相似:

在此處輸入圖像描述

但執行上面的查詢將導致:

SQL 錯誤

$$ 22P02 $$:錯誤:數字類型的輸入語法無效:“c”

出於某種原因,值“c”被轉換為十進制並且它失敗了,即使對相同​​數據的相同查詢在早些時候工作

這種行為的原因可能是什麼?


作為參考,這裡是生成查詢的地方,但我在上面簡化了一點:https ://github.com/apache/hive/blob/rel/release-3.1.2/standalone-metastore/src/main/java /org/apache/hadoop/hive/metastore/MetaStoreDirectSql.java#L1289-L1339

問題是由於某種原因 postgres 停止使用列“TBL_NAME”上的索引。

使用索引時,先對錶進行過濾,剩下的值都是int。

但是當不使用索引時,強制轉換將發生在所有行上,並且會在字元串上失敗。

作為一種解決方法,我設置了enable_seqscan = false, 並強制 postgres 使用索引,但這不是一個長期的解決方案。

我在 hive 上打開了一個錯誤,對問題進行了更詳細的解釋: https ://issues.apache.org/jira/browse/HIVE-23576

引用自:https://dba.stackexchange.com/questions/268011