正文
不知道是网速原因,还是性能原因,我做星型数据(start schema)的性能比对测试时,往 snowflake 导入 1 亿条数据,昨晚导入完成之后,开始做执行测试 SQL。
结果,数据发现执行多表 join 查询时,获取不到结果,在咱们自己的云原生数仓下,在阿里的 adb pg 云原生数仓下执行都没问题,在 snowflake 云原生数仓下执行竟然不返回结果。
难道是 snowflake 有 bug?
抱着这个疑问,赶忙找大领导,我说,查询不到结果!(心里想的是:1. 数仓本身的 bug 问题我解决不了; 2. 又有机会找大领导一起调式问题了)
原始 SQL 如下:
select count(*) from mdx.FACT_TABLE f, mdx.dim_10 dim_10, mdx.dim_100 dim_100, mdx.dim_1000 dim_1000, mdx.dim_10000 dim_10000, mdx.dim_100000 dim_100000, mdx.dim_1000000 dim_1000000, mdx.dim_10000000 dim_10000000 where f.dim_10_id = dim_10.dim_10_id and f.dim_100_id = dim_100.dim_100_ID and f.dim_1000_id = dim_1000.dim_1000_id and f.dim_10000_id = dim_10000.dim_10000_id and f.dim_100000_id = dim_100000.dim_100000_id and f.dim_1000000_id = dim_1000000.dim_1000000_id and f.dim_10000000_id = dim_10000000.dim_10000000_id
返回结果是 0
,大领导让我先执行一个 join ,看看有没有数据?于是我修改 SQL 如下:
select count(*) from mdx.FACT_TABLE f, mdx.dim_10 dim_10 where f.dim_10_id = dim_10.dim_10_id
返回结果是正常的。接下来大领导说:“你不是有一个 SQL 能查出来结果嘛,现在一个一个往上加 join…… 我现在不方便跟你线上会议,你自己解决一下。”
“分析问题,就是这样”
“没有捷径”
于是我修改 SQL 如下:
select count(*) from mdx.FACT_TABLE f, mdx.dim_10 dim_10, mdx.dim_100 dim_100 where f.dim_10_id =dim_10.dim_10_id and f.dim_100_id = dim_100.dim_100_ID
返回结果是 0
,ok,问题浮现出来了,从这里可以看出是 mdx.dim_100
这张表的问题,我进一步去查了下它的表结构,发现我导数据前,手动通过界面建表时,把列名写错了。(又是一个人工操作的失误,这里有个启示:能自动化的地方,要尽量用程序来做,减少人工的失误,人工要尽量用在程序涉及不到的地方)
执行 SQL 如下:
ALTER TABLE DIM_100 RENAME COLUMN DIM_100 TO dim_100_id;
ok,将列名重命名之后,结果就对了。
手机上也有这次问题解决流程的记录,顺便写在文章里,多加深印象。两点:
- 排除法
- 自动化