云数据仓库ADB有什么使用技巧吗?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
云数据仓库AnalyticDB(简称ADB)提供了多种使用技巧,可以帮助用户更高效地管理和查询数据。以下是根据知识库资料整理的详细使用技巧:
OSS Foreign Table 是 ADB 中用于访问存储在阿里云对象存储服务(OSS)上的外部数据的重要功能。以下是一些关键操作技巧: - 查看执行计划
使用 EXPLAIN
命令查看查询语句的执行计划,帮助优化查询性能。例如:
EXPLAIN SELECT COUNT(*) FROM oss_lineitem_orc WHERE l_orderkey > 14062498;
EXPLAIN <table_name>;
ANALYZE <table_name>;
EXPLAIN <table_name>;
wc -l <csv_file>
split -l N <csv_file>
注意:切分后的小文件需保证行的完整性,同一行记录不能跨文件存放。
get_oss_table_meta
函数获取 OSS Foreign Table 的文件信息:
SELECT * FROM get_oss_table_meta('<OSS FOREIGN TABLE>');
ADB 提供了多种 SQL 查询优化方法,适用于复杂数据分析场景: - 去掉不必要的列
在查询中仅选择需要的列,避免全表扫描,减少 I/O 开销。 - 索引与扫描结合
当 SQL 包含多个查询条件时,优先选择高筛选条件进行索引过滤,其他条件可通过内部扫描实现。例如:
/*+ no_index_columns=[tab1.time] */
SELECT c1, c2 FROM tab1 WHERE c1=3 AND time>='2010-01-01 00:00:00';
说明:此方法适用于内核版本低于 3.14 的集群;3.14 及以上版本请使用 filter_not_pushdown_columns
Hint。 - 不等于条件通过内部扫描
对于 <>
条件,建议通过内部扫描执行,避免索引扫描的低效性。例如:
/*+ no_index_columns=[tab1.c2] */
SELECT c1, c2 FROM tab1 WHERE c1=3 AND c2<>100;
LIKE '%abc'
或 LIKE '%abc%'
),建议通过内部扫描执行。为保障集群的稳定性和安全性,ADB 对数据库、表、列等对象的命名有严格限制: - 数据库名
- 长度不超过 64 个字符。 - 以小写字母开头,可包含字母、数字和下划线(_
)。 - 禁止包含连续两个及以上的下划线,且不能命名为 analyticdb
。 - 表名
- 长度为 1~127 个字符。 - 以字母或下划线开头,可包含字母、数字和下划线。 - 禁止包含引号、感叹号(!
)和空格,且不能是 SQL 保留关键字。 - 列名
- 长度为 1~127 个字符。 - 命名规则与表名一致。 - 账号名
- 长度规则:
- 内核版本低于 3.1.9.4:长度为 2~16。
- 内核版本 3.1.9.4 及以上:长度为 2~64。
- 以小写字母开头,以小写字母或数字结尾,可包含小写字母、数字和下划线。
ADB 支持多种高级 SQL 功能,满足复杂的数据分析需求: - 使用 HAVING 子句过滤分组聚合数据
示例:查询每个市场细分和国家代码组合的客户数量及总账户余额,仅显示总账户余额大于 5700000 的分组:
SELECT COUNT(*), mktsegment, nationkey,
CAST(SUM(acctbal) AS BIGINT) AS totalbal
FROM customer
GROUP BY mktsegment, nationkey
HAVING SUM(acctbal) > 5700000
ORDER BY totalbal DESC;
SPLIT
函数将字符串分割为数组,并通过 CROSS JOIN
和 UNNEST
将数组元素转换为单独的行。例如:
SELECT userid, col
FROM (
SELECT userid, SPLIT(product, ',') AS numbers_array
FROM test
)
CROSS JOIN UNNEST(numbers_array) AS temp_table(col);
SELECT id,
(SELECT MIN(discount)
FROM item
WHERE goods.id = goods_id)
FROM goods;
注意:关联列仅允许出现在子查询的 WHERE
子句中,且子查询不能返回多行结果。
ADB 支持高效访问和管理外部数据源,包括 MaxCompute 和 Hadoop 生态系统: - 创建 ODPS Foreign Table
1. 创建 ODPS FDW 插件: sql CREATE EXTENSION odps_fdw;
2. 创建 ODPS Server 和 User Mapping: ```sql CREATE SERVER odps_serv FOREIGN DATA WRAPPER odps_fdw OPTIONS (tunnel_endpoint '
CREATE USER MAPPING FOR username
SERVER odps_serv
OPTIONS (id '<odps access id>', key '<odps access key>');
```
CREATE FOREIGN TABLE odps_table_name (
column_name data_type [, ...]
)
SERVER odps_serv
OPTIONS (project '<odps project>', table '<odps table>');
CREATE EXTENSION pxf;
CREATE EXTERNAL TABLE <table_name>
( <column_name> <data_type> [, ...] | LIKE <other_table> )
LOCATION('pxf://<path-to-data>?PROFILE[&<custom-option>=<value>[...]]&[SERVER=value]')
FORMAT '[TEXT|CSV|CUSTOM]' (<formatting-properties>);
SELECT os, device, city, COUNT(*) AS num
FROM requests
GROUP BY os, device, city
ORDER BY 2 DESC, 4 ASC
LIMIT 5;
UNION
、INTERSECT
和 EXCEPT
操作,用于合并或比较查询结果。语法如下:
query
{ UNION [ ALL ] | INTERSECT | EXCEPT }
query
通过以上技巧,您可以显著提升 ADB 的使用效率和查询性能。
阿里云自主研发的云原生数据仓库,具有高并发读写、低峰谷读写、弹性扩展、安全可靠等特性,可支持PB级别数据存储,可广泛应用于BI、机器学习、实时分析、数据挖掘等场景。包含AnalyticDB MySQL版、AnalyticDB PostgreSQL 版。