SQL 的编译原理,了解下?

点击蓝色“有关SQL”关注我哟

加个“星标”,天天与10000人一起快乐成长

图 | 榖依米

炎炎夏日,赖以续命的空调,又被禁开。

一大帮子的开发,窝在一处办公,想想这酸爽,谁见谁愁。L 早已下楼去星巴克加冰了,剩下小 C 在对付 同样焦灼的 Support.

不知道是天气闷热,还是午饭太丰盛,脑袋不能很快回血的小 C,眼睛虽然盯着屏幕,心神却怕早已见了周公。

看到此景,L 真的害怕,被困神骚扰的小 C 鼠标一点,一划拉,整个库都拜拜了。

于是 L 走上前去,把星冰乐轻轻放在小 C 屏幕前,看到小 C 虎躯一震,大概是被微微凉意,拉了回来。“可以说事了”,L 心想。

“什么难题,让你这么纠结”

“好奇怪。这段脚本我检查了 10 几遍,眼睛都花了。但就是找不出问题”

看到 1800 多行的 SQL 代码,仅仅是翻屏,都点了好几下。L 也是哭笑不得。

“快速定位出错的 SQL 语句,其实是有妙招的” L 吸一口咖啡,满脸开心。

“从上到下,慢慢看咯,还能怎么办?”

“二分法” L 吸着冰焦玛,似乎被奶油给腻着了,后半句话还没说出来,就被小C抢过话题。

“这还和算法有关系?”

“如果代码太长,你脑袋的缓存没那么大,那就需要缩短查找范围。比如看前 900 行。如果前 900 行没问题,再往下看 500 行”

“太绝了” 小 C 就像看到了冰奶茶一样狂喜,CTRL + G 定位到 1000 行处,接着 CTRL + SHIFT + HOME,F5 一刷,问题来了。

“就是这个临时表,我在每段 batch 开头都 Drop 了下,接着创建,结果老提示 there is already an object named #AccountList ”

"所以,归纳起来就是这样的模式错了" L 把相关的临时表创建代码,复制出来,运行了一把


当然每段中间还有其他的操作,这里省去了。

看到 L 运行也报错,小 C 总算送了口气。接下来,盯着 L 圆圆的脑袋,心里一万个问号,飘过.

“上次给你的 sql server exeuction plans 那本书,看了没?”

“没看那么快,太多原理性的东西了”

“SQL 的执行路径,能解释这里的问题”


“SQL 在执行前,一定会通过 4 个大步骤。而这里的问题,在于 Parsing.”


“即使我们不执行 SQL, 只要执行这里打钩的命令,就可以知道 SQL 能否正确运行”

果然,还是那个错误。小C看着 SSMS,仿佛见到一个新来的生物一样。

“这里建两次同名的表,虽然有 Drop 语句,但 parsing 阶段,并不执行。只是验证 SQL 语句的语法是否正确。我来举个反例。明明是错误的代码, 却能 parsing ”

"你看,这个 #AccountList 临时表不存在吧"


"但是不耽误它 parsing 成功"


“ WOW, ” 小 C 惊喜,“想不到这里头还有这样的道道,学到了”

L 拿起半杯星冰乐,满意地大步走向自己的 cube.

--完--

往期精彩:

本号精华合集(二)

如何写好 5000 行的 SQL 代码

如何提高阅读 SQL 源代码的快感

我在面试数据库工程师候选人时,常问的一些题

零基础 SQL 数据库小白,从入门到精通的学习路线与书单

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dbLenis

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值