排除法,一个一个 join

简介: 排除法,一个一个 join

正文


不知道是网速原因,还是性能原因,我做星型数据(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…… 我现在不方便跟你线上会议,你自己解决一下。”

26608654-11f694e4168a14fe.webp.jpg


“分析问题,就是这样”

“没有捷径”

于是我修改 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,将列名重命名之后,结果就对了。


手机上也有这次问题解决流程的记录,顺便写在文章里,多加深印象。两点:

  1. 排除法
  2. 自动化
目录
相关文章
|
9月前
|
关系型数据库
INNER JOIN的使用
INNER JOIN的使用
39 0
|
11月前
Inner Join与Left Join
Inner Join与Left Join
61 0
|
12月前
|
关系型数据库 MySQL
inner join 、left join、right join,优先使用inner join
inner join 、left join、right join,优先使用inner join
|
关系型数据库 MySQL
八、inner join 、left join、right join,优先使用inner join
八、inner join 、left join、right join,优先使用inner join
178 0
inner join
INNER JOIN 关键字 在表中存在至少一个匹配时,INNER JOIN 关键字返回行。 INNER JOIN 关键字语法 SELECT column_name(s) FROM table_name1 INNER JOIN table_name2 ON table_name1.column_name=table_name2.column_name 注释:INNER JOIN 与 JOIN 是相同的。 原始的表 (用在例子中的): "Persons" 表: Id_P LastName FirstName Address City 1 Adams John Oxford Street L
104 0
|
SQL 数据库
SQL中关于Join、Inner Join、Left Join、Right Join、Full Join、On、 Where区别
SQL中关于Join、Inner Join、Left Join、Right Join、Full Join、On、 Where区别
115 0
SQL中关于Join、Inner Join、Left Join、Right Join、Full Join、On、 Where区别
|
SQL 关系型数据库 MySQL
MySQL - LEFT JOIN、RIGHT JOIN、INNER JOIN、CROSS JOIN、FULL JOIN
MySQL - LEFT JOIN、RIGHT JOIN、INNER JOIN、CROSS JOIN、FULL JOIN
360 0
MySQL - LEFT JOIN、RIGHT JOIN、INNER JOIN、CROSS JOIN、FULL JOIN
|
SQL 语音技术 数据库
SQL基础【十五、join、Inner join、Left join、Right join、Full join】
SQL基础【十五、join、Inner join、Left join、Right join、Full join】
132 0
SQL基础【十五、join、Inner join、Left join、Right join、Full join】
join
  public class JoinTest { //thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。 //比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。
826 0
|
关系型数据库 PostgreSQL