前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQL 的编译原理,了解下?

SQL 的编译原理,了解下?

作者头像
Lenis
发布2020-06-15 14:25:55
5550
发布2020-06-15 14:25:55
举报
文章被收录于专栏:有关SQL有关SQL

图 | 榖依米

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

一大帮子的开发,窝在一处办公,想想这酸爽,谁见谁愁。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.

--完--

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 有关SQL 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档