本文為您羅列Hologres中常見的錯誤碼,以及對應的報錯資訊和解決方案,方便業務快速定位或者處理問題。
HG_ERRCODE_FDW_ERROR
報錯:failed to import foreign schema from odps: Can't find file system factory
-
問題原因:Hologres不支援查詢MaxCompute側的外部表格。
-
解決方案:重新建立MaxCompute內部表。
ERRCODE_FDW_ERROR
報錯:failed to import foreign schema from odps: Authorization Failed:xxx
-
問題原因:沒有對應MaxCompute表的許可權。
-
解決方案:前往MaxCompute為帳號設定更多的許可權,詳情請參見通過命令系統管理使用者許可權。
報錯:failed to import foreign schema from odps:Table not found -xxx
-
問題原因:查詢的表在MaxCompute中不存在。
-
解決方案:前往MaxCompute確認表是否存在。
ERRCODE_UNIQUE_VIOLATION或者pk violates
報錯:Update row with Key (id)=(xxxx) multiple times或者duplicate key value violates unique constraint
-
問題原因:違反唯一性限制式,執行UPDATE、INSERT ON CONFLICT或INSERT操作時,主鍵存在重複資料。
-
解決方案:
-
若INSERT文法報錯:可以改為
INSERT INTO xx ON CONFLICT的文法,實現主鍵去重,詳情請參見INSERT ON CONFLICT(UPSERT)。 -
若
INSERT INTO xx ON CONFLICT文法報錯:為資料來源存在重複資料導致,可參考常見報錯解決。 -
若以上都不是,可能是因為表設定了TTL,TTL到期了但資料還未被刪除,可以使用hg_remove_duplicated_pk函數清理,詳情請參見常見報錯。
-
ERRCODE_CHECK_VIOLATION或者partition constraint
報錯:ERROR: new row for relation violates partition constraint
-
問題原因:違反檢查約束,分區表寫入的值與定義的值不一致。例如分區表定義的值為20240110,但是寫入了其他分區值,導致分區衝突。樣本如下:
CREATE TABLE public.tbl_20240110 PARTITION OF public.tbl FOR VALUES IN('20240110'); INSERT INTO public.tbl_20240110 SELECT * FROM odps_tbl where sale_date >'20240110'; error: new row for relation "tbl_20240110" violates partition constraint -
解決方案:向分區表內寫入符合分區約束的分區值。
ERRCODE_NOT_NULL_VIOLATION或者not-null constraint或者UsageProblem
報錯:null value in column "xxx" violates not-null constraint
-
問題原因:違反非空約束,NOT NULL的列寫入了NULL值。
-
解決方案:去掉NULL的髒資料後再進行寫入。
ERRCODE_UNDEFINED_TABLE
報錯:Dispatch query failed: Table not found
-
問題原因:表不存在,一般出現在表剛剛建立未更新中繼資料或者Query執行過程中,表執行TRUNCATE或DROP操作的情境。
-
解決方案:可以使用HoloWeb Query洞察排查,在Query執行過程中是否同時存在TRUNCATE或DROP的DDL衝突任務,然後重新執行Query,詳情請參見Query洞察。後期盡量避免Query執行過程中有DDL衝突任務。
ERRCODE_QUERY_CANCELED或者Query Is Cancelled
報錯:ERROR: canceling statement due to statement timeout
-
問題原因:用戶端設定了逾時時間,Query已耗用時間超過了逾時時間。
-
解決方案:最佳化Query使其已耗用時間更短,或者重新設定更加合理的逾時時間。逾時時間設定詳情請參見管理Query。
報錯:ERROR: Query:[xxx] Get result failed: canceling statement due to user request
-
問題原因:查詢被取消,通常是因為表被執行了DROP或TRUNCATE操作。
-
解決方案:可以通過HoloWeb Query洞察排查是否有衝突的DDL,詳情請參見Query洞察。後期盡量避免Query執行過程中有DDL衝突任務。
報錯:query is cancelled Cannot find index full ID:xxx (table id: x, index id: x) in storages or it is deleting
-
問題原因:Query執行過程中,涉及到的表存在TRUNCATE或DROP等行為,導致表的table id發生變化,Query被取消了。
-
解決方案:使用Query洞察排查當前Query是否在同一時間執行了TRUNCATE或DROP操作,詳情請參見Query洞察。
ERRCODE_FEATURE_NOT_SUPPORTED或者Unsupported Feature
報錯:Feature not supported: insert into parent table
-
問題原因:不支援直接寫入資料至分區父表。
-
解決方案:SQL方式執行INSERT時,需要將資料寫入指定的分區子表。詳情請參見CREATE PARTITION TABLE。
報錯:SELECT INTO is not supported now.
-
問題原因:Hologres不支援使用SELECT INTO文法。
-
解決方案:您可使用INSERT INTO SELECT方式插入資料,詳情請參見INSERT。
報錯:ALTER TABLE CHANGE OWNER is not supported in SLPM (Schema-Level Permission Mode)
-
問題原因:不支援在SLPM模型下使用ALTER TABLE的方式改變表Owner。
-
解決方案:SLPM許可權模式的表Owner都是使用者組,可以通過將使用者從使用者組中移除的方式來改變使用者的許可權。詳情請參見移除使用者組。
報錯:Feature not supported: INSERT ON CONFLICT RETURNING
-
問題原因:Hologres暫不支援
INSERT ON CONFLICT RETURNING文法。 -
解決方案:去掉RETURNING,僅使用
INSERT ON CONFLICT文法,詳情請參見INSERT ON CONFLICT(UPSERT)。
報錯:ERROR: INSERT in ddl transaction is not supported now
-
問題原因:不支援在事務中使用INSERT。樣本如下:
BEGIN; INSERT xxx commit; ERROR: INSERT in ddl transaction is not supported now -
解決方案:在事務外使用INSERT,或者開啟DML事務,詳情請參見SQL事務能力。
報錯:Creating publication with table that without binlog is not supported now
-
問題原因:對沒有開啟Binlog的表建立了Publication。
-
解決方案:Publication是用於訂閱Binlog的,只允許對開啟了Binlog的表建立Publication,詳情請參見通過JDBC消費Hologres Binlog。
報錯:Feature not supported: INSERT on conflict contains un-unique column
-
問題原因:INSERT ON CONFLICT中的conflict條件使用了非主鍵欄位。
-
解決方案:INSERT ON CONFLICT中的conflict條件只能使用主鍵。
報錯:Feature not supported: UPDATE with shard keys
-
問題原因:Hologres不支援對主鍵或Distribution Key執行UPDATE操作。
-
解決方案:修改SQL重新執行。
報錯:time before 1925 not supported
-
問題原因:時間相關的函數預設支援的範圍為1925~2282年,超過該範圍則會報錯。
-
解決方案:如果是to_char、to_date或to_timestamp等函數,可以在SQL前通過設定GUC參數
hg_experimental_functions_use_pg_implementation以支援更大範圍的時間。詳情請參見日期和時間函數。
報錯:Group by key is type of imprecise not supported
-
問題原因:GROUP BY的欄位類型是非精確類型,導致出現報錯。
-
解決方案:GROUP BY中避免非精確資料類型,如FLOAT等,建議使用精確的資料類型。
報錯:CREATE TABLE is not supported for current instance
-
問題原因:當前執行個體是共用叢集(執行個體Endpoint以
hgmc開頭,如hgmc-cn-xxwwwkkk,可前往Hologres管控台查看執行個體Endpoint)或者從執行個體,共用叢集不支援建立內部表,只能建立外部表格,從執行個體只能查詢表資料,不能建立表。 -
解決方案:
-
如果是共用叢集,按照建立外部表格的文法建立外部表格,詳情請參見CREATE FOREIGN TABLE。或者使用Hologres獨享執行個體,可支援建立內部表。
-
如果是從執行個體,需要使用主執行個體建立表。
-
報錯:ALTER TABLE ALTER COLUMN SET TYPE is not supported now
-
問題原因:當前不支援通過ALTER TABLE的方式修改列的類型。
-
解決方案:重建立表並修改列類型。
報錯:ERROR: Currently materialized view does not support aggregate on expressions, only support single column
-
問題原因:單表物化視圖不支援運算式,從而出現報錯。
-
解決方案:單表物化視圖避免使用運算式,詳情請參見SQL管理物化視圖。
報錯:ERROR: SELECT rule's target list has too few entries
-
問題原因:即時物化視圖不支援運算式,從而出現報錯。
-
解決方案:即時物化視圖避免使用運算式,詳情請參見SQL管理物化視圖。
報錯:TransactionRowStore::DumpFlushDelta Not implemented
-
問題原因:Hologres 目前的版本對
DELETE FROM table USING文法的特定實現存在限制,導致執行時出現此報錯。 -
解決方案:調整 SQL 寫法,避免使用 USING 子句進行大量刪除,改為如下形式刪除資料:
DELETE FROM table WHERE (col1, col2) IN ((val1, val2), ...);
ERRCODE_UNDEFINED_OBJECT
報錯:column xxx does not exist
-
問題原因:列不存在。
-
解決方案:重新檢查SQL語句是否錯誤。
報錯:Table group xxx does not exist
-
問題原因:Table Group不存在。
-
建表時指定已存在的Table Group,或者提前建立Table Group。
報錯:The specified partition does not exist
-
問題原因:通常發生在資料寫入或更新時,對應的分區表不存在。
-
解決方案:提前建立對應分區。
報錯:create binlog reader failed: Fail to find any shards, please check if the table group is in current warehouse
-
問題原因:該Warehouse上沒有該Table Group。
-
解決方案:請檢查該Warehouse是否載入了對應的Table Group,若沒有載入,請配置載入Table Group。具體操作,請參見計算群組資料訪問授權。
ERRCODE_INSUFFICIENT_PRIVILEGE或者permission denied
許可權相關的報錯請參考如下文檔:
ERRCODE_OUT_OF_MEMORY或者OOM
報錯:Total memory used by all existing queries exceeded memory limitation
-
問題原因:Query由於記憶體超出,導致出現OOM。
-
解決方案:詳情請參見OOM常見問題排查指南。
ERRCODE_DATATYPE_MISMATCH
報錯:internal error: Datasets has different schema
-
問題原因:Query的列與表中原有的列對不齊。
-
解決方案:檢查SQL的列是否匹配。
ERRCODE_DIVISION_BY_ZERO
-
問題原因:SQL中有除法,分母的資料是0,不支援除法中分母為0。
-
解決方案:
-
避免分母為0,或者使用CASE WHEN文法繞過。
-
建立MySQL相容性外掛程式,開啟允許除以0的開關,詳情請參見遷移MySQL至Hologres。
-
ERRCODE_STRING_DATA_RIGHT_TRUNCATION
報錯:value too long for type character varying(xxx)
-
問題原因:欄位長度超過了VARCHAR類型的長度限制。
-
解決方案:處理資料或將VARCHAR的長度設定得更長,或者將欄位類型改為TEXT。
ERRCODE_PROGRAM_LIMIT_EXCEEDED或者Exceed Odps Scan Limit
報錯:Exceeds the partition limitation of 512, current match xxx partitions.
-
問題原因:查詢MaxCompute外部表格的分區數量超過了512。
-
解決方案:增加更多的分區過濾條件,或者使用如下GUC參數調整分區查詢限制,詳情請參見常見問題。
set hg_foreign_table_max_partition_limit =xx;
報錯:Build desc failed: Exceeds the scan limitation of 200 GB, current scan xxx GB.
-
問題原因:掃描的MaxCompute外部表格資料量超過200 GB。
-
解決方案:
-
增加多個過濾條件,減少掃描資料量。
-
將資料匯入Hologres內部表。內部表沒有資料量的掃描限制。
-
ERRCODE_SYNTAX_ERROR
報錯:syntax error at or near "xxxxx"
-
問題原因:SQL語法錯誤。
-
解決方案:重新檢查SQL文法並修正。
ERRCODE_UNDEFINED_FUNCTION
報錯:DISTINCT is not implemented for window functions
-
問題原因:Hologres目前不支援在視窗函數中使用DISTINCT關鍵字。
-
解決方案:視窗函數中去掉DISTINCT。
報錯:ERROR:function xxx does not exist
-
問題原因:使用函數時未建立對應的extension,或函數文法不滿足規定。
-
解決方案:按照Hologres的規定正確使用函數。
報錯:ERROR: function jsonb_set(json, text[], jsonb, boolean) does not exist
-
問題原因:JSONB_SET函數傳入的參數類型不符導致報錯。
-
解決方案:JSONB_SET函數第一個參數需要傳入JSONB類型,詳情請參見JSON和JSONB類型。
ERRCODE_E_R_E_READING_SQL_DATA_NOT_PERMITTED
報錯:You have NO privilege 'odps:Select' on xxx
-
問題原因:當前帳號沒有MaxCompute表的查詢許可權。
-
解決方案:前往MaxCompute為當前帳號授予相關許可權。
報錯:The sensitive label of column 'xxx' is 2, but your effective label is 0
-
問題原因:當前帳號只有MaxCompute表中部分列的查詢許可權。
-
解決方案:前往MaxCompute為當前帳號授予更多許可權,或者只查詢有許可權的列。授權詳情請參見通過命令系統管理使用者許可權。
ERRCODE_DUPLICATE_OBJECT
報錯:extension "xxxxx" already exists
-
問題原因:extension已存在,無需重複建立。
ERRCODE_INVALID_TEXT_REPRESENTATION或者invalid input
報錯:invalid input syntax for type numeric: \"\"
-
問題原因:NUMERIC類型的欄位有髒資料,不符合NUMERIC的資料規範。
-
解決方案:處理髒資料。
報錯:invalid input syntax for integer: xxx
-
問題原因:INT類型的欄位有髒資料,不符合INT的資料規範。
-
解決方案:處理髒資料。
ERRCODE_BAD_COPY_FILE_FORMAT
報錯:missing data for column "xxx". failed to query next
-
問題原因:執行COPY命令時,檔案或資料的格式不正確,多發生於資料本身就包含了COPY指定的分隔字元(例如空格),導致列的數量對不上。
-
解決方案:處理髒資料。
ERRCODE_UNDEFINED_COLUMN
報錯:ERROR: INSERT has more expressions than target columns
-
問題原因:INSERT寫入的列與目標表的列數不一致。
-
解決方案:INSERT寫入的列需要與目標表列數保持一致,一一對應。
ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE
報錯:bigint out of range
-
問題原因:BIGINT類型的資料長度超過了限制。
-
解決方案:處理髒資料,使其在BIGINT類型的長度範圍內。
報錯:numeric field overflow in function round
-
問題原因:NUMERIC類型的欄位超過了精度限制。
-
解決方案:處理髒資料。
ERRCODE_DATETIME_FIELD_OVERFLOW
報錯:InsertOverwrite insert select table data failed : column a.unsign_type does not exist
-
問題原因:列不存在,或者參數填寫錯誤。
-
解決方案:重新檢查SQL文法並修改。
報錯:mismatched properties: table orientation is "column" but storage format is "sst"
-
問題原因:建表時屬性填寫錯誤,設定了列存但是儲存模式選擇了SST。
-
解決方案:檢查SQL文法並修改。
ERRCODE_INVALID_DATETIME_FORMAT
報錯:invalid value "" for "yyyy",Value must be an integer.
-
問題原因:資料不符合類型規範。
-
解決方案:處理髒資料。
ERRCODE_CHARACTER_NOT_IN_REPERTOIRE
報錯:invalid byte sequence for encoding "UTF8": 0xe9 0x80
-
問題原因:字元不在編碼範圍內,常見於出現了UTF8編碼之外的非法字元。
-
解決方案:處理髒資料。
ERRCODE_DUPLICATE_TABLE
報錯:relation "xxxx" already exists
-
問題原因:表已經存在。
-
解決方案:無需重複建立表。
ERRCODE_UNTRANSLATABLE_CHARACTER
報錯:character with byte sequence 0xe4 0x9e 0xab in encoding "UTF8" has no equivalent in encoding "GBK"
-
問題原因:表示UTF8編碼的字元在目標GBK格式中無等價項。
-
解決方案:處理髒資料。
ERRCODE_GROUPING_ERROR
報錯:column "xxx" must appear in the GROUP BY clause or be used in an aggregate function
-
問題原因:列必須出現在GROUP BY欄位中。
-
解決方案:重新修改SQL文法。
ERRCODE_INVALID_TRANSACTION_STATE
報錯:SET_TABLE_PROPERTY and CREATE TABLE statement are not in the same transaction for table
-
問題原因:建表時CREATE TABLE和call屬性不在一個事務(transaction)中,導致報錯。
-
解決方案:建表時CREATE TABLE需要和call屬性放在同一個事務中,樣本如下:
begin; CREATE TABLE tbl ( xxxx ); call set_table_property('tbl', 'orientation', 'xx'); call set_table_property('tbl', 'distribution_key', 'xxx'); commit;
ERRCODE_AMBIGUOUS_COLUMN
報錯:column reference "xxx" is ambiguous
-
問題原因:一般是SQL中存在同名但實際上是不同列的情況時,會出現報錯,例如
SELECT id FROM t1 INNER JOIN t2 ON t1.id=t2.id中,SELECT後的id欄位沒有指明屬於t1還是t2。 -
解決方案:重新修改SQL文法。
ERRCODE_DUPLICATE_COLUMN
報錯:column "xxx" specified more than once
-
問題原因:建表時,一個欄位聲明了多次。
-
解決方案:重新修改SQL文法。
ERRCODE_AMBIGUOUS_FUNCTION
模稜兩可的函數。通常指函數支援多種類型的入參,但傳參的類型未指定清楚。
ERRCODE_INVALID_COLUMN_DEFINITION
報錯:invalid definition of a numeric type
-
問題原因:建表時,NUMERIC或DECIMAL類型欄位未指定精度。
-
解決方案:重新修改SQL文法,並為NUMERIC或DECIMAL類型欄位指定精度。
ERRCODE_CANNOT_COERCE
報錯:cannot cast type date to integer
-
問題原因:無法將DATE類型轉換為INT類型。
-
解決方案:重新修改SQL文法。
ERRCODE_UNDEFINED_SCHEMA或者ERRCODE_INVALID_SCHEMA_NAME
報錯:schema "xxxx" does not exist
-
問題原因:Schema不存在。
-
解決方案:重新檢查SQL文法是否正常。
ERRCODE_INTERNAL_ERROR
指非預期內的報錯。
報錯:internal error: Connect timeout, err: std_exception: Connection refused
-
問題原因:通常是由於某種原因導致了執行個體宕機,從而出現報錯。
-
解決方案:提交工單排查Hologres執行個體宕機原因。
報錯:too many shards in this instance
-
問題原因:當前執行個體設定的Shard數量超過了執行個體Shard總數的限制。
-
解決方案:梳理當前執行個體的Shard數,不建議設定超過總數的Shard數,詳情請參見執行個體管理。
報錯:internal error: Write is not allowed in readonly mode
-
問題原因:不支援在從執行個體中執行INSERT、UPDATE或DELETE等操作。
-
解決方案:從執行個體中只允許執行SELECT操作,其餘操作請在主執行個體中執行。
報錯:remaining connection slots are reserved for non-replication superuser connections
-
問題原因:當前串連數已滿,導致非Superuser帳號無法串連。
-
解決方案:使用Superuser帳號釋放空閑串連,詳情請參見釋放串連。
報錯:Build desc failed: Column type: information_schema.sql_identifier can not translate into hologres type
-
問題原因:部分系統資料表的欄位類型比較複雜,當前Hologres不支援。
-
解決方案:不建議將複雜的系統資料表資料與Hologres表關聯查詢。
報錯:ERROR: commit ddl phase1 failed: DDLWrite is not allowed on replica
-
問題原因:不支援在從執行個體中修改IP白名單。
-
解決方案:需要在主執行個體中修改IP白名單。
報錯:current transaction is aborted, commands ignored until end of transaction block
-
問題原因:通常是由於上一個Transaction的命令未執行完,又開始執行下一個命令導致報錯。如:
begin; create xxxx begin; -
解決方案:執行
rollback;命令結束當前事務並復原所有未認可的變更。
報錯:query length xxxxx exceeded the maximum 102400
-
問題原因:Query的長度超過了102400位元組的限制。
-
解決方案:改寫Query,使其長度保持在規定範圍內。
報錯:Modify record by primary key is not on this table
-
問題原因:通常是通過Flink寫入資料時選擇了更新模式,但目標表沒有主鍵,導致資料無法更新。
-
解決方案:為目標表設定合適的主鍵,詳情請參見主鍵Primary Key。
報錯:ERROR: xxx for fe ,should not be evaluated
-
問題原因:通常是使用某個函數查詢系統資料表導致的報錯。該函數運行在Hologres的引擎,但是系統資料表的計算不會經過Hologres引擎。所以在執行時,將函數直接計算而不經過Hologres引擎,導致了報錯。
-
解決方案:不建議使用該函數操作Hologres系統資料表。
如何處理數字開頭的欄位?
即時數倉Hologres相容PostgreSQL,使用文法同PostgreSQL,不支援數字開頭的欄位。
如果您使用Hologres時遇到數字開頭的欄位,查詢時需要為該欄位增加雙引號,樣本如下。
select bizdate,"1_day_active_users","7_day_active_users" from t_active_users;
報錯:cannot drop table because other objects depend on it
-
問題原因:待刪除的表存在相關依賴,例如有視圖使用了該表。
-
解決方案:先去除相關依賴,再刪除表。
寫入或查詢命令中含有多表Join時報錯: BinaryArray cannot contain more than 2147483646 bytes
-
問題原因
在統計資訊未及時更新的情況下,多表Join時可能產生不合理的執行計畫,導致單個 batch 中單個欄位的大小總和超過 2 GB,從而觸發該報錯。
-
解決方案
對Join的表執行如下命令用於更新表的統計資訊。
analyze <tablename>;如果更新表的統計資訊後仍然報錯,說明資料中有較大欄位,在SQL前使用如下命令添加GUC參數解決。
set hg_experimental_query_batch_size = 1024;
匯入或者查詢資料時報錯:Cannot reserve capacity larger than 2^31 - 1 for binary
-
問題原因及解決方案
-
原因一:在統計資訊未及時更新的情況下,不合理的執行計畫可能導致單個 batch 中單個欄位的大小總和超過 2 GB,從而觸發該報錯。
解決方案:對錶執行
analyze命令,用於更新表的統計資訊。analyze <tablename>; -
原因二:表欄位資料量超過2 GB,導致報錯。
解決方案:在SQL前面添加以下GUC參數以降低每次Query讀取的批次大小。
set hg_experimental_query_batch_size = 1024;
-
執行SQL時報錯:internal error: Sequence is used out
-
問題原因:表中有serial類型,serial類型值超過了取值範圍。
-
解決方案:
-
如果是serial類型,建議重建立表,並將類型改為bigserial。
-
serial類型在寫入時會擷取表鎖,建議避免使用serial類型。
-
如何在SQL查詢結果中實現換行效果?
在Hologres中,如果需要在SQL查詢結果中實現換行效果,應使用帶E首碼的逸出字元串文法。一般字元串中的\n或\r\n會被視為一般字元,不會產生換行效果。
-
使用樣本
-- 錯誤寫法:不會產生換行效果 SELECT STRING_AGG(name, '\r\n') FROM t1; -- 正確寫法:使用E首碼的逸出字元串 SELECT STRING_AGG(name, E'\r\n') FROM t1; -- 也可以只使用\n SELECT STRING_AGG(name, E'\n') FROM t1; -
說明
Hologres相容PostgreSQL文法,在PostgreSQL中,帶
E首碼的字串(如E'\n')表示支援C風格的逸出序列。其中\n表示分行符號,\r表示斷行符號符。
NOW()函數返回時間有延遲怎麼辦?
-
問題原因:Hologres 中
NOW()函數返回的是當前事務的開始時間,而非即時系統時間。若查詢處於長時間啟動並執行事務中,或使用了串連池複用串連,會導致NOW()返回的時間出現滯後。 -
解決方案:改用
CLOCK_TIMESTAMP()函數擷取當前真實的系統時間。CLOCK_TIMESTAMP()函數每次調用都會返回執行時刻的精確時間,不受事務開始時間影響。
DELETE 語句是否支援使用子查詢作為動態分區選取器?
Hologres 的分區裁剪要求查詢的分區條件必須為靜態值或參數化綁定值,不支援子查詢或動態運算式作為分區選擇條件。
-
問題原因:使用子查詢作為分區條件(如
WHERE ds = (SELECT MAX(ds) FROM ...))時,分區裁剪會失效,可能引發全表掃描,導致查詢效能極差。 -
解決方案:將子查詢的結果先查詢出來賦值給變數,再將該靜態值用於 DELETE 語句的分區條件中,確保分區裁剪正常生效。樣本如下:
-- 錯誤寫法:子查詢導致分區裁剪失效 DELETE FROM table WHERE ds = (SELECT MAX(ds) FROM table); -- 正確寫法:先擷取靜態值,再用於刪除 SELECT MAX(ds) INTO v_max_ds FROM table; DELETE FROM table WHERE ds = v_max_ds;
不修改 GUC 參數時如何通過改寫 SQL 避免 ORCA 最佳化器報錯?
-
問題原因:這是 ORCA 最佳化器在特定 Hologres 版本中的已知問題,無法通過單純改寫 SQL 來規避。
-
解決方案:需要升級 Hologres 執行個體版本到 4.0 及以上版本以修複 ORCA 最佳化器報錯。建議聯絡 Hologres 支援人員確認當前執行個體的升級路徑。
為什麼舊執行個體運行正常,新執行個體卻出現報錯或效能問題?
-
問題原因:新舊執行個體之間可能存在版本差異、計算量級及負載不同,導致在舊執行個體上正常啟動並執行 SQL 或業務在新執行個體上出現報錯或效能下降。不同版本的 Hologres 在 SQL 相容性、最佳化器行為和內部實現上可能存在差異。
-
解決方案:將新執行個體升級至最新穩定版本,以解決因版本差異導致的相容性及效能問題。如果升級後問題仍然存在,請聯絡 Hologres 支援人員進一步排查。
報錯:ERROR: tables can have at most 6400 columns
-
問題原因:Hologres 中單張表的欄位上限為 6400 個。即使執行
DROP COLUMN刪除了欄位,中繼資料中的欄位計數仍然會累計疊加。因此,頻繁執行ADD COLUMN和DROP COLUMN操作後,中繼資料中的欄位總數可能超過 6400 個上限,從而觸發該報錯。 -
解決方案:
-
短期方案:重建立表並將資料移轉到新表中,新表的欄位計數從零開始。
-
長期建議:最佳化表結構設計,將頻繁變動的多個欄位合并到一個 JSON 欄位中,避免頻繁執行 ADD/DROP COLUMN 操作。
-