@clickzetta/cz-cli-darwin-arm64 0.3.81 → 0.3.84
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/cz-cli +0 -0
- package/bin/skills/clickzetta-access-control/LICENSE +16 -0
- package/bin/skills/clickzetta-access-control/SKILL.md +243 -0
- package/bin/skills/clickzetta-access-control/eval_cases.jsonl +3 -0
- package/bin/skills/clickzetta-access-control/references/dynamic-masking.md +86 -0
- package/bin/skills/clickzetta-access-control/references/grant-revoke.md +103 -0
- package/bin/skills/clickzetta-access-control/references/role-management.md +66 -0
- package/bin/skills/clickzetta-access-control/references/user-management.md +61 -0
- package/bin/skills/clickzetta-app-python-sdk/LICENSE +16 -0
- package/bin/skills/clickzetta-app-python-sdk/SKILL.md +153 -0
- package/bin/skills/clickzetta-app-python-sdk/eval_cases.jsonl +12 -0
- package/bin/skills/clickzetta-app-python-sdk/references/bulkload.md +196 -0
- package/bin/skills/clickzetta-app-python-sdk/references/connector.md +143 -0
- package/bin/skills/clickzetta-app-python-sdk/references/realtime.md +122 -0
- package/bin/skills/clickzetta-batch-sync-pipeline/LICENSE +16 -0
- package/bin/skills/clickzetta-batch-sync-pipeline/SKILL.md +227 -0
- package/bin/skills/clickzetta-batch-sync-pipeline/eval_cases.jsonl +5 -0
- package/bin/skills/clickzetta-bi-connect/LICENSE +16 -0
- package/bin/skills/clickzetta-bi-connect/SKILL.md +176 -0
- package/bin/skills/clickzetta-bi-connect/eval_cases.jsonl +5 -0
- package/bin/skills/clickzetta-bi-connect/references/bi-tools.md +170 -0
- package/bin/skills/clickzetta-cdc-sync-pipeline/LICENSE +16 -0
- package/bin/skills/clickzetta-cdc-sync-pipeline/SKILL.md +633 -0
- package/bin/skills/clickzetta-cdc-sync-pipeline/eval_cases.jsonl +5 -0
- package/bin/skills/clickzetta-data-ingest-pipeline/LICENSE +16 -0
- package/bin/skills/clickzetta-data-ingest-pipeline/SKILL.md +237 -0
- package/bin/skills/clickzetta-data-ingest-pipeline/eval_cases.jsonl +5 -0
- package/bin/skills/clickzetta-data-retention/LICENSE +16 -0
- package/bin/skills/clickzetta-data-retention/SKILL.md +160 -0
- package/bin/skills/clickzetta-data-retention/eval_cases.jsonl +5 -0
- package/bin/skills/clickzetta-data-retention/references/lifecycle-reference.md +175 -0
- package/bin/skills/clickzetta-data-science/LICENSE +16 -0
- package/bin/skills/clickzetta-data-science/SKILL.md +125 -0
- package/bin/skills/clickzetta-data-science/eval_cases.jsonl +12 -0
- package/bin/skills/clickzetta-data-science/references/bitmap-profile.md +146 -0
- package/bin/skills/clickzetta-data-science/references/data-patterns.md +110 -0
- package/bin/skills/clickzetta-data-science/references/setup.md +160 -0
- package/bin/skills/clickzetta-data-science/references/stats-functions.md +195 -0
- package/bin/skills/clickzetta-data-science/references/write-and-infer.md +122 -0
- package/bin/skills/clickzetta-data-science/references/zettapark-api.md +156 -0
- package/bin/skills/clickzetta-data-sharing/LICENSE +16 -0
- package/bin/skills/clickzetta-data-sharing/SKILL.md +160 -0
- package/bin/skills/clickzetta-data-sharing/eval_cases.jsonl +3 -0
- package/bin/skills/clickzetta-data-sharing/references/share-ddl.md +134 -0
- package/bin/skills/clickzetta-dba-guide/LICENSE +16 -0
- package/bin/skills/clickzetta-dba-guide/SKILL.md +542 -0
- package/bin/skills/clickzetta-dba-guide/eval_cases.jsonl +3 -0
- package/bin/skills/clickzetta-dw-modeling/LICENSE +16 -0
- package/bin/skills/clickzetta-dw-modeling/SKILL.md +351 -0
- package/bin/skills/clickzetta-dw-modeling/eval_cases.jsonl +4 -0
- package/bin/skills/clickzetta-dw-modeling/references/modeling-patterns.md +100 -0
- package/bin/skills/clickzetta-dynamic-table/LICENSE +16 -0
- package/bin/skills/clickzetta-dynamic-table/SKILL.md +230 -0
- package/bin/skills/clickzetta-dynamic-table/best-practices/dimension-table-join-guide.md +253 -0
- package/bin/skills/clickzetta-dynamic-table/best-practices/medallion-and-stream-patterns.md +124 -0
- package/bin/skills/clickzetta-dynamic-table/best-practices/non-partitioned-merge-into-warning.md +96 -0
- package/bin/skills/clickzetta-dynamic-table/best-practices/performance-optimization.md +109 -0
- package/bin/skills/clickzetta-dynamic-table/best-practices/scheduling-guide.md +135 -0
- package/bin/skills/clickzetta-dynamic-table/dt-creator/SKILL.md +15 -0
- package/bin/skills/clickzetta-dynamic-table/dt-creator/references/dt-declaration-strategy.md +185 -0
- package/bin/skills/clickzetta-dynamic-table/dt-creator/references/incremental-config-reference.md +427 -0
- package/bin/skills/clickzetta-dynamic-table/dt-creator/references/refresh-history-guide.md +260 -0
- package/bin/skills/clickzetta-dynamic-table/dt-creator/references/sql-limitations.md +80 -0
- package/bin/skills/clickzetta-dynamic-table/dynamic-table-alter/SKILL.md +190 -0
- package/bin/skills/clickzetta-dynamic-table/eval_cases.jsonl +5 -0
- package/bin/skills/clickzetta-dynamic-table/sql-to-dt/SKILL.md +27 -0
- package/bin/skills/clickzetta-dynamic-table/sql-to-dt/references/sql2dt-column-validation-rules.md +118 -0
- package/bin/skills/clickzetta-dynamic-table/sql-to-dt/references/sql2dt-conversion-rules.md +225 -0
- package/bin/skills/clickzetta-dynamic-table/sql-to-dt/references/sql2dt-placeholder-rules.md +182 -0
- package/bin/skills/clickzetta-dynamic-table/sql-to-dt/references/sql2dt-refresh-rules.md +98 -0
- package/bin/skills/clickzetta-dynamic-table/sql-to-dt/references/sql2dt-self-reference-rules.md +76 -0
- package/bin/skills/clickzetta-dynamic-table/sql-to-dt/references/sql2dt-workflow.md +109 -0
- package/bin/skills/clickzetta-external-catalog/LICENSE +16 -0
- package/bin/skills/clickzetta-external-catalog/SKILL.md +123 -0
- package/bin/skills/clickzetta-external-catalog/eval_cases.jsonl +5 -0
- package/bin/skills/clickzetta-external-catalog/references/external-catalog-ddl.md +130 -0
- package/bin/skills/clickzetta-external-function/LICENSE +16 -0
- package/bin/skills/clickzetta-external-function/SKILL.md +203 -0
- package/bin/skills/clickzetta-external-function/eval_cases.jsonl +4 -0
- package/bin/skills/clickzetta-external-function/references/external-function-ddl.md +171 -0
- package/bin/skills/clickzetta-file-import-pipeline/LICENSE +16 -0
- package/bin/skills/clickzetta-file-import-pipeline/SKILL.md +190 -0
- package/bin/skills/clickzetta-file-import-pipeline/eval_cases.jsonl +5 -0
- package/bin/skills/clickzetta-index-manager/LICENSE +16 -0
- package/bin/skills/clickzetta-index-manager/SKILL.md +140 -0
- package/bin/skills/clickzetta-index-manager/eval_cases.jsonl +5 -0
- package/bin/skills/clickzetta-index-manager/references/bloomfilter-index.md +67 -0
- package/bin/skills/clickzetta-index-manager/references/index-management.md +73 -0
- package/bin/skills/clickzetta-index-manager/references/inverted-index.md +80 -0
- package/bin/skills/clickzetta-index-manager/references/vector-index.md +81 -0
- package/bin/skills/clickzetta-java-sdk/LICENSE +16 -0
- package/bin/skills/clickzetta-java-sdk/SKILL.md +186 -0
- package/bin/skills/clickzetta-java-sdk/eval_cases.jsonl +12 -0
- package/bin/skills/clickzetta-java-sdk/references/bulkload.md +163 -0
- package/bin/skills/clickzetta-java-sdk/references/realtime.md +212 -0
- package/bin/skills/clickzetta-kafka-ingest-pipeline/LICENSE +16 -0
- package/bin/skills/clickzetta-kafka-ingest-pipeline/SKILL.md +769 -0
- package/bin/skills/clickzetta-kafka-ingest-pipeline/eval_cases.jsonl +5 -0
- package/bin/skills/clickzetta-kafka-ingest-pipeline/references/kafka-pipe-syntax.md +324 -0
- package/bin/skills/clickzetta-lakehouse-connect/LICENSE +16 -0
- package/bin/skills/clickzetta-lakehouse-connect/SKILL.md +218 -0
- package/bin/skills/clickzetta-lakehouse-connect/eval_cases.jsonl +3 -0
- package/bin/skills/clickzetta-lakehouse-connect/evals/evals.json +35 -0
- package/bin/skills/clickzetta-lakehouse-connect/references/config-file.md +435 -0
- package/bin/skills/clickzetta-lakehouse-connect/references/jdbc.md +478 -0
- package/bin/skills/clickzetta-lakehouse-connect/references/python-sdk.md +225 -0
- package/bin/skills/clickzetta-lakehouse-connect/references/sqlalchemy.md +468 -0
- package/bin/skills/clickzetta-lakehouse-connect/references/zettapark-session.md +445 -0
- package/bin/skills/clickzetta-manage-comments/LICENSE +16 -0
- package/bin/skills/clickzetta-manage-comments/SKILL.md +219 -0
- package/bin/skills/clickzetta-manage-comments/eval_cases.jsonl +3 -0
- package/bin/skills/clickzetta-metadata/LICENSE +16 -0
- package/bin/skills/clickzetta-metadata/SKILL.md +502 -0
- package/bin/skills/clickzetta-metadata/eval_cases.jsonl +5 -0
- package/bin/skills/clickzetta-metadata/references/instance-views-reference.md +276 -0
- package/bin/skills/clickzetta-metadata/references/metering-views-reference.md +137 -0
- package/bin/skills/clickzetta-metadata/references/show-desc-reference.md +326 -0
- package/bin/skills/clickzetta-metadata/references/views-reference.md +271 -0
- package/bin/skills/clickzetta-monitoring/LICENSE +16 -0
- package/bin/skills/clickzetta-monitoring/SKILL.md +215 -0
- package/bin/skills/clickzetta-monitoring/eval_cases.jsonl +5 -0
- package/bin/skills/clickzetta-monitoring/references/job-history-analysis.md +97 -0
- package/bin/skills/clickzetta-monitoring/references/show-jobs.md +48 -0
- package/bin/skills/clickzetta-oss-ingest-pipeline/LICENSE +16 -0
- package/bin/skills/clickzetta-oss-ingest-pipeline/SKILL.md +562 -0
- package/bin/skills/clickzetta-oss-ingest-pipeline/eval_cases.jsonl +5 -0
- package/bin/skills/clickzetta-overview/LICENSE +16 -0
- package/bin/skills/clickzetta-overview/SKILL.md +102 -0
- package/bin/skills/clickzetta-overview/eval_cases.jsonl +5 -0
- package/bin/skills/clickzetta-overview/references/brands-and-endpoints.md +79 -0
- package/bin/skills/clickzetta-overview/references/object-model.md +311 -0
- package/bin/skills/clickzetta-overview/references/studio-modules.md +173 -0
- package/bin/skills/clickzetta-pipeline-review/LICENSE +16 -0
- package/bin/skills/clickzetta-pipeline-review/SKILL.md +377 -0
- package/bin/skills/clickzetta-query-optimizer/LICENSE +16 -0
- package/bin/skills/clickzetta-query-optimizer/SKILL.md +156 -0
- package/bin/skills/clickzetta-query-optimizer/eval_cases.jsonl +5 -0
- package/bin/skills/clickzetta-query-optimizer/references/explain.md +56 -0
- package/bin/skills/clickzetta-query-optimizer/references/hints-and-sortkey.md +78 -0
- package/bin/skills/clickzetta-query-optimizer/references/optimize.md +65 -0
- package/bin/skills/clickzetta-query-optimizer/references/result-cache.md +49 -0
- package/bin/skills/clickzetta-query-optimizer/references/show-jobs.md +42 -0
- package/bin/skills/clickzetta-realtime-sync-pipeline/LICENSE +16 -0
- package/bin/skills/clickzetta-realtime-sync-pipeline/SKILL.md +323 -0
- package/bin/skills/clickzetta-realtime-sync-pipeline/eval_cases.jsonl +5 -0
- package/bin/skills/clickzetta-semantic-view/LICENSE +16 -0
- package/bin/skills/clickzetta-semantic-view/SKILL.md +207 -0
- package/bin/skills/clickzetta-semantic-view/eval_cases.jsonl +12 -0
- package/bin/skills/clickzetta-semantic-view/references/semantic-view-reference.md +167 -0
- package/bin/skills/clickzetta-spark-flink-connector/LICENSE +16 -0
- package/bin/skills/clickzetta-spark-flink-connector/SKILL.md +92 -0
- package/bin/skills/clickzetta-spark-flink-connector/eval_cases.jsonl +5 -0
- package/bin/skills/clickzetta-spark-flink-connector/references/flink.md +147 -0
- package/bin/skills/clickzetta-spark-flink-connector/references/spark.md +132 -0
- package/bin/skills/clickzetta-sql-pipeline-manager/LICENSE +16 -0
- package/bin/skills/clickzetta-sql-pipeline-manager/SKILL.md +485 -0
- package/bin/skills/clickzetta-sql-pipeline-manager/eval_cases.jsonl +12 -0
- package/bin/skills/clickzetta-sql-pipeline-manager/evals/evals.json +166 -0
- package/bin/skills/clickzetta-sql-pipeline-manager/references/dynamic-table.md +185 -0
- package/bin/skills/clickzetta-sql-pipeline-manager/references/materialized-view.md +129 -0
- package/bin/skills/clickzetta-sql-pipeline-manager/references/pipe.md +222 -0
- package/bin/skills/clickzetta-sql-pipeline-manager/references/table-stream.md +125 -0
- package/bin/skills/clickzetta-sql-syntax-guide/LICENSE +16 -0
- package/bin/skills/clickzetta-sql-syntax-guide/SKILL.md +249 -0
- package/bin/skills/clickzetta-sql-syntax-guide/eval_cases.jsonl +3 -0
- package/bin/skills/clickzetta-sql-syntax-guide/references/ddl-reference.md +350 -0
- package/bin/skills/clickzetta-sql-syntax-guide/references/dml-reference.md +279 -0
- package/bin/skills/clickzetta-sql-syntax-guide/references/dql-reference.md +504 -0
- package/bin/skills/clickzetta-sql-syntax-guide/references/functions-reference.md +372 -0
- package/bin/skills/clickzetta-sql-syntax-guide/references/migration-databricks.md +260 -0
- package/bin/skills/clickzetta-sql-syntax-guide/references/migration-snowflake.md +382 -0
- package/bin/skills/clickzetta-sql-syntax-guide/references/vs-snowflake.md +346 -0
- package/bin/skills/clickzetta-sql-syntax-guide/references/vs-spark.md +229 -0
- package/bin/skills/clickzetta-studio-task-manager/LICENSE +16 -0
- package/bin/skills/clickzetta-studio-task-manager/SKILL.md +652 -0
- package/bin/skills/clickzetta-table-lineage/LICENSE +16 -0
- package/bin/skills/clickzetta-table-lineage/SKILL.md +90 -0
- package/bin/skills/clickzetta-table-lineage/eval_cases.jsonl +1 -0
- package/bin/skills/clickzetta-table-lineage/references/normalize_func.sql +14 -0
- package/bin/skills/clickzetta-table-lineage/references/table_cost.sql +38 -0
- package/bin/skills/clickzetta-table-lineage/references/table_lineage_standalone.html +562 -0
- package/bin/skills/clickzetta-table-lineage/references/table_relation.sql +25 -0
- package/bin/skills/clickzetta-table-stream-pipeline/LICENSE +16 -0
- package/bin/skills/clickzetta-table-stream-pipeline/SKILL.md +206 -0
- package/bin/skills/clickzetta-table-stream-pipeline/eval_cases.jsonl +5 -0
- package/bin/skills/clickzetta-vcluster-manager/LICENSE +16 -0
- package/bin/skills/clickzetta-vcluster-manager/SKILL.md +212 -0
- package/bin/skills/clickzetta-vcluster-manager/eval_cases.jsonl +5 -0
- package/bin/skills/clickzetta-vcluster-manager/references/vc-cache.md +54 -0
- package/bin/skills/clickzetta-vcluster-manager/references/vcluster-ddl.md +150 -0
- package/bin/skills/clickzetta-volume-manager/LICENSE +16 -0
- package/bin/skills/clickzetta-volume-manager/SKILL.md +292 -0
- package/bin/skills/clickzetta-volume-manager/eval_cases.jsonl +5 -0
- package/bin/skills/clickzetta-volume-manager/references/volume-ddl.md +199 -0
- package/bin/skills/clickzetta-zettapark/LICENSE +16 -0
- package/bin/skills/clickzetta-zettapark/SKILL.md +248 -0
- package/bin/skills/clickzetta-zettapark/eval_cases.jsonl +12 -0
- package/bin/skills/clickzetta-zettapark/references/zettapark-api.md +283 -0
- package/bin/skills/cz-cli/SKILL.md +313 -0
- package/bin/skills/cz-cli/references/profile-setup.md +120 -0
- package/package.json +1 -1
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: clickzetta-pipeline-review
|
|
3
|
+
description: |
|
|
4
|
+
对 ClickZetta Lakehouse 数据管道进行全面 Review 与诊断。从任意入口(任务名/schema/表名/
|
|
5
|
+
业务域关键词)出发,自主发现管道涉及的全部对象(Studio 任务、Lakehouse 表、管道对象、
|
|
6
|
+
运行记录),识别调度依赖缺失、DDL 幂等问题、分层跳层、DT 反模式等常见问题,
|
|
7
|
+
给出优先级排序的修复建议并执行。
|
|
8
|
+
当用户说"Review 管道"、"检查数据管道"、"管道诊断"、"管道有问题"、"任务跑失败了"、
|
|
9
|
+
"数据不对"、"管道 Review"、"pipeline review"、"检查 ETL"、"管道健康检查"、
|
|
10
|
+
"数据链路检查"、"管道全貌"、"管道梳理"时触发。
|
|
11
|
+
Keywords: pipeline review, diagnosis, task dependency, data lineage, DT health, pipeline discovery
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# ClickZetta 数据管道 Review 指南
|
|
15
|
+
|
|
16
|
+
## 向导:收集必要信息
|
|
17
|
+
|
|
18
|
+
收到 Review 请求后,**不要立即开始探索**。先通过向导收集必要信息,再启动五阶段流程。
|
|
19
|
+
|
|
20
|
+
### 第 0 步:信息收集(必须完成,不得跳过)
|
|
21
|
+
|
|
22
|
+
优先使用交互式问答工具(如 `question`)收集以下信息并弹出选项菜单;若无此类工具,则用文字一次性列出所有问题:
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
question({
|
|
26
|
+
questions: [
|
|
27
|
+
{
|
|
28
|
+
question: "Review 范围?",
|
|
29
|
+
options: [
|
|
30
|
+
{ label: "全量 Review", description: "发现所有问题,给出完整报告" },
|
|
31
|
+
{ label: "专项诊断", description: "只看某类问题,如任务依赖、DT 刷新失败、数据不一致" },
|
|
32
|
+
{ label: "快速健康检查", description: "只看 P0 问题,5 分钟内出结论" }
|
|
33
|
+
]
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
question: "执行权限?",
|
|
37
|
+
options: [
|
|
38
|
+
{ label: "可读写", description: "可以执行修复操作(推荐)" },
|
|
39
|
+
{ label: "只读", description: "只能查,输出报告不执行修复" }
|
|
40
|
+
]
|
|
41
|
+
}
|
|
42
|
+
]
|
|
43
|
+
})
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
管道入口(业务域/任务名/schema/表名)和已知症状可在用户回答后追问,或从上下文推断。
|
|
47
|
+
|
|
48
|
+
### 根据回答调整策略
|
|
49
|
+
|
|
50
|
+
| Review 范围 | 执行权限 | 策略 |
|
|
51
|
+
|---|---|---|
|
|
52
|
+
| 全量 Review | 可读写 | 走完五阶段,发现问题后询问是否执行修复 |
|
|
53
|
+
| 全量 Review | 只读 | 走完五阶段,输出问题报告,不执行修复 |
|
|
54
|
+
| 专项诊断 | 任意 | 只执行对应阶段的检查项,跳过无关步骤 |
|
|
55
|
+
| 快速健康检查 | 任意 | 只检查 P0 问题(依赖缺失、DT 持续失败),5 分钟内出结论 |
|
|
56
|
+
|
|
57
|
+
**如果用户已经在请求中提供了足够信息(如"帮我 Review shenyu_gateway 管道,全量 Review,可以修复"),直接进入第一阶段,不再重复询问。**
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## 工作模式:五阶段 Review 流程
|
|
62
|
+
|
|
63
|
+
收集到必要信息后,按以下五阶段执行:
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
发现 → 分析 → 识别问题 → 执行修复 → 验证
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## 第一阶段:发现(管道全貌探索)
|
|
72
|
+
|
|
73
|
+
### 入口识别
|
|
74
|
+
|
|
75
|
+
用户可能从任意层给出入口,从入口向上下游展开:
|
|
76
|
+
|
|
77
|
+
| 用户给出的入口 | 展开方向 |
|
|
78
|
+
|---|---|
|
|
79
|
+
| 业务域关键词(如"shenyu_gateway") | 同时搜索 Studio 任务和 Lakehouse schema |
|
|
80
|
+
| Studio 任务名/目录 | 读任务脚本 → 找涉及的表 → 找上下游任务 |
|
|
81
|
+
| Lakehouse 表名/schema | 找写入该表的任务 → 找读取该表的 DT/任务 |
|
|
82
|
+
| 管道对象(Pipe/DT/Stream) | 找源表和目标表 → 找关联任务 |
|
|
83
|
+
| 错误信息/运行 ID | 先定位任务 → 再展开全貌 |
|
|
84
|
+
|
|
85
|
+
### 探索四层
|
|
86
|
+
|
|
87
|
+
**无论入口是什么,都要探索以下四层,缺一不可:**
|
|
88
|
+
|
|
89
|
+
**层 1 — Studio 任务层**
|
|
90
|
+
```bash
|
|
91
|
+
# 按业务域关键词找任务目录
|
|
92
|
+
cz-cli task list-folders
|
|
93
|
+
|
|
94
|
+
# 列出目录下所有任务
|
|
95
|
+
cz-cli task list --folder <folder>
|
|
96
|
+
|
|
97
|
+
# 读每个任务的脚本和配置(重点看:task_type、cron_express、task_dependencies、edit_state)
|
|
98
|
+
cz-cli task content <task_id>
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
**层 2 — Lakehouse 对象层**
|
|
102
|
+
```sql
|
|
103
|
+
-- 找相关 schema
|
|
104
|
+
SHOW SCHEMAS;
|
|
105
|
+
|
|
106
|
+
-- 列出各层表
|
|
107
|
+
SHOW TABLES IN <ods_schema>;
|
|
108
|
+
SHOW TABLES IN <dwd_schema>;
|
|
109
|
+
SHOW TABLES IN <dws_schema>;
|
|
110
|
+
SHOW TABLES IN <ads_schema>;
|
|
111
|
+
|
|
112
|
+
-- 找 Dynamic Table
|
|
113
|
+
SHOW TABLES IN <schema> WHERE is_dynamic;
|
|
114
|
+
|
|
115
|
+
-- 找 Pipe
|
|
116
|
+
SHOW PIPES;
|
|
117
|
+
|
|
118
|
+
-- 找 Table Stream
|
|
119
|
+
SHOW TABLE STREAMS;
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
**层 3 — 运行记录层**(配置是"应该怎样",运行记录是"实际怎样")
|
|
123
|
+
```bash
|
|
124
|
+
# 查每个关键任务的最近运行记录
|
|
125
|
+
cz-cli runs list --task <task_name> --limit 10
|
|
126
|
+
|
|
127
|
+
# 发现失败时查日志
|
|
128
|
+
cz-cli runs logs <run_id>
|
|
129
|
+
|
|
130
|
+
# 查运行统计(成功率、平均耗时)
|
|
131
|
+
cz-cli runs stats --task <task_name>
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
**层 4 — 管道对象状态层**
|
|
135
|
+
```sql
|
|
136
|
+
-- Dynamic Table 刷新历史(每张 DT 都要查)
|
|
137
|
+
SHOW DYNAMIC TABLE REFRESH HISTORY <schema>.<table> LIMIT 10;
|
|
138
|
+
|
|
139
|
+
-- Pipe 状态
|
|
140
|
+
DESC PIPE <pipe_name>;
|
|
141
|
+
|
|
142
|
+
-- Table Stream 积压
|
|
143
|
+
SELECT COUNT(*) FROM <stream_name>;
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### 发现阶段输出
|
|
147
|
+
|
|
148
|
+
完成四层探索后,向用户呈现管道全貌摘要:
|
|
149
|
+
```
|
|
150
|
+
管道全貌:
|
|
151
|
+
- Studio 任务:N 个(列出名称、类型、状态、cron)
|
|
152
|
+
- ODS 层:N 张表
|
|
153
|
+
- DWD 层:N 张表
|
|
154
|
+
- DWS/ADS 层:N 张 Dynamic Table
|
|
155
|
+
- 管道对象:Pipe × N,Table Stream × N
|
|
156
|
+
- 运行记录:最近 N 次,成功率 X%
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
## 第二阶段:分析(深度读取)
|
|
162
|
+
|
|
163
|
+
发现阶段只是"找到了什么",分析阶段要"读懂内容":
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
# 读每个任务的完整脚本
|
|
167
|
+
cz-cli task content <task_id>
|
|
168
|
+
|
|
169
|
+
# 重点关注:
|
|
170
|
+
# - task_dependencies:是否配置了上下游依赖
|
|
171
|
+
# - cron_express:调度时间是否合理
|
|
172
|
+
# - edit_state:20=DRAFT,30=PUBLISHED
|
|
173
|
+
# - task_type:SQL任务/同步任务/实时同步
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
**同步任务运行模式判断(不能只看单一字段):**
|
|
177
|
+
|
|
178
|
+
| 字段 | 不能单独判断 | 需要综合判断 |
|
|
179
|
+
|---|---|---|
|
|
180
|
+
| `readMode: BINLOG` | ❌ 不代表 CDC 实时 | 还需看 cron_express、pkWriteMode、运行记录 |
|
|
181
|
+
| `pkWriteMode: OVERWRITE` | 覆盖写 → 离线批量 | 结合 cron 和运行记录确认 |
|
|
182
|
+
| 运行记录只有 1 条手动触发 | → 定时调度可能未生效 | 需确认 cron 是否正常触发 |
|
|
183
|
+
|
|
184
|
+
**综合判断规则**:
|
|
185
|
+
- `cron_express` 有值 + `pkWriteMode: OVERWRITE` + 运行记录为定时触发 → **离线批量同步**
|
|
186
|
+
- `cron_express` 为空 + 任务持续运行状态 → **实时同步(CDC/Kafka)**
|
|
187
|
+
- 运行记录全是手动触发 → **调度未生效,需排查**
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## 第三阶段:识别问题
|
|
192
|
+
|
|
193
|
+
### 检查清单(按优先级)
|
|
194
|
+
|
|
195
|
+
**🔴 P0 — 调度依赖缺失**
|
|
196
|
+
|
|
197
|
+
```bash
|
|
198
|
+
# 检查每个 ETL/转换任务的依赖配置
|
|
199
|
+
cz-cli task content <task_id>
|
|
200
|
+
# 查看 task_dependencies 字段是否为空数组 []
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
- ETL 转换任务的 `task_dependencies` 为空 → **P0,必须修复**
|
|
204
|
+
- 上游同步任务未完成时下游就开始执行 → 读到旧数据或空数据
|
|
205
|
+
- 运行记录时间线混乱(多次手动触发、时间间隔异常)→ 依赖缺失的典型症状
|
|
206
|
+
|
|
207
|
+
**🔴 P0 — Dynamic Table 刷新持续失败**
|
|
208
|
+
|
|
209
|
+
```sql
|
|
210
|
+
SHOW DYNAMIC TABLE REFRESH HISTORY <schema>.<table> LIMIT 10;
|
|
211
|
+
-- status 连续出现 FAILED → P0
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
**🟡 P1 — DDL 幂等性问题**
|
|
215
|
+
|
|
216
|
+
Dynamic Table 的 DDL 应统一使用 `CREATE OR REPLACE`,不要用 `DROP + CREATE` 两步:
|
|
217
|
+
- `DROP` 和 `CREATE` 之间存在竞态条件
|
|
218
|
+
- 如果 `CREATE` 失败,表已被删除,数据丢失
|
|
219
|
+
|
|
220
|
+
```sql
|
|
221
|
+
-- ❌ 有竞态风险
|
|
222
|
+
DROP DYNAMIC TABLE IF EXISTS schema.table;
|
|
223
|
+
CREATE DYNAMIC TABLE schema.table ...;
|
|
224
|
+
|
|
225
|
+
-- ✅ 原子操作
|
|
226
|
+
CREATE OR REPLACE DYNAMIC TABLE schema.table ...;
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
> ⚠️ `CREATE OR REPLACE` 有类型变更限制:字段类型变更(如 `TINYINT → BOOLEAN`)会报错。
|
|
230
|
+
> 解决方案:用 `CAST(col AS TINYINT)` 保持类型兼容,或先 `DROP` 再 `CREATE`。
|
|
231
|
+
|
|
232
|
+
**🟡 P1 — DWS 层跳过 DWD 直接读 ODS**
|
|
233
|
+
|
|
234
|
+
```sql
|
|
235
|
+
-- 检查 DWS 层 DT 的 SQL 定义,看 FROM 子句引用的是哪一层
|
|
236
|
+
SHOW CREATE TABLE <dws_schema>.<table>;
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
- DWS 层应从 DWD 层读取,不应直接读 ODS
|
|
240
|
+
- 跳层问题:重复计算(DWD 已做的 JSON 解析/类型转换在 DWS 又做一遍)、口径不一致、维护成本高
|
|
241
|
+
|
|
242
|
+
**🟡 P1 — Dynamic Table 定义中包含 ORDER BY**
|
|
243
|
+
|
|
244
|
+
```sql
|
|
245
|
+
-- 查看 DT 定义
|
|
246
|
+
SHOW CREATE TABLE <schema>.<dt_name>;
|
|
247
|
+
-- 如果 AS 子句中有 ORDER BY → 需要移除
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
- DT 的 `ORDER BY` 仅在查询时生效,不影响存储顺序
|
|
251
|
+
- 每次刷新额外消耗计算资源做排序,无实际收益
|
|
252
|
+
- 排序逻辑应放在查询端(BI 工具或下游 SQL)
|
|
253
|
+
|
|
254
|
+
**🟢 P2 — DDL 任务保留 Cron 配置**
|
|
255
|
+
|
|
256
|
+
```bash
|
|
257
|
+
cz-cli task content <ddl_task_id>
|
|
258
|
+
# edit_state=20(DRAFT)但 cron_express 不为空 → P2
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
- DRAFT 状态不会实际执行,但保留 Cron 配置容易误导维护者
|
|
262
|
+
- 建议清理,非紧急
|
|
263
|
+
|
|
264
|
+
**🟢 P2 — Studio 任务脚本与实际 DT 定义不一致**
|
|
265
|
+
|
|
266
|
+
直接通过 SQL 重建 DT 后,Studio 任务脚本不会自动同步:
|
|
267
|
+
|
|
268
|
+
```bash
|
|
269
|
+
# 检查:读 Studio 任务脚本
|
|
270
|
+
cz-cli task content <task_id>
|
|
271
|
+
|
|
272
|
+
# 对比:读实际 DT 定义(执行以下 SQL)
|
|
273
|
+
# SHOW CREATE TABLE <schema>.<table>
|
|
274
|
+
|
|
275
|
+
# 如果不一致,同步 Studio 任务脚本
|
|
276
|
+
cz-cli task save-content <task_id> --content "<new_sql>"
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
---
|
|
280
|
+
|
|
281
|
+
## 第四阶段:执行修复
|
|
282
|
+
|
|
283
|
+
### 修复依赖配置
|
|
284
|
+
|
|
285
|
+
```bash
|
|
286
|
+
# 为 ETL 任务配置上游依赖
|
|
287
|
+
cz-cli task save-config <task_id> --deps replace \
|
|
288
|
+
--dep-tasks '[{"taskId":<upstream_id>,"taskName":"<upstream_name>"}]'
|
|
289
|
+
|
|
290
|
+
# 部署生效
|
|
291
|
+
cz-cli task deploy <task_id> -y
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
### 修复 DT DDL(统一为 CREATE OR REPLACE)
|
|
295
|
+
|
|
296
|
+
```sql
|
|
297
|
+
-- 先确认字段类型,避免类型变更报错
|
|
298
|
+
SHOW CREATE TABLE <schema>.<table>;
|
|
299
|
+
|
|
300
|
+
-- 执行重建(如有类型变更,用 CAST 保持兼容)
|
|
301
|
+
CREATE OR REPLACE DYNAMIC TABLE <schema>.<table>
|
|
302
|
+
REFRESH INTERVAL <n> <unit> vcluster <gp_cluster>
|
|
303
|
+
AS
|
|
304
|
+
SELECT ...
|
|
305
|
+
FROM <dwd_schema>.<table> -- 确保从 DWD 层读取,不跳层
|
|
306
|
+
...; -- 移除 ORDER BY
|
|
307
|
+
|
|
308
|
+
-- 立即触发首次刷新
|
|
309
|
+
REFRESH DYNAMIC TABLE <schema>.<table>;
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
### 同步 Studio 任务脚本
|
|
313
|
+
|
|
314
|
+
```bash
|
|
315
|
+
# SQL 重建 DT 后,同步 Studio 任务脚本保持一致
|
|
316
|
+
cz-cli task save-content <task_id> --content "<updated_sql>"
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
### 执行原则
|
|
320
|
+
|
|
321
|
+
- **直接 SQL 操作**(重建 DT、修改表结构)→ 执行对应 SQL,执行前向用户确认
|
|
322
|
+
- **Studio 任务配置**(依赖、Cron、脚本)→ 用 `cz-cli task save-*` + `deploy`
|
|
323
|
+
- **两者都改时**:先改 SQL(数据层),再同步 Studio(配置层)
|
|
324
|
+
|
|
325
|
+
---
|
|
326
|
+
|
|
327
|
+
## 第五阶段:验证
|
|
328
|
+
|
|
329
|
+
修复完成后,**逐项验证**,不跳过:
|
|
330
|
+
|
|
331
|
+
```sql
|
|
332
|
+
-- 1. Dynamic Table 刷新状态
|
|
333
|
+
SHOW DYNAMIC TABLE REFRESH HISTORY <schema>.<table> LIMIT 5;
|
|
334
|
+
-- 确认最近一次 status = SUCCESS
|
|
335
|
+
|
|
336
|
+
-- 2. 各层行数
|
|
337
|
+
SELECT COUNT(*) FROM <ods_schema>.<table>;
|
|
338
|
+
SELECT COUNT(*) FROM <dwd_schema>.<table>;
|
|
339
|
+
SELECT COUNT(*) FROM <dws_schema>.<table>;
|
|
340
|
+
|
|
341
|
+
-- 3. 关键字段非空率
|
|
342
|
+
SELECT ROUND(COUNT(key_field) * 100.0 / COUNT(*), 2) AS non_null_pct
|
|
343
|
+
FROM <schema>.<table>;
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
```bash
|
|
347
|
+
# 4. 确认任务依赖已生效
|
|
348
|
+
cz-cli task content <task_id>
|
|
349
|
+
# 查看 task_dependencies 不再为空
|
|
350
|
+
|
|
351
|
+
# 5. 确认 Studio 任务脚本已同步
|
|
352
|
+
cz-cli task content <task_id>
|
|
353
|
+
# 对比脚本内容与实际 DT 定义一致
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
向用户输出 Review 结论:
|
|
357
|
+
```
|
|
358
|
+
Review 结论:
|
|
359
|
+
- 发现问题:P0 × N,P1 × N,P2 × N
|
|
360
|
+
- 已修复:(列出每项)
|
|
361
|
+
- 未修复/建议:(列出每项及原因)
|
|
362
|
+
- 验证结果:各层行数、DT 刷新状态
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
---
|
|
366
|
+
|
|
367
|
+
## 常见问题速查
|
|
368
|
+
|
|
369
|
+
| 现象 | 根因 | 排查命令 |
|
|
370
|
+
|---|---|---|
|
|
371
|
+
| ETL 任务读到旧数据 | 依赖缺失,上游未完成就开始执行 | `cz-cli task content` 查 task_dependencies |
|
|
372
|
+
| 运行记录时间线混乱 | 依赖缺失,多次手动触发 | `cz-cli runs list` 看触发方式 |
|
|
373
|
+
| DT 刷新报"表已存在" | DROP+CREATE 竞态,或 CREATE OR REPLACE 类型冲突 | `SHOW CREATE TABLE` 确认字段类型 |
|
|
374
|
+
| DT 刷新时间与预期不符 | REFRESH INTERVAL 以创建时间为基准,不对齐整点 | 创建后立即执行 `REFRESH DYNAMIC TABLE` |
|
|
375
|
+
| Studio 脚本与实际 DT 不一致 | 直接 SQL 重建后未同步 Studio | `cz-cli task save-content` 同步 |
|
|
376
|
+
| 同步任务判断为 CDC 但实为离线 | 只看 readMode 字段,未综合判断 | 结合 cron、pkWriteMode、运行记录综合判断 |
|
|
377
|
+
| DWS 数据与 DWD 口径不一致 | DWS 跳层读 ODS,重复计算 | `SHOW CREATE TABLE` 检查 FROM 子句 |
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
ClickZetta Skills License
|
|
2
|
+
© 2026 Yunqi Inc. All rights reserved.
|
|
3
|
+
LICENSE: Use of these materials (including all code, prompts, assets, files, and other components of these skills (collectively, "Skills")) is governed by your agreement with ClickZetta for the Service. If no separate agreement exists, use is governed by ClickZetta's Terms of Service (available at: https://yunqi.tech/documents/user-aggrement).
|
|
4
|
+
Your applicable agreement is referred to as the "Agreement." "Service" is as defined in the Agreement.
|
|
5
|
+
ADDITIONAL RESTRICTIONS: Notwithstanding anything in the Agreement to the contrary, you may not:
|
|
6
|
+
|
|
7
|
+
Extract from the Service or retain copies of the Skills outside use with the Service;
|
|
8
|
+
Reproduce or copy the Skills, except for temporary copies created automatically during authorized use of the Service;
|
|
9
|
+
Create derivative works based on the Skills;
|
|
10
|
+
Distribute, sublicense, or transfer the Skills to any third party;
|
|
11
|
+
Make, offer to sell, sell, or import any inventions embodied in the Skills; nor,
|
|
12
|
+
Reverse engineer, decompile, or disassemble the Skills.
|
|
13
|
+
|
|
14
|
+
The receipt, viewing, or possession of the Skills does not convey or imply any license or right beyond those expressly granted above.
|
|
15
|
+
Yunqi retains all rights, title, and interest in the Skills, including all copyrights, trademarks, patents, and all other applicable intellectual property rights.
|
|
16
|
+
THE SKILLS ARE PROVIDED "AS IS," WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SKILLS OR THE USE OR OTHER DEALINGS IN THE SKILLS.
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: clickzetta-query-optimizer
|
|
3
|
+
description: |
|
|
4
|
+
诊断和优化 ClickZetta Lakehouse SQL 查询性能。覆盖执行计划分析、慢查询排查、
|
|
5
|
+
结果缓存、小文件合并、Map Join 优化、Sort Key 推荐等完整调优工作流。
|
|
6
|
+
当用户说"查询慢"、"SQL 性能优化"、"执行计划"、"EXPLAIN"、"查看 Job"、
|
|
7
|
+
"慢查询"、"小文件"、"OPTIMIZE"、"结果缓存"、"Result Cache"、
|
|
8
|
+
"Map Join"、"排序列"、"sort key"、"查询调优"、"性能诊断"时触发。
|
|
9
|
+
Keywords: query optimization, EXPLAIN, execution plan, slow query, cache, Map Join, Sort Key
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# ClickZetta 查询性能优化
|
|
13
|
+
|
|
14
|
+
## ⚠️ 注意事项
|
|
15
|
+
|
|
16
|
+
- `OPTIMIZE` 命令只能在**通用型(GENERAL PURPOSE)计算集群**运行,分析型集群不生效
|
|
17
|
+
- Result Cache 默认未开启,需手动 `SET cz.sql.enable.shortcut.result.cache = true`
|
|
18
|
+
- Map Join 小表限制为 **1GB**,超过则失败
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## 诊断流程
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
查询慢
|
|
26
|
+
├── 1. 先看执行计划(EXPLAIN)
|
|
27
|
+
│ ├── 发现全表扫描 → 考虑加索引或设置 sort key
|
|
28
|
+
│ ├── 发现大表 JOIN → 考虑 MAPJOIN hint
|
|
29
|
+
│ └── 发现大量 Sort → 检查 ORDER BY 是否必要
|
|
30
|
+
├── 2. 查看 Job 历史(SHOW JOBS)
|
|
31
|
+
│ └── 找到慢 Job → 在 Studio Job Profile 查看详细执行统计
|
|
32
|
+
├── 3. 检查小文件问题
|
|
33
|
+
│ └── 频繁写入的表 → OPTIMIZE 合并小文件
|
|
34
|
+
└── 4. 利用缓存
|
|
35
|
+
└── 重复查询 → 开启 Result Cache
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## 步骤 1:分析执行计划
|
|
41
|
+
|
|
42
|
+
阅读 [references/explain.md](references/explain.md)
|
|
43
|
+
|
|
44
|
+
```sql
|
|
45
|
+
-- 快速查看物理执行计划
|
|
46
|
+
EXPLAIN SELECT ...;
|
|
47
|
+
|
|
48
|
+
-- 详细查看逻辑+物理执行计划
|
|
49
|
+
EXPLAIN EXTENDED SELECT ...;
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
重点关注:
|
|
53
|
+
- `PhysicalTableScan` 是否扫描了过多数据
|
|
54
|
+
- `PhysicalJoin` 的策略(是否触发 MapJoin)
|
|
55
|
+
- `PhysicalSort` 是否可以避免
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## 步骤 2:查看慢查询 Job
|
|
60
|
+
|
|
61
|
+
阅读 [references/show-jobs.md](references/show-jobs.md)
|
|
62
|
+
|
|
63
|
+
```sql
|
|
64
|
+
-- 查看执行超过 2 分钟的 Job
|
|
65
|
+
SHOW JOBS IN VCLUSTER default_ap WHERE execution_time > interval 2 minute;
|
|
66
|
+
|
|
67
|
+
-- 查看最近 50 条 Job
|
|
68
|
+
SHOW JOBS LIMIT 50;
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
找到 Job ID 后,在 Studio → Job Profile 查看详细执行统计和执行计划图。
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## 步骤 3:小文件优化
|
|
76
|
+
|
|
77
|
+
阅读 [references/optimize.md](references/optimize.md)
|
|
78
|
+
|
|
79
|
+
```sql
|
|
80
|
+
-- 手动合并小文件(异步,立即返回)
|
|
81
|
+
OPTIMIZE my_schema.orders;
|
|
82
|
+
|
|
83
|
+
-- 指定分区合并
|
|
84
|
+
OPTIMIZE my_schema.orders WHERE dt = '2024-01-01';
|
|
85
|
+
|
|
86
|
+
-- 同步执行(等待完成)
|
|
87
|
+
OPTIMIZE my_schema.orders OPTIONS('cz.sql.optimize.table.async' = 'false');
|
|
88
|
+
|
|
89
|
+
-- 写入时自动触发合并
|
|
90
|
+
SET cz.sql.compaction.after.commit = true;
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## 步骤 4:开启结果缓存
|
|
96
|
+
|
|
97
|
+
阅读 [references/result-cache.md](references/result-cache.md)
|
|
98
|
+
|
|
99
|
+
```sql
|
|
100
|
+
-- 开启 Result Cache(SESSION 级别)
|
|
101
|
+
SET cz.sql.enable.shortcut.result.cache = true;
|
|
102
|
+
|
|
103
|
+
-- 关闭
|
|
104
|
+
SET cz.sql.enable.shortcut.result.cache = false;
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
命中缓存的查询通常在 15ms 内返回。在 Job Profile 中可看到 `JOB RESULT REUSE` 标记。
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## 步骤 5:Map Join 与 Sort Key
|
|
112
|
+
|
|
113
|
+
阅读 [references/hints-and-sortkey.md](references/hints-and-sortkey.md)
|
|
114
|
+
|
|
115
|
+
```sql
|
|
116
|
+
-- Map Join:小表(<1GB)与大表 JOIN 时使用
|
|
117
|
+
SELECT /*+ MAPJOIN (small_table) */ *
|
|
118
|
+
FROM large_table t1
|
|
119
|
+
JOIN small_table t2 ON t1.id = t2.id;
|
|
120
|
+
|
|
121
|
+
-- 查看系统推荐的 Sort Key
|
|
122
|
+
SELECT * FROM information_schema.sortkey_candidates;
|
|
123
|
+
|
|
124
|
+
-- 应用推荐(直接执行 statement 列中的 SQL)
|
|
125
|
+
ALTER TABLE schema.table_name SET PROPERTIES("hint.sort.columns"="column_name");
|
|
126
|
+
|
|
127
|
+
-- 开启自动收集 Sort Key 推荐
|
|
128
|
+
ALTER WORKSPACE my_workspace SET PROPERTIES (auto_index='day');
|
|
129
|
+
|
|
130
|
+
-- 收集表统计信息(Sort Key 推荐为空时先执行)
|
|
131
|
+
ANALYZE TABLE schema.table_name;
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## 常见问题
|
|
137
|
+
|
|
138
|
+
| 问题 | 排查方向 |
|
|
139
|
+
|---|---|
|
|
140
|
+
| 查询慢但执行计划看起来正常 | 检查小文件数量(`SHOW PARTITIONS EXTENDED`),考虑 OPTIMIZE |
|
|
141
|
+
| Result Cache 未命中 | 检查 SQL 是否完全一致、是否含 UDF 或非确定性函数、表数据是否有变更 |
|
|
142
|
+
| OPTIMIZE 无效 | 确认使用的是通用型(GP)集群,不是分析型集群 |
|
|
143
|
+
| Map Join 失败 | 小表超过 1GB,改用普通 JOIN 或拆分查询 |
|
|
144
|
+
| Sort Key 推荐为空 | 先执行 `ANALYZE TABLE`,再等待自动收集周期 |
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## 参考文档
|
|
149
|
+
|
|
150
|
+
- [EXPLAIN](https://www.yunqi.tech/documents/EXPLAIN)
|
|
151
|
+
- [SHOW JOBS](https://www.yunqi.tech/documents/show-jobs)
|
|
152
|
+
- [Result Cache](https://www.yunqi.tech/documents/result_cache)
|
|
153
|
+
- [OPTIMIZE](https://www.yunqi.tech/documents/OPTIMIZE)
|
|
154
|
+
- [小文件优化](https://www.yunqi.tech/documents/small_file_optimization)
|
|
155
|
+
- [Map Join](https://www.yunqi.tech/documents/mapjoin)
|
|
156
|
+
- [推荐排序列](https://www.yunqi.tech/documents/auto-index)
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
{"case_id":"001","type":"should_call","user_input":"为什么这个 JOIN 查询这么慢?SELECT t1.user_id, t2.tenant_name FROM public.dim_studio_user_dmin_f t1 JOIN public.dim_studio_tenant_dmin_f t2 ON t1.tenant_id = t2.tenant_id","expected_skill":"clickzetta-query-optimizer","expected_output_contains":["JOIN","优化"]}
|
|
2
|
+
{"case_id":"002","type":"should_call","user_input":"public.dwd_studio_lakehouse_jobs_dd_i 表适合设置什么 Sort Key?","expected_skill":"clickzetta-query-optimizer","expected_output_contains":["sort","key"]}
|
|
3
|
+
{"case_id":"003","type":"should_call","user_input":"怎么开启结果缓存?Result Cache 的使用限制是什么?","expected_skill":"clickzetta-query-optimizer","expected_output_contains":["cache","cz.sql.enable"]}
|
|
4
|
+
{"case_id":"004","type":"should_call","user_input":"表有很多小文件影响查询性能,怎么合并优化?","expected_skill":"clickzetta-query-optimizer","expected_output_contains":["OPTIMIZE","小文件"]}
|
|
5
|
+
{"case_id":"005","type":"should_call","user_input":"怎么用 EXPLAIN 分析执行计划?Map Join 什么时候用?","expected_skill":"clickzetta-query-optimizer","expected_output_contains":["EXPLAIN","Map Join"]}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# EXPLAIN 命令参考
|
|
2
|
+
|
|
3
|
+
> 来源:https://www.yunqi.tech/documents/EXPLAIN
|
|
4
|
+
|
|
5
|
+
## 语法
|
|
6
|
+
|
|
7
|
+
```sql
|
|
8
|
+
EXPLAIN [EXTENDED] query_statement
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## 两种模式
|
|
12
|
+
|
|
13
|
+
### 基础模式(EXPLAIN)
|
|
14
|
+
|
|
15
|
+
显示物理执行计划,用于快速理解查询执行方式。
|
|
16
|
+
|
|
17
|
+
```sql
|
|
18
|
+
EXPLAIN SELECT * FROM orders LIMIT 5;
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
输出示例:
|
|
22
|
+
```
|
|
23
|
+
Type: DML
|
|
24
|
+
Plan: PhysicalTableSink() name=TableSink0 stage=stg0
|
|
25
|
+
PhysicalTableScan(orders, a) as [0] name=TableScan1
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### 扩展模式(EXPLAIN EXTENDED)
|
|
29
|
+
|
|
30
|
+
显示完整的逻辑执行计划 + 物理执行计划,包含表达式转换、系统列、优化过程。
|
|
31
|
+
|
|
32
|
+
```sql
|
|
33
|
+
EXPLAIN EXTENDED SELECT * FROM orders LIMIT 5;
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
输出包含:
|
|
37
|
+
- `[LogicalPlan]`:逻辑执行计划
|
|
38
|
+
- `[PhysicalPlan]`:物理执行计划
|
|
39
|
+
- 系统隐藏列信息(`__commit_version`、`__change_type` 等)
|
|
40
|
+
|
|
41
|
+
## 常见操作符说明
|
|
42
|
+
|
|
43
|
+
| 操作符 | 说明 | 性能特征 |
|
|
44
|
+
|---|---|---|
|
|
45
|
+
| PhysicalTableScan | 从表读取数据 | 基础 I/O 操作 |
|
|
46
|
+
| PhysicalTableSink | 输出查询结果 | 固定开销 |
|
|
47
|
+
| PhysicalSort | 对数据排序 | O(n log n),可能成为瓶颈 |
|
|
48
|
+
| PhysicalFilter | 条件过滤 | 线性操作,早期过滤是最佳实践 |
|
|
49
|
+
| PhysicalHashAggregate | 聚合操作 | 根据 GROUP BY 基数变化 |
|
|
50
|
+
| PhysicalJoin | JOIN 操作 | 复杂度取决于 JOIN 策略和数据量 |
|
|
51
|
+
|
|
52
|
+
## 使用建议
|
|
53
|
+
|
|
54
|
+
- 先用 `EXPLAIN` 快速确认执行路径
|
|
55
|
+
- 发现异常(如全表扫描、大量 Sort)再用 `EXPLAIN EXTENDED` 深入分析
|
|
56
|
+
- 关注 PhysicalJoin 的策略:是否触发了 MapJoin(小表广播)
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Map Join 与 Sort Key 推荐参考
|
|
2
|
+
|
|
3
|
+
> 来源:https://www.yunqi.tech/documents/mapjoin 和 https://www.yunqi.tech/documents/auto-index
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Map Join(小表广播优化)
|
|
8
|
+
|
|
9
|
+
### 语法
|
|
10
|
+
|
|
11
|
+
```sql
|
|
12
|
+
SELECT /*+ MAPJOIN (small_table_alias) */ *
|
|
13
|
+
FROM large_table t1
|
|
14
|
+
JOIN small_table t2 ON t1.id = t2.id;
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### 说明
|
|
18
|
+
|
|
19
|
+
- 将小表广播到各节点,在 Map 阶段完成 JOIN,避免 Shuffle
|
|
20
|
+
- **小表大小限制:1GB**,超过则 Map Join 失败或退化为普通 JOIN
|
|
21
|
+
- 适用于小表 JOIN 大表,不适用于大表 JOIN 大表
|
|
22
|
+
|
|
23
|
+
### 示例
|
|
24
|
+
|
|
25
|
+
```sql
|
|
26
|
+
-- 员工与部门关联
|
|
27
|
+
SELECT /*+ MAPJOIN (dept) */ *
|
|
28
|
+
FROM employees emp
|
|
29
|
+
JOIN departments dept ON emp.dept_id = dept.dept_id;
|
|
30
|
+
|
|
31
|
+
-- 订单与客户关联
|
|
32
|
+
SELECT /*+ MAPJOIN (customer) */ *
|
|
33
|
+
FROM orders o
|
|
34
|
+
JOIN customers customer ON o.customer_id = customer.customer_id;
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Sort Key 推荐(自动索引建议)
|
|
40
|
+
|
|
41
|
+
### 启用自动收集
|
|
42
|
+
|
|
43
|
+
```sql
|
|
44
|
+
-- 按天收集(推荐)
|
|
45
|
+
ALTER WORKSPACE workspace_name SET PROPERTIES (auto_index='day');
|
|
46
|
+
|
|
47
|
+
-- 自定义参数:天/月, 最近N分钟job, 最少重复次数, 最多job数
|
|
48
|
+
ALTER WORKSPACE workspace_name SET PROPERTIES (auto_index='day,150,5,100');
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
参数说明:
|
|
52
|
+
- 第 1 个参数:`day`(每天)或 `month`(每月 1 号),收集时间为晚上 6 点
|
|
53
|
+
- 第 2 个参数:使用最近多少分钟的 job(默认 150)
|
|
54
|
+
- 第 3 个参数:job 需要重复多少次才被采用(默认 5)
|
|
55
|
+
- 第 4 个参数:每列最多使用的 job 数(默认 100)
|
|
56
|
+
|
|
57
|
+
### 查询推荐结果
|
|
58
|
+
|
|
59
|
+
```sql
|
|
60
|
+
SELECT * FROM information_schema.sortkey_candidates;
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
返回字段:`table_name`、`col`(推荐列)、`statement`(可直接执行的 ALTER 语句)、`ratio`(估算提升效果百分比)
|
|
64
|
+
|
|
65
|
+
### 应用推荐
|
|
66
|
+
|
|
67
|
+
```sql
|
|
68
|
+
-- 直接执行 statement 列中的 SQL 即可设置 sort key
|
|
69
|
+
ALTER TABLE schema.table_name SET PROPERTIES("hint.sort.columns"="column_name");
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### 建议
|
|
73
|
+
|
|
74
|
+
执行前先对表收集统计信息,提高推荐准确性:
|
|
75
|
+
|
|
76
|
+
```sql
|
|
77
|
+
ANALYZE TABLE schema.table_name;
|
|
78
|
+
```
|