寫入與查詢
本文介紹AnalyticDB for MySQL中寫入與查詢的常見問題及解決方法。
當常見問題場景中未明確產品系列時,表明該問題僅適用于AnalyticDB for MySQL數倉版。
常見問題概覽
企業版、基礎版及湖倉版集群是否支持通過JDBC方式查詢Hudi表的數據?
支持。在企業版、基礎版及湖倉版集群中創建Hudi表后,可直接通過JDBC方式查詢Hudi表的數據。
企業版、基礎版及湖倉版集群是否支持讀取OSS中的Hudi表數據?
支持。通過外表讀取OSS中的Hudi表數據的詳細信息,請參見通過外表導入湖倉版。
企業版、基礎版及湖倉版集群是否支持自動切換XIHE MPP作業和XIHE BSP作業?
提交作業時,手動指定作業提交到Interactive型資源組或Job型資源組,決定了作業是XIHE MPP作業還是XIHE BSP作業。
企業版、基礎版及湖倉版集群如何選擇XIHE MPP還是XIHE BSP來執行作業?
XIHE BSP默認為異步提交作業,同步提交和異步提交的區別在于客戶端是否需要等待查詢執行完成。
異步提交會有如下限制:
結果集返回最多10000行。
結果集(包括對應的csv文件下載鏈接)最多保存30天,最多保存1000個。
建議對執行時間較長、計算量較大,但結果集較小的查詢(如INSERT INTO SELECT
、INSERT OVERWRITE SELECT
、CREATE TABLE AS SELECT
等)使用異步提交。
企業版、基礎版及湖倉版集群如何查看XIHE BSP作業的狀態?
如果湖倉版集群是通過作業編輯器提交的XIHE BSP作業,可在作業編輯器SQL開發頁面下方的執行記錄頁簽查看。
如果湖倉版集群不是通過作業編輯器提交的XIHE BSP作業,可通過系統內部提供的內存表查看。方法如下:
SELECT status FROM information_schema.kepler_meta_elastic_job_list WHERE process_id='<job_id>';
查詢XIHE BSP作業的狀態統計,方法如下。
SELECT status,count(*) FROM information_schema.kepler_meta_elastic_job_list GROUP BY status;
如何進行資源隔離,減少SQL任務間的相互影響?
數倉版彈性模式集群和企業版、基礎版及湖倉版集群支持資源組功能,資源組類型的詳細信息請參見數倉版資源組介紹和湖倉版資源組介紹。您可以通過創建不同類型的資源組,將SQL作業提交到對應的資源組執行達到資源隔離的效果。
如何處理IN條件過多的問題?
AnalyticDB for MySQL對于IN條件的個數有限制,IN條件個數默認為2000,您也可以根據需求進行調整。
IN條件的個數最大不能超過5000,超過5000會影響性能。
例如將IN條件的個數限制設置為3000,語句如下:
SET ADB_CONFIG max_in_items_count=3000;
如何解決查詢數據時提示“Query exceeded maximum time limit of 1800000.00ms”?
AnalyticDB for MySQL對SQL查詢執行設置有超時時間,該SQL執行時間超過了默認時間1800000.00ms。您可以為單個查詢或全集群所有查詢配置查詢的超時時間,示例如下:
單個查詢生效。
/*+ QUERY_TIMEOUT=xxx */SELECT count(*) FROM t;
全集群所有查詢生效。
SET ADB_CONFIG QUERY_TIMEOUT=xxx;
更多信息,請參見常見配置參數。
如何解決使用Multi-Statement功能連續執行多個SQL語句時提示“multi-statement be found”?
僅3.1.9.3及以上內核版本的集群支持Multi-Statement功能,您需先查看集群內核版本是否符合要求,若內核版本低于3.1.9.3,請聯系技術支持升級版本;若內核版本高于3.1.9.3,但仍有該報錯,可能是因為客戶端未開啟Multi-Statement功能。
例如,使用MySQL JDBC客戶端連接集群時,不僅需要執行SET ADB_CONFIG ALLOW_MULTI_QUERIES=true;
命令手動開啟Multi-Statement功能,還需將JDBC連接屬性allowMultiQueries
配置為true
。
如何排查返回結果中的時間被截斷的問題?
先通過MySQL客戶端進行驗證,如果MySQL客戶端顯示正常,那么需要定位您使用的其他客戶端軟件對返回結果是否做過特殊處理。
如何解決AES_ENCRYPT內置函數報錯?
執行以下語句,出現報錯。
SELECT CONVERT(AES_DECRYPT(AES_ENCRYPT('ABC123','key_string'),'key_string'),char(10));
原因為AES_ENCRYPT(NCRYPT(varbinary x, varchar y)語句中x的數據類型需為varbinary。SQL示例如下。
SELECT CONVERT(AES_DECRYPT(AES_ENCRYPT(CAST('ABC123' AS VARBINARY), 'key_string'), 'key_string'),char(10));
為什么會發生查詢結果跳變?
在確認數據沒有更新的情況下,可能導致查詢結果跳變的原因如下:
沒有排序的LIMIT。AnalyticDB for MySQL是分布式數據庫,查詢在多個節點多線程執行,如果某些線程返回了滿足LIMIT的行數,查詢即終止,所以沒有排序的LIMIT的查詢結果是一個隨機的過程,內部無法保證固定的線程返回結果。
帶分組的聚合查詢,如果SELECT字段中的某個字段沒有聚合函數,也沒有出現在GROUP BY字段中,那么這個字段將隨機返回一個值。
若仍有問題,請聯系技術支持。
為什么單表的排序(ORDER BY)查詢耗時長?
原因:數據在存儲層沒有排序,存儲的比較分散,會生成大量的無效數據讀取,因此查詢耗時會變長。
建議:您可以為進行ORDER BY的字段增加聚集索引(CLUSTERED KEY)。增加聚集索引后,數據會在存儲層先完成初步排序,在進行ORDER BY查詢時,僅需讀取少量數據,進而提升查詢性能。增加聚集索引的方法,請參見增加聚集索引。
一張表僅支持創建一個聚集索引,若其他字段已經有聚集索引,需先刪除,再為ORDER BY的字段增加聚集索引。
大表在增加聚集索引之后,會增加BUILD任務的耗時,進而影響存儲節點的CPU使用率。
為什么執行計劃里的表掃描行數累加不等于查詢的總掃描行數?
一般是由于創建了復制表導致的,復制表在AnalyticDB for MySQL的每個Shard都保存一份數據,當查詢復制表時,復制表的查詢會在掃描量統計時重復統計。
為什么沒有設置主鍵(primary key)的表,用INSERT OVERWRITE插入,會出現重復數據?
AnalyticDB for MySQL中沒有設置主鍵的表不支持自動去重。
為什么使用查詢語句SELECT * FROM TABLE GROUP BY KEY后,報錯“Column 'XXX' not in GROUP BY clause”?
分組查詢時不支持使用查詢語句SELECT * FROM table GROUP BY key
展示查詢所有字段,需要顯式列出所有字段。SQL示例如下。
SELECT nation.name FROM nation GROUP BY nation.nationkey
查詢結果以JSON格式返回時,IN操作符指定值的個數有限制嗎?
AnalyticDB for MySQL內核版本為3.1.4及以下版本的集群對IN操作符指定值的個數有限制且個數不能超過16,內核版本為3.1.4以上版本的集群沒有限制。查看集群的內核版本的操作步驟,請參見如何查看集群的內核版本?。
是否支持OSS上經過GZIP壓縮后的CSV文件做為外表數據源?
AnalyticDB for MySQL支持OSS上經過GZIP壓縮后的CSV文件做為外表數據源,需要compress_type外表定義加上compress_type=gzip。OSS外表語法,請參見OSS非分區外表。
是否支持INSERT ON DUPLICATE KEY?
AnalyticDB for MySQL目前只支持等值更新,不支持算數表達式。
是否支持在UPDATE語句中使用Join?
僅內核版本為3.1.6.4及以上版本的AnalyticDB for MySQL集群支持。詳情請參見UPDATE。
是否支持在SQL里設置變量?
AnalyticDB for MySQL不支持在SQL里設置變量。
是否支持通過Logstash插件使用INSERT ON DUPLICATE KEY UPDATE
語句批量插入數據?
支持。使用INSERT ON DUPLICATE KEY UPDATE
語句批量插入數據時,您無需在每個VALUES()
語句后都添加ON DUPLICATE KEY UPDATE
,僅需在最后一個VALUES()
后加上即可。
例如,需要在student_course
表中批量插入3條數據時,執行如下語句:
INSERT INTO student_course(`id`, `user_id`, `nc_id`, `nc_user_id`, `nc_commodity_id`, `course_no`, `course_name`, `business_id`)
VALUES(277943, 11056941, '1001EE1000000043G2T5', '1001EE1000000043G2TO', '1001A5100000003YABO2', 'kckm303', '工業會計實戰V9.0--77', 'kuaiji'),
(277944, 11056943, '1001EE1000000043G2T5', '1001EE1000000043G2TO', '1001A5100000003YABO2', 'kckm303', '工業會計實戰V9.0--88', 'kuaiji'),
(277945, 11056944, '1001EE1000000043G2T5', '1001EE1000000043G2TO', '1001A5100000003YABO2', 'kckm303', '工業會計實戰V9.0--99', 'kuaiji')
ON DUPLICATE KEY UPDATE
course_name = '工業會計實戰V9.0--77',
business_id = 'kuaiji';
加載內置數據集需要滿足什么條件?
集群具有至少24 ACU的存儲預留資源,且user_default資源組中至少有16 ACU的計算預留資源。
如何判斷內置數據集是否加載成功?
在作業開發SQL開發頁面可查看加載進度。當加載內置數據集前出現并為灰質狀態,且庫表頁簽下可以查看到ADB_SampleData_TPCH數據庫及相關的表,則為加載成功。
加載內置數據集時,提示加載失敗或者長時間加載中如何處理?
您需要先通過SQL語句DROP TABLE table_name;
刪除庫中的所有表。表刪除以后,再通過SQL語句DROP DATABASE ADB_SampleData_TPCH;
刪除內置數據集的庫。刪除ADB_SampleData_TPCH數據庫后,重新加載數據集。
數據庫普通賬號如何使用內置數據集?
內置數據集功能遵循AnalyticDB for MySQL的權限管理規則,即使集群已加載內置數據集,數據庫普通賬號沒有ADB_SampleData_TPCH數據庫的權限也無法使用,需要高權限賬號為普通賬號授權。授權語句為:
GRANT select ON ADB_SampleData_TPCH.* TO <user_name>;
內置數據集加載完成后,如何進行測試?
數據集加載成功后,AnalyticDB for MySQL默認提供對應的查詢腳本,您可以在SQL開發頁面的腳本頁簽執行示例查詢語句。查詢語句的詳情,請參見TPC-H測試集。
為保證數據集的完整性,建議僅對ADB_SampleData_TPCH數據庫執行查詢操作。若由于DDL或DML變更導致數據集加載狀態異常,請嘗試刪除ADB_SampleData_TPCH數據庫并重試加載數據集。