快速响应:数据库调试和性能分析

作者: Roger Morrison
创建日期: 22 九月 2021
更新日期: 1 七月 2024
Anonim
AWS re:Invent 2021 - 基于Neptune图数据库和Inferentia芯片构建科创知识图谱
视频: AWS re:Invent 2021 - 基于Neptune图数据库和Inferentia芯片构建科创知识图谱

带走: 主持人Eric Kavanagh与Robin Bloor博士,Dez Blanchfield和IDERAs Bert Scalzo讨论了数据库调试和配置文件。



您目前尚未登录。请登录或注册以观看视频。

埃里克·卡瓦纳(Eric Kavanagh): 好的,女士们,先生们,东部时间星期三是4:00,这当然意味着

罗宾·布卢尔(Robin Bloor): 不能听到你,埃里克。

埃里克·卡瓦纳(Eric Kavanagh): 我几天前在那里,所以你不是一个人。但是,今天的话题真的很有趣。您想要确保的事情是在公司的后台发生的,除非您这样做的人,在这种情况下,您要确保自己做的正确。因为正在谈论调试。没有人喜欢错误,没有人喜欢软件何时停止运行,人们会不高兴,用户会变得不友好。这不好。因此,我们将谈论“快速响应:数据库调试和性能分析”。

确实有关于您的地方,请打上我,@eric_kavanagh。

今年很热。无论如何,调试都将变得很热。确实,这将是永远不会消失的问题之一,无论我们在这方面有多出色,总会有问题,所以关键是如何到达可以快速解决这些问题的地方?理想情况下,您拥有出色的程序员,出色的环境,不会出错太多,但正如俗话所说,“事故发生在最优秀的家庭中。”组织也是如此。那么,这些事情发生了,它将会发生,问题是什么将成为您处理和解决这些问题的解决方案?

很高兴听到Robin Bloor博士,然后是我们下面的Dez Blanchfield,当然还有IDERA的好朋友Bert Scalzo。实际上,我将交出Robin Bloor的钥匙,将其拿走。地板是你的。

罗宾·布卢尔(Robin Bloor): 好。这是一个有趣的话题。我认为因为Dez可能会继续讨论有关调试的实际技术和战争故事,所以我认为Id只是进行了背景讨论,以便我们全面了解正在发生的事情。我做了很长时间,曾经是一名编码人员,就这样,我几乎被这个演讲吸引住,开始对开源思想抒情,但我想我会把它留给其他人。


这是一个著名的bug列表,基本上所有这些臭虫都进入了所有人的名单,基本上,除了后两个臭虫的代价至少为1亿美元。第一个是火星气候轨道器,它在太空中迷路了,这是由于编码问题,人们将公制单位与(笑)英尺和英寸相混淆。阿丽亚娜5航班501的安装引擎与应该在火箭发射时运行的计算机之间不匹配。多台计算机故障,火箭爆炸,头条新闻。据说1982年的苏联天然气管道是地球历史上最大的爆炸;我不确定是否。俄国人偷走了一些自动控制软件,中央情报局意识到他们要这样做并在其中添加了错误,苏联人则未经测试就实施了它。因此,炸毁了一条管道,以为那很有趣。

莫里斯蠕虫是一个编码实验,突然变成了一个贪婪的蠕虫,遍及所有人-显然造成了价值1亿美元的损失。多数民众赞成在一个估计。英特尔在数学芯片上犯了一个著名的错误-1993年在奔腾芯片上进行了数学指令-应该花费超过1亿美元。 Apples Maps计划可能是Apple所做的任何事情中最糟糕,最灾难性的发布。我的意思是,尝试使用它的人正沿着101路行驶,并发现Apple Map称他们在旧金山湾中。因此,人们开始将Apple Maps应用称为iLost。从1990年以来的最长中断时间来看,这是一件很有趣的事情,从诸如此类的成本的角度来看,AT&T停电了大约9个小时,长途电话花费了6000万美元。

我当时在英国的一家保险公司工作,数据库是他们实施的新版本的数据库,并开始擦除数据。而且我记得非常好,因为后来我被邀请参加某种数据库选择。非常有趣的是,他们采用了新版本的数据库,并且对通过所有测试的数据库新版本进行了一系列测试。它发现擦除数据的方法非常晦涩。

所以,反正就是这样。我以为我在谈论阻抗不匹配和SQL发行。关系数据库将数据存储在表中,而编码人员则倾向于操纵对象结构中的数据,而对象结构实际上并不能很好地映射到表。因此,您会得到所谓的阻抗不匹配,而有人必须以某种方式进行处理。但是实际上发生了什么,因为一个模型,编码器模型和数据库另一个模型并没有特别对齐。如果该行业构建了可以协同工作的东西,那么您将获得根本不会发生的错误,我认为这很有趣。因此,基本上,在编码人员方面,当获得层次结构时,它可能是类型,结果集,很差的API功能,可能是很多事情,它们只是与数据库交互而已。但是对我来说最重要的是,真的很有趣;总是让我感到惊讶的是,您遇到了这种SQL障碍,这也是一种阻抗,编码人员和数据库之间会相互配合。因此,SQL具有数据识别功能,这很好,并且它具有用于选择,项目和联接的DML,这很好。您可以利用它从数据库中获取数据方面提供很多功能。但是它几乎没有用于做事的数学语言。它具有这种特性,并且几乎没有基于时间的东西。因此,如果您愿意,SQL是一种不完善的获取数据的方法。因此,数据库专家构建了存储过程以驻留在数据库中,并且使该存储过程存在于数据库中的原因是,您真的不希望将数据来回传递给程序。


由于某些功能是非常特定于数据的,因此它不仅仅是参照完整性和级联删除等,数据库正在处理您突然将所有功能放入数据库的工作,这当然意味着可以在编码器和数据库本身之间拆分应用程序。这使得实现某些功能的工作确实非常困难,因此更容易出错。因此,这就是数据库游戏的一个方面,因为这意味着您已经获得了很多实现,例如Ive涉及关系数据库,实际上有很多代码位于存储过程中,而这些存储过程与代码分开处理坐在应用程序中。这似乎是一件很奇怪的事情,它在做各种事情时应该很聪明。

我以为Id也谈论数据库性能,因为性能错误通常被认为是bug,但基本上,您可能在CPU,内存,磁盘,网络上遇到瓶颈,并且由于锁定而可能遇到性能问题。这样的想法是,编码人员实际上并不需要担心性能,而数据库实际上将表现得相当不错。它的设计应使编码人员无需知道。但是,您的数据库设计不佳,程序设计不佳,工作负载混合并发,这也可能导致性能问题。您将获得负载平衡,获得容量规划和数据增长,这可能会导致数据库停止运行或减慢运行速度。有趣的是,当数据库快满时,它们会变慢。而且,在复制,复制需求以及进行备份和恢复方面,您可能会遇到数据层问题。无论如何,多数民众赞成在一般概述。

我唯一要说的是,数据库调试只能是艰巨而艰巨的-我说是因为我做了很多工作-您经常会在我经历过的所有调试中发现它的所有情况是,您见过的第一件事就是一团糟。而且,您必须尝试从混乱中解脱出来,弄清混乱是如何产生的。而且,当您查看数据库问题时,通常您查看的只是损坏的数据,而您却在想:“这是怎么发生的?”

无论如何,我将转告Dez,他可能会说出比我想出的更多的智慧话。我不知道如何传球,德兹。

埃里克·卡瓦纳(Eric Kavanagh): 病过去了,待命,坚持下去。

自动语音: 与会者线路静音。

埃里克·卡瓦纳(Eric Kavanagh): 好吧,等一下,让我给Dez球。

Dez Blanchfield: 谢谢你,埃里克。是的,Robin Bloor博士,您的确是最正确的:这是一个话题,如果您对双关语宽恕,那就是一生的烦恼,对不起,我无法帮助自己。希望您能在此看到我的第一个屏幕,在顶部我对字体大小问题表示歉意。根据我的经验,在许多情况下,漏洞的主题是为期一天的讲座。这是一个如此广泛的话题,因此我将重点放在两个关键领域,特别是我们认为是错误的概念,而是编程问题。我认为这些天来引入缺陷本身通常会被集成开发环境所接受,尽管它们可能是长期运行的缺陷。但是通常在分析代码的情况下更是如此,并且可能编写有功能的代码,这应该是一个错误。因此,我在这里的标题幻灯片实际上是在高分辨率A3上获得的副本,但不幸的是,在搬家后它被摧毁了。但这是1945年左右的编程表上的手写笔记,据推测是美国哈佛大学的一些人,他们的第二代机器Mark 2。他们正在用通用语言调试一些问题,但是他们试图找到故障,结果发现出现了与硬件和所谓软件问题稍有不同的事物。

因此,都市神话是9月9日左右,1945年,哈佛大学的一个团队正在拆开一台机器,他们遇到了一个叫做“继电器70”的东西-那时,编程是在物理意义上完成的,您将代码缠绕在板上,这就是您对程序进行有效编程的方式机器-他们发现这个继电器编号为70,出了点问题,事实证明出现了“ bug”一词,因为它实际上是飞蛾-大概是一根飞蛾夹在一块铜线之间从一个地方到另一个地方。传说中,传说中的格蕾丝·霍珀(Grace Hopper)是这个标题,在我的标题幻灯片中,“发现错误的第一个实际案例”引用了无引号。

但是正如罗宾(Robin)在其第一张幻灯片的前面所强调的那样,错误的概念可以追溯到我们可以想象的人在进行计算时,这些概念就像补丁一样。术语“补丁”来自将一条实际的胶带粘贴在打孔卡上的孔上。但这的全部要点是,“调试”一词源自在物理机中发现错误的概念。从那时起,我们就一直使用该术语来尝试处理问题,或者不只是在无法编译的程序中编码问题,而是在运行不正常的程序中编码问题。特别是尚未进行概要分析,只是发现诸如永无止境的循环之类的东西。

但是我们也有一个场景,我以为我可以在加入更多细节之前先放入几张有趣的幻灯片。这是经典漫画,在网络上称为XKCD,漫画家对世界有一些非常有趣的看法。这是关于一个叫“小鲍比餐桌”的孩子的,据说他的父母叫这个小男孩罗伯特(Robert);放下桌子的学生;-叫它,有点儿“嗨,这是您儿子的学校遇到了计算机故障”,而家长回答说:“哦,亲爱的,他有事吗?”然后老师说,“嗯,在某种程度上,”老师问,“您是否真的给儿子罗伯(Robert)命名?放桌子的学生;-?”父母说:“哦,是的,小鲍比桌子,我们叫他。”无论如何,他们继续说,他们现在已经失去了多年的学生记录,希望您开心。答案是:“嗯,您应该清理和清理数据库输入。”而且我经常使用这种方式来讨论我们在代码中查找内容时遇到的一些问题,即代码通常也不会查看数据。

另一个有趣的东西,我不知道这是不是真的-我怀疑它是恶作剧-但同样,它也触动了我的有趣的骨头。有人将汽车前部的车牌更改为类似的陈述,该陈述导致数据库中的速度相机下降,以此类推,从而捕获了汽车的车牌。我一直指的是,我怀疑任何程序员都不会预料到实际汽车会撞上他们的代码,但永远不要低估这一点–愤怒的怪胎的力量。

(笑声)

我想,这将我引到了关键点,那就是从前,我们可以像调试凡人一样调试和分析代码。但是我非常认为那段时间已经过去,而且从我的经验来看,这是我的第一个经历。罗宾·尤尔(Robin youe)欢迎您为此取笑–但从历史上看,艾夫(Ive)的背景是14岁那年在小镇尽头徘徊,敲了新西兰一个名为“ Data Com”的数据中心的门,并询问是否我可以通过去较晚的公共汽车回家,每天大约25公里的通勤,将纸张放入ers和将磁带放入磁带驱动器中,以及成为一般管理员来在学校赚取零花钱。奇怪的是,他们确实给了我一份工作。但是随着时间的流逝,我设法找到了工作人员并找到了程序员,并意识到我喜欢编码,并经历了运行脚本和批处理作业的过程,但最终还是要编写代码。您必须编写类似于小型程序的脚本和批处理作业,然后完成坐在3270终端上手动编写代码的整个过程。

实际上,我的第一次体验是在电传打字机终端上,实际上是132列物理记录仪。本质上,可以想像是一台非常古老的打字机,其中滚动着纸张,因为他们没有CRT管。并且在那方面调试代码是一个非常重要的问题,因此您倾向于手动编写所有代码,然后像打字员一样努力,尽最大努力避免犯错,因为必须告诉他们非常沮丧一个行编辑器转到某一行,然后再输入该行,然后再将其键入。但是从前,这就是我们编写代码的方式,那就是我们如何调试的方式,我们对此非常非常好。实际上,这迫使我们拥有非常好的编程技术,因为修复它确实很麻烦。但是经历了整个旅程,并且大家都很熟悉,经历了从我在世界上的3270终端体验,到可以在屏幕上看到事物的Digital Equipment VT220,但是同样,您所做的只是您所做的相同的事情仅在CRT上使用纸质ed格式的纸带,但是您能够更轻松地删除,并且没有“滴滴涕滴滴涕”的声音。

然后您就会知道,Wyse终端机(例如Wyse 150,可能是我最喜欢的计算机接口),然后是PC,然后是Mac,然后是当今基于Web的现代GUI和ID。并通过一系列程序,用一个汇编程序和PILOT和Logo和Lisp和Fortran和Pascal进行编程,以及可能使人们畏缩的语言。但是这些语言迫使您编写好的代码。他们没有让您摆脱不良做法。 C,C ++,Java,Ruby,Python –到了编程阶段,我们变得更像脚本,我们越来越接近结构化查询语言和实际上用于调用SQL的PHP​​之类的语言。告诉你的是,我来自我的背景,在许多方面都是自学成才的,那些确实帮助我学习的东西,教会了我很好的编程习惯以及关于设计和过程的很好的惯例,以确保我不会引入错误码。

如今的编程方法之类的东西,例如结构化查询语言,SQL,它是一种非常强大,简单的查询语言。但是我们把它变成了一种编程语言,我真的不相信SQL曾经被设计成一种现代的编程语言,但是我们歪曲了它成为那样。这就引入了很多问题,这是我们从两种角度考虑的原因:从编码角度和从DBA角度考虑。它很容易出现并引入错误,例如程序设计技巧差,代码编写工作懒惰,缺乏经验,我喜欢的经典方法,例如SQL使用者跳上Google并搜索内容并找到网站得到一个示例,并复制和粘贴现有代码。然后复制错误的编码,不当行为并将其投入生产,因为它恰好会给他们带来他们想要的结果。您还面临其他挑战,例如,这些天都在朝着这个目标迈进,我们称之为零竞争:试图以如此便宜和如此快速的速度做所有事情,以至于我们遇到了不雇用低薪员工的情况。我并不是说这是一种卑鄙的态度,但并不是要为每一项可能的工作聘请专家。曾几何时,与计算机有关的是火箭科学。它涉及到爆炸性的声音,非常响亮的声音,进入太空的空间,或者工程师是具有高素质的男人和女人,他们都拥有学位并接受过严格的教育,以防止他们从事疯狂的事情。

这些天来,有很多没有多年经验的开发和设计人员以及数据库,没有一定的培训或支持。这样一来,您只能遇到传统业余爱好者与专家的情况。有一句著名的话,我实际上记不清是谁创造了报价,这句话说:“如果您认为聘请专家来做这项工作很昂贵,请等到雇用了几个造成问题的业余人员之后,因此,SQL就有了这个问题,它非常非常易于学习,非常易于使用。但在我看来,它并不是一种完美的编程语言。做到这一点非常容易,例如从任何地方选一个明星,然后将所有这些都放入您更喜欢的编程语言(如PHP和Ruby或Python)中,并使用您本地熟悉的编程语言来进行数据处理,而不是在SQL中执行更复杂的查询。我们经常看到这种情况,然后人们想知道为什么数据库运行缓慢?这是因为有一百万人正试图通过在线售票系统购买机票,该系统从任何地方都可以选明星。

现在,这是一个非常极端的示例,但是您可以从所有这些中获得要点。因此,为真正说明问题,以下是我经常携带的一个例子。我是数学的忠实拥护者,我喜欢混沌理论,也喜欢Mandelbrot集。在右侧有Mandelbrot集的演示文稿,我肯定大家都熟悉。左侧有一段实际呈现该结果的SQL。现在,每次我将它放在屏幕上的某个地方时,我都会听到“哦,我的天哪,有人用SQL渲染了Mandelbrot系列,您是认真的吗?好吧,其全部目的是为了说明我刚才在此处概述的内容,是的,事实上,您现在可以使用SQL编写几乎所有内容;它是一种非常发达的,功能强大的现代编程语言。最初它是一种查询语言时,它只是为了获取数据而设计的。因此,现在我们已经拥有了非常复杂的结构和存储过程,已经将编程方法应用于一种语言,因此对于不良的编程实践,经验不足,剪切粘贴代码,低薪员工试图成为高薪员工,假装自己认识的人,但他们必须在工作中学习。

代码概要分析和我们称为调试的整个过程,并不是在发现使程序无法正常工作的错误,而是会损害系统和结构不良的代码的错误。现在,当您查看此屏幕时,您会认为它只是一种可爱,然后您会想到:“哇,多么棒的图形,我很乐意运行它。”但是,请想象一下在某种业务逻辑上运行。它看起来很整洁,但是它讲的是一种数学图形表示的混沌理论,但是当您考虑将其潜在地用于某些业务逻辑中时,您会很快得到了解。并要真正说明这一点–对不起,颜色被颠倒了,应该是黑色背景,绿色是绿色屏幕,但是您仍然可以阅读。

我走了个例子,快速浏览一下一个例子,如果您真的很疯狂,没有任何经验,并且来自不同的编程背景,并且将C ++之类的东西应用于SQL,以真正说明我的观点,我从IDERA移交给了我们经验丰富的客人。这是一个结构化查询,其编写方式类似于C ++,但使用SQL编码。它实际上执行,但是执行大约需要三到五分钟。从表面上看,它从多个数据库,多个联接中拉回一行数据。

再说一遍,这就是如果您没有正确的工具,如果您没有正确的平台和环境来捕获这些东西,那么这些东西就会投入生产,那么您每个系统都会有100,000个人一天,一小时,一分钟或几分钟,您很快就会遇到切尔诺贝利的经历,大型铁杆开始融化并埋入地球的核心,因为该代码永远都不会投入生产。对不起,您的系统和工具应该在接近测试之前就接受它-即使通过测试过程,甚至通过UAT和系统集成,也应该选择并突出显示那段代码,并且应该将某人放在一边,说,“看,那真的是很漂亮的代码,但是让我们得到一个DBA来帮助您正确地构建结构化查询,因为坦率地说,那真是令人讨厌。”然后您可以去那里的URL看看-它被称为您编写的最复杂的SQL查询。因为相信我,实际上确实可以编译,但是可以运行。而且,如果您剪切并粘贴它并仅模拟数据库,那么它就值得一看。如果您拥有监视数据库的工具,请尝试在三到五分钟的时间内崩溃,然后回叫的一行。

因此,总而言之,考虑到这一点,我的整个编码背景告诉我,您可以给人们开枪,如果他们不注意,他们会把自己开枪。诀窍是向他们展示安全机制的位置。有了合适的工具和合适的软件,在完成编码之后,您便可以查看您的代码,可以通过对代码进行性能分析来发现问题,可以有效地发现与性能有关的意外错误,正如我之前提到的那样。 ,从前,您可以看着绿色的屏幕。你不能了;有成千上万的代码行,部署了成千上万的应用程序,在某些情况下有数百万个数据库,甚至超级人类也无法再手动完成此操作。实际上,您确实需要唾手可得的正确的软件和正确的工具,并且团队需要使用这些工具,以便您可以找到这些问题并非常,非常快地解决它们,然后再进行讨论。罗宾·布洛尔(Robin Bloor)强调说,事情要么变得灾难性的,事情就爆炸了,或者更常见的是,当他们无法弄清事情为什么会发生时,它们就开始花费您很多美元,大量时间和精力并破坏了士气和东西。运行很长时间。

考虑到这一点,我将移交给我们的客人,我期待听到他们如何解决此问题。特别是我认为即将收到的演示。埃里克,病过去了。

埃里克·卡瓦纳(Eric Kavanagh): 好,伯特,把它拿走。

伯特·斯卡尔佐: 好的谢谢。我是IDERA的Bert Scalzo,我是我们数据库工具的产品经理。我将谈论调试。我认为Robin先前说过的最重要的一件事-的确是调试是繁重且不平凡的,而当您进行数据库调试时,调试的数量级则更加繁琐且不平凡-因此,是一个重要的报价。

好。我想从编程的历史开始,因为很多时候我看到没有调试的人,他们没有使用调试器,他们只是使用他们正在使用的任何语言进行编程,而且很多时候他们会对我说:这些调试器是新的东西,我们还没有开始使用这些东西。”所以我要做的是向他们显示此时间线图,某种史前历史,老年,中世纪以及它在说我们在哪里编程语言的术语。从1951年开始,我们就拥有非常古老的语言,包括汇编代码,Lisp,FACT和COBOL。然后我们进入下一组,Pascals和Cs,然后进入下一组,C ++,看看那个问号在哪里–这个问号大约在1978年到1980年左右。在那个范围内,提供给我们的调试器,然后说,“嘿,我没有使用调试器,这就是其中的一种新事物。”那么,您必须早在1950年代就已经开始编程,这就是您获得的唯一方法放弃那个主张。

现在,关于该图表的另一个有趣之处是Dez对Grace Hopper进行了评论,我实际上知道Grace,所以它很有趣。然后我笑的另一件事是他谈论电传打字,而我坐在那儿说:“伙计,这是我们从卡片印刷到电传打字时生产力上最大的飞跃,这是有史以来最大的飞跃。” ,并且Ive使用此处的所有语言进行编程,包括SNOBOL(以前从未听说过),它是CDC,Control Data Corporation,所以我想Im对这个行业来说有点老了。

Dez Blanchfield: 我要说的是,您使我们在这里年纪大了。

伯特·斯卡尔佐: 是的,我告诉你,我就像辛普森爷爷。因此,我着眼于调试,并有不同的调试方法。您可能正在谈论我们都认为进入调试器并逐步执行代码的传统想法。但是,人们也会使用他们的代码。多数民众赞成在哪里插入语句到您的代码,也许您会生成一个输出文件,跟踪文件或类似的东西,然后您对代码进行检测。我认为这是调试的一种方法,它有点麻烦,但是却很重要。但是,我们也得到了著名的陈述:您观察到人们实际上将陈述放入其中,而Ive实际看到了一个工具-及其数据库工具-如果您不知道如何使用调试器,则按一下按钮,它将一直停留整个代码中为您准备的语句,然后在完成操作后按另一个按钮,将其删除。因为多数民众赞成在那调试。

而且我们进行调试的原因有两个:首先,我们必须找到使我们的代码无效的东西。换句话说,通常这意味着存在逻辑错误或我们错过了业务需求,但实际上是代码无效。它没有完成我们预期的操作。还有一次我们去调试,这是为了提高效率,这可能是一个逻辑错误,但这是我做对的事情,只是返回得还不够快。现在,我指出这一点是因为探查器可能更适合第二种情况,并且将同时讨论调试器和探查器。另外,还有远程调试的概念。这很重要,因为很多时候,如果您坐在个人计算机上,并且使用调试器访问数据库,则实际上是在数据库上执行代码,实际上是在进行远程调试。您可能没有意识到,但这就是正在发生的事情。然后,在这些调试器中非常常见的是具有断点,监视点,进入和执行过渡以及其他一些常见的事情,因此Im会立即在屏幕快照中显示这些内容。

现在,进行概要分析:您可以通过两种不同的方式进行概要分析。有人会说工作负载捕获并在捕获所有内容的地方重播,这被视为概要分析。如果进行抽样,我的经验会更好。没有理由去捕捉每一个语句,因为有些语句可能运行得如此之快,以至于您根本不在乎,您真正想看到的是,这些语句不断出现,因为它们运行时间过长。因此,有时分析可能​​意味着采样而不是运行整个过程。通常,您将获得某种可以使用的输出,现在在IDE开发环境中它是可视的,在该输出中,您可以像直方图所示地了解各行代码的性能,但仍然可以是因为它会生成跟踪文件。

Profilers于1979年首次出现。因此,它们也存在了很长时间。非常适合发现资源消耗或性能问题,换句话说,就是效率。一般来说,它与调试器是分开的,但与我不同,尽管我与同时进行调试的调试器一起工作。虽然我认为概要分析器是这两个工具中比较有趣的一个,但是如果我觉得调试的人员不足,则肯定没有足够的人员进行概要分析,因为似乎十分之十的调试器会进行概要分析。那就太遗憾了,因为剖析确实可以带来巨大的改变。现在,正如我们前面所讨论的,数据库语言已经有了SQL –并且我们已经将圆钉钉在这里的方孔中,并迫使它成为一种编程语言–以及Oracle。多数民众赞成在PL / SQL –程序语言SQL –和SQL Server,其Transact-SQL,其SQL-99,其SQL / PSM –我认为是其过程存储模块。 Postgres给它起了另一个名字,DB2又给它起了一个名字,即Informix。换句话说,FOR循环,变量声明以及SQL以外的所有其他内容现在已成为这些语言中SQL的一部分。因此,您需要像Visual Basic程序一样能够调试PL / SQL或Transact-SQL。

现在,对于数据库对象而言,这一点很重要,因为人们会说:“好吧,我必须在数据库中调试什么?”答案是,好吧,无论您可以将什么代码存储在数据库中,如果我在做T- SQL或PL / SQL – Im将对象存储在数据库中,可能是存储过程或存储函数。但是也有触发器:触发器有点像存储过程,但是会在某种事件上触发。现在,某些人会在触发器中放入一行代码并调用存储过程,以便保留所有存储的代码和过程,但其概念相同:触发器仍然可以引发整个事情。然后,作为Oracle,他们有一个称为包的东西,如果您愿意的话,它有点像一个库。您将50或100个存储过程分为一组,称为包,因此它就像一个库。因此,这是调试器的旧方法;这实际上是一个工具,可以实际使用并将所有这些调试语句粘贴在您的代码中。因此,在所有看到调试块的地方,不要删除,自动调试器的启动和跟踪,这些都被某种工具卡住了。除此之外,这就是代码的少数部分,那就是非手动调试方法。

我提出这个问题的原因是,如果您尝试手动执行此操作,则实际上您将键入比所有代码更多的调试代码以放入所有这些语句中。因此,虽然这可能行得通,但总比没有好,但是这是一种非常困难的调试方式,尤其是因为如果这件事花了10个小时才能运行,而问题出在第三行,该怎么办?如果我正在进行交互式调试会话,那么我会在第3行-五分钟之内就知道了-嘿,这里有问题,我可以退出。但是,有了这个,我不得不等待它运行,一直到完成为止,然后我要查看一些可能包含所有这些语句的跟踪文件,并尝试在大海捞针中寻找针头。再有,这总比没有好,但这不是最好的工作方式。现在,这就是上一张幻灯片中的文件。换句话说,我运行了该程序,并且该跟踪文件中只有一堆语句,因此我可能会也可能无法通过它来寻找我需要查找的内容。因此,我还是不太确定这是您想要的工作方式。

现在,交互式调试器–如果您使用Visual Studio之类的程序来编写程序或Eclipse,则您已经有了调试器,并且将它们与其他语言一起使用–只是不想在这里与数据库一起使用它们。那里有一些工具,例如我们的DB Artisan和我们的Rapid SQL,这是这里的Rapid SQL,其中有一个调试器,您可以在左侧看到一个名为“检查重复项”的存储过程。基本上,它只是去查看一下表中是否有多行具有相同的电影标题。因此,该数据库用于电影。您可以在右侧的顶部三分之一中看到Ive,在中间是我的源代码,在Ive中是所谓的watch变量和调用堆栈托盘,然后在底部Ive得到了一些输出。而且重要的是,如果您查看第一个红色箭头,如果我将鼠标悬停在变量上,则实际上我可以及时看到该变量在那个时刻的值,因为我正在逐步浏览代码。那真的很有用,然后我可以遍历代码一次,而不必说执行,可以说一行,让我看看发生了什么,另一行,让我看看发生了什么,我在数据库中这样做。即使我坐在PC上的Rapid SQL上并且数据库在云中,我仍然可以进行远程调试,并从此处查看和控制它,并像使用其他任何语言一样进行调试。

现在,那里的下一个箭头–您可以看到指向右侧的小箭头,指向该DBMS输出,这就是我的光标当前所在的位置–换句话说,Ive步进了,这就是我当前的位置。因此,如果我说“再走一步”,我将转到下一行。现在,在该位置正下方,您会看到一个红点。好吧,那是一个断点,上面写着“嘿,我不想越过这些行。”如果我只想跳过所有内容并到达那个红点,则可以单击运行按钮,然后从此处运行到最后,如果设置了任何断点,则将其设置为断点,然后它将停止并让我再次执行步进。而且之所以如此重要而强大,是因为当我执行所有这些操作时,中间甚至底部(但最重要的是中间)发生的事情都会改变,并且我可以从变量中看到值,您会看到我的调用堆栈跟踪,因此所有这些信息都会在我逐步浏览代码时显示在那里,因此我实际上可以看到并感觉到并了解执行过程以及代码在执行时的实际工作方式。通常,我可以找到一个问题,如果有问题,或者我足够好解决这个问题。

好的,现在我要谈论一个探查器,在这种情况下,这是我可以通过调试器看到的探查器。还记得我说过,有时它们是分开的,有时它们可​​以在一起吗?在这种情况下,同样是Rapid SQL中的Im,我可以看到在行号旁边的左侧有一个空白。那就是执行每一行代码所花费的秒数或微秒数,我可以清楚地看到,我所有的时间都花在了这个FOR循环中,我从表中选择了所有内容。因此,在FOR循环中发生的任何事情可能都是我需要看的东西,如果我可以做得更好,它将分红。我无法通过处理0.90或0.86的那些行来获得任何改进。那里没有太多时间。现在,在这种情况下,一次又一次,在Rapid SQL中,我看到了如何将配置与调试混合在一起。现在,Rapid SQL的优点是还允许您以其他方式进行操作。 Rapid SQL允许您说:“您知道吗?我不想进入调试器,我只想运行它,然后以图形或视觉方式查看相同类型的信息。”

您会看到Im不再位于调试器中,并且运行程序,执行完成后,它会向我提供图表以告诉我一些事情,因此我可以看到Ive有一条语句看起来像占了大部分蛋糕图表,如果我看一下,我会看到该网格朝向底部第23行,再次出现FOR循环:他占用了最多的时间,实际上他是暗红色咀嚼了所有饼图。因此,这是进行概要分析的另一种方法。我们碰巧在我们的工具中称该代码为“代码分析师”。但它基本上只是一个与调试器分开的分析器。有些人喜欢第一种方式,有些人喜欢第二种方式。

为什么我们要进行调试和分析?这不是因为我们想编写世界上最出色的代码并获得加薪–这可能是我们的原因,但这并不是您这样做的真正原因–您向企业保证您会做正确的事,这样您的程序才能有效。那就是您将使用调试器的目的。此外,业务最终用户;他们不是很耐心:他们甚至在按下键之前就想要结果。应该阅读他们的思想并立即做所有事情。换句话说,它必须高效。因此,这就是我们将使用探查器的目的。现在,如果没有这些工具,我确实相信您会弓箭在西装里的这个人,您正在向目标射击,并且蒙住了双眼。因为您将如何仅通过查看静态代码来查找程序的执行方式,以及如何仅通过查看静态代码来找出哪一行真正花费了最多的执行时间呢?代码审查可能会或可能不会出现其中一些问题,但是不能保证代码审查会找到所有这些问题。使用调试器和探查器,您应该能够找到所有这些错误。

好的,我只是在这里做一个真正的快速演示。我并不是要推销产品,我只是想向您展示调试器的外观,原因是很多人会说:“我以前从未见过这些调试器。”而且在屏幕快照中看起来很漂亮,但是运动时看起来像吗?因此,在我的屏幕上,我正在运行我们的DB Artisan产品;我们也有一个调试器。 DB Artisan对于DBA而言意味着更多,Rapid SQL对开发人员而言意味着更多,但是我已经看到使用DB Artisan的开发人员,而我见过使用Rapid的DBA。因此,不要被产品赶上。在这里,我可以选择进行调试,但是在启动调试之前,我将提取此代码,以便您可以在开始运行之前查看代码的样子。因此,这里的代码与屏幕快照中的代码完全相同,这是我检查是否重复的代码。我想调试它,所以按调试。而现在,这需要花一点时间,您会说:“嗯,为什么要花一点时间?”请记住远程调试:调试实际上是在数据库服务器上进行的,而不是在PC上进行的。因此,它必须经过并在该处创建一个会话,创建一个远程调试对象,将我的会话挂接到该远程调试会话并建立一个通信通道。

因此,现在,这是我的箭头,位于第一行的顶部,即代码中Im的位置。如果我按了其中的第三个图标,就会看到箭头刚刚移动,如果我一直按它,就会看到它一直在移动。现在,如果我想一直进行到此FOR循环,因为我知道那是问题所在,那么我可以设置一个断点。我以为我定了。哦,拍摄,我将自己的一个屏幕捕获键映射到了与调试器相同的键,这就是造成混乱的原因。好的,所以我只是在此处手动设置一个断点,所以现在不用一步一步,一步一步地走,直到到达那儿为止,实际上我只能说“继续并运行该程序”,它将停止。注意,它一直将我移动到断点所在的位置,所以我现在进入了运行此循环的缺点,可以看到我所有变量的设置,这不足为奇,因为我将它们全部初始化为零。现在,我可以进入此循环并开始查看该循环内部的情况。

因此,现在它要从我的租金中进行一次选择计数,然后我可以将鼠标悬停在那个家伙上,然后看,他的两个,两个大于一个,所以它很可能将做此代码的下一部分。换句话说,它发现了一些东西。我只是继续进行下去。我不想浏览这里的所有内容;我想向您展示的是调试器完成后,它像普通程序一样完成了。我已经设置了断点,所以当我说运行时,它只是回到了下一个断点。我让它运行到最后,导致我希望您看到的是调试器不会改变程序的行为:完成运行后,如果我未在调试器中运行它,则应该获得完全相同的结果。

然后,我将暂停演示并返回,因为我们想确保我们有时间提问和回答。因此,我将打开它以提出问题和答案。

埃里克·卡瓦纳(Eric Kavanagh): 好吧,罗宾,也许是您的一个问题,然后是德兹的几个?

罗宾·布卢尔(Robin Bloor): 是的,当然,我觉得这很有趣。我曾经使用过类似的东西,但是我从未在数据库中使用过类似的东西。您能给我一些人们使用探查器做什么的想法吗?因为看起来像,所以他们正在查看-因为我想是这样-他们正在查看性能问题,这是否可以帮助您区分数据库何时花费时间和代码何时花费时间?

伯特·斯卡尔佐: 您知道,这是一个奇妙的问题。可以说Im在Visual Basic中工作,而在Visual Basic中,我将调用Transact-SQL或PL / SQL。让我来做PL / SQL,因为Oracle在Microsoft工具中不能总是很好地发挥作用。我可能正在分析我的Visual Basic代码,那里的配置文件可能会说:“嘿,我调用了此存储过程,它花了太长时间。”但是随后我可以进入存储过程,并可以对存储的数据库进行配置文件步骤,然后说:“好的,在这里的100条语句中,下面是引起问题的5条语句。”因此,您可能必须组建标签小组,在其中必须使用多个分析器。

这个想法是,如果您被告知性能问题出在数据库中,那么数据库概要文件可能会帮助您在大海捞针中找到实际上有问题的语句所在的地方。我告诉您另一个与性能分析有关的事情:如果您有一段代码被调用一百万次,但是每百万次仅花费一微秒的时间,但是被调用一百万次,则分析器将显示,那么事情就运行了这么长时间。因此,尽管代码可能非常高效,但您可能会说:“哦,太频繁地对这段代码进行调用了。也许我们应该只每隔一段时间调用一次,而不是每次处理记录时都调用它。”因此,您实际上可以找到在哪里经常调用高效代码,而这实际上就是性能问题。

罗宾·布卢尔(Robin Bloor): 是的,那太好了。我从来没有这样做。您当然可以看到,当我遇到数据库问题时,就像以某种方式处理数据库或处理代码一样。我永远无法同时处理这两个问题。但是,我还是没有做过—我从未真正参与过构建存储过程的应用程序,因此我想我从未真正遇到过使我发狂的问题,即您将代码在数据库和程序。但是,做所有事情就可以了。我想答案是肯定的,但这是开发团队活动的一部分,当您以一种或另一种方式尝试修复已损坏的内容,或者尝试将一个新应用程序整合在一起时。但这是否与我在环境中期望的所有其他组件相匹配?我是否可以期望将其与我的所有测试包以及我将要进行的所有其他工作以及项目管理工作一起剪辑,这是如何将这些剪辑在一起的?

伯特·斯卡尔佐: 是的,它可以成为您进行编程或开发工作的任何结构化过程的一部分。有趣的是,上周我有一个正在构建Web应用程序的客户,而且从历史上看,他们的数据库很小,因此,他们不是很好的程序员这一事实从来没有伤害过他们。嗯,他们的数据库已经发展了许多年,现在在您说“登录并给我一些数据供您查看”到实际出现屏幕之间的时间中,网页花费了20秒。性能问题。他们知道问题不在他们的Java或其他任何地方。但是他们有成千上万个存储过程,因此他们必须开始对存储过程进行概要分析,以找出为什么此网页需要20秒才能显示出来?实际上,我们发现他们在其选择语句之一中加入了笛卡尔坐标,但并不知道。

罗宾·布卢尔(Robin Bloor): 哇。

伯特·斯卡尔佐: 但是有人曾经对我说:“他们怎么能进行笛卡尔联接而又不知道呢?”这听起来真是太可怕了。有时候,一个对SQL不太熟悉的程序员会做一些事情,例如给我笛卡尔联接,但是然后只给我第一条记录,所以我知道我得到了一些东西,而我只需要第一条。因此,他们没有意识到他们只是带回了十亿条记录,或者他们浏览十亿条记录,因为他们得到了他们感兴趣的记录。

罗宾·布卢尔(Robin Bloor): 哇,我知道,这就是所谓的-那就是Dez正在进行的事情,就人们所知,他们的技能并不像他们应该的那么熟练。如果您是一名程序员,则应该知道发出任何命令的含义。我的意思是,真的,没有任何愚蠢的借口。我还假设您在某种程度上与语言无关,因为这一切都集中在数据库方面。我说的对吗?不管您在编码方面使用了什么,都一样吗?

伯特·斯卡尔佐: 绝对可以在Fortran或C或C ++中执行此操作。实际上,在某些Unix上,您甚至可以为它们的脚本语言执行此操作。他们实际上提供了相同的工具。然后,我想再说一遍,您无可辩驳。我要给程序员一个休息时间,因为我不喜欢把程序员扔在总线下。但是问题实际上是学术环境,因为当您去学习如何成为一名程序员时,您会教一次记录思维。不会教您集合思维,这就是结构化查询语言或SQL处理集合的方式。这就是为什么我们有并集,相交和负运算符。对于有时从未想到过唱片的人来说,有时很难戒除,放弃一次记录处理并使用唱片。

罗宾·布卢尔(Robin Bloor): 是的,我和你在一起。我的意思是,我现在明白了,那就是教育问题;我认为这完全是一个教育问题,对于程序员来说,按照程序进行思考是很自然的事情。而且SQL不是程序性的,它是声明性的。您实际上只是在说:“这就是我想要的,我不在乎您如何做,”您知道吗?而使用编程语言时,您经常会袖手旁观,而在循环时却陷入甚至管理计数的细节中。生病了-

伯特·斯卡尔佐: 好的,继续。

是的,我要说的是您提出了另一个示例,即分析器很适合捕获这种一次记录处理。有时,擅长一次记录逻辑的程序员无法弄清楚如何执行SQL程序。好吧,可以说他创建了两个FOR循环并基本上进行了联接,但他在客户端进行了联接。因此,他执行与联接相同的效果,但他自己执行联接,而概要文件将捕获该联接,因为与让数据库服务器为您完成连接相比,您可能最终会花费更多的时间手动执行联接。

罗宾·布卢尔(Robin Bloor): 是的,那将是一场灾难。我的意思是,您只会四处走动。抛掷总是不好的。

无论如何,生病会传给Dez。我确定他有一些有趣的问题。

Dez Blanchfield: 谢谢,是的。我将和您一起参加不丢掉程序员的电话。我的意思是,我一生中花了很多年时间自己担任编码人员,在每个级别上,您都知道,它是否如您所说的那样,坐在Unix机器的命令行上,在某些情况下,我甚至参与了从一个硬件平台到另一个硬件平台的Unix的两个不同端口。您可以想象我们在那里遇到的挑战。但是实际情况是,世界上每个编码人员和脚本编写者都可以从监狱中脱身。确切地说,这是一门火箭科学,每时每刻都要写得很紧。还有像Dennis Ritchie和Brian Kernahan这样的人的著名故事,他们独立地编写某些代码,然后在喝咖啡时进行代码审查聊天,并发现他们在完全相同的程序中以完全相同的代码编写了完全相同的代码以同样的方式。他们是用C语言编写的。但是,纯粹的编程水平很少存在。

事实是,每天只有24小时,一周只有7天,我们只需要完成工作即可。因此,不仅是传统的程序员,DBA,编码人员,脚本编写者,系统管理员,网络管理员和安全人员,而且这些日子一直贯穿到公民数据方面。我们听到,每个人都只是想尽自己的职责。因此,我认为整个事情的最大收获就是我喜欢您的演示,我喜欢您刚才离开我们这里的收获,与Robin讨论了这一事实,它确实具有特殊之处-也许没有那么多一个利基市场-但它适用的广阔空间,包括固定代码,SQL和数据库。但是,听到您说可以在shell脚本中戳它并发现一些问题,我感到非常兴奋,因为您知道,在当今这一时代,始终都在以最低的成本进行工作。

之所以可以在某处购买6美元的衬衫,是因为有人构建了一个足够便宜的系统,可以实际制造,运输和物流配送,销售和零售,并通过在线付款来获得这6美元的衬衫。如果您让人们每年以完美的方式编写代码,年薪40万美元,那将不会发生。它只是整个发展。因此,在这一点上,我想Id真正爱您的问题之一就是为我们提供更多的见解,即您目前正在部署这类工具来分析代码外观的人们的广度和影响范围是什么?性能问题?最初,从历史上看,它们来自哪里?他们曾经是大型工程公司吗?然后,向前发展,是这样吗,我是否认为越来越多的公司正在实施此工具或这些工具以尝试帮助编码人员,他们知道他们只是在做事情才能完成工作,这是正确的吗?然后把它拿出来有时我们需要一张监狱卡吗?我是否认为历史上我们更注重工程和发展?现在,正如罗宾所说,现在正在减少学术方法,现在是自学式的或剪切粘贴的代码,还是只是在构建东西?这与现在正在使用该产品的人匹配吗?

伯特·斯卡尔佐: 是的,完全正确。我给您举一个非常具体的例子,我们只是想把工作做好,导致商人们不想要完美。有点像计算机化的国际象棋游戏:国际象棋游戏并不寻找完美的答案;它会在合理的时间内寻找足够好的答案,这就是我们编程的方式。但是我现在发现的是,大多数人没有说要在他们的单元测试中使用探查器-这就是我会做的,因为我不认为这是在浪费时间-现在正在做的事情就是这样后来,有时在集成测试或压力测试期间,如果幸运的话。但是大多数时候,它是升级的一部分,有些东西已经投入生产,它运行了一段时间,甚至可能运行了很多年,现在运行不佳,现在很好地描述了它。这似乎是现在更常见的情况。

Dez Blanchfield: 是的,我认为“技术债务”一词可能比您熟悉的更多。我知道罗宾,我当然知道。我认为这些天,特别是在开发和系统构建的敏捷方法中,对我而言,技术债务的概念现在是非常现实的事情,而我们实际上在项目中对此予以考虑。我知道,我的意思是,我们拥有自己的项目,例如Media Lens等,我们每天都在进行编码工作,还有Bloor Group的各种工作。每当构建任何东西时,我们都会去看,看,并且总是从现在的角度来看待这个问题,而现在我只能把它放在罐子里,把它拿出来,然后看,看这东西是否会坏掉。并继承此技术债务,我知道我以后必须回头再解决。

我的意思是,我在过去的七天内做到了:我编写了一些工具和脚本,我编写了几段Python语言,并将其部署到Mongo后端,以确保其美观,整洁和安全,但是它只是得到了我需要完成的查询,知道我需要该函数才能工作,才能解决更大的难题;那就是我真正的痛苦所在。因此,您承担了这笔技术债务,我认为现在这不仅仅是偶然的事情,我认为这是现在发展的DNA的一部分。人们只是(而不是毫不客气地)只接受技术债务,这是正常的操作方式,并且他们必须承担责任。它是您承担技术债务的地方。而且我认为您在演示中向我们展示的很棒的事情是,您可以从字面上描述和观察运行某项操作需要多长时间。那可能是我最喜欢的东西之一。我的意思是,我实际上已经构建了性能分析工具-我们曾经在Sed和Lex和Orc中构建工具来运行我们的代码,并在可用此类工具之前查看循环的位置-以及何时构建了代码并查看自己的代码,您将非常擅长查看自己的代码。但是现在情况并非如此。考虑到这一点,是否有特定的细分市场比其他任何细分市场占有更多的份额?像群众一样

伯特·斯卡尔佐: 哦,是的,我已经—我将为您做一个比喻,并向您展示非程序员一直都在这样做。因为如果我曾经教过调试器和性能分析类或会话,我会问人们:“好吧,这里有多少人使用Microsoft Word,并且故意从未使用过拼写检查程序?”而且没有人举起手来,因为编写文档时,我们都知道我们会犯英语错误,因此每个人都使用拼写检查器。我说:“好吧,当您像Visual Basic这样在IDE中编写代码而又不使用调试器时,又会如何呢?一样,就像拼写检查器一样。”

Dez Blanchfield: 是的,实际上,这就是一个很好的类比。我没有真正考虑过,我不得不承认我实际上使用了一些工具来做类似的事情。实际上,我最喜欢Eclipse的ODF就是在其中剪切并粘贴代码,然后去寻找可以立即突出显示的内容,并意识到我在某些类调用中输入了错误。而且,但是现在有了这样的工具,您可以实时进行操作,而不用稍后再查看它,这很有趣,可以很轻松地将其捕获。但是,是的,这就像只是将其放入文字处理器中一样,引起了一个有趣的唤醒呼叫,只是意识到您犯了一些错字甚至语法错误,对吗?

伯特·斯卡尔佐: 究竟。

Dez Blanchfield: 因此,您认为我现在想看到的更多问题是,我的意思是我提出的最后一个问题,也许是在我对参加者进行问答之前。如果您打算就此方法提出一些建议(我想这是夸夸其谈的话),是不是您在开发之前就尽早开始并在实施时实施了此建议?或者是您主要是建造,移动,建造某些东西然后再进行剖析的情况?我怀疑早起的情况,并确保您的代码预先清理。还是在这种情况下,他们应该考虑部署后的这一部分?

伯特·斯卡尔佐: 理想情况下,他们会提前做,但是由于每个人都处在忙碌而忙碌的世界中,他们只是想把事情做好,因此他们倾向于不这样做,直到遇到性能问题,而他们无法通过添加更多的CPU和内存来解决虚拟机。

Dez Blanchfield: 是的因此,实际上您提到了一些有趣的事情,如果可以的话,可以吗?您之前提到过,它可以在任何地方运行,并且可以在后端与数据库对话。因此,这对于我们现在谈论的那种双峰概念(内部部署/非内部部署云)还是很满意的,无论从外观上还是最终,如果它可以与后端对话并看到代码,它不是很在乎,是吗?

伯特·斯卡尔佐: 确实,是的,您可以在云中运行它。

Dez Blanchfield: 太好了,因为我认为这就是我们新的勇敢世界前进的方向。所以,埃里克。我现在要回覆给您,看看我们在这里有几个问题,即使我们已经过去了一个小时,我也希望我们的与会者仍然与我们在一起。

埃里克·卡瓦纳(Eric Kavanagh): 是的,那里有几个人,病态只是个简短的评论:伯特,我认为隐喻,您对使用拼写检查的类比坦率地讲得很出色。坦率地说,这值得一两个博客,因为这是一个框架,可以很好地说明您所做的事情,它的价值以及在调试器上使用调试器的最佳实践。有规律吧?我敢打赌,当你扔掉那个头时,你会点头,对吗?

伯特·斯卡尔佐: 绝对,因为我告诉他们的原因是:“为什么要对文档进行拼写检查?我不想被愚蠢的拼写错误所困扰。”好吧,他们不想被愚蠢的编码错误所困扰!

埃里克·卡瓦纳(Eric Kavanagh): 对。确实是的。好吧,伙计们,我们在这里烧了一个小时零五分钟,非常感谢你们所有人的时间和精力。我们会存档所有这些网络聊天记录,随时可以随时回来查看它们。查找这些链接的最佳位置可能是techopedia.com,因此请在此处将其添加到此列表中。

到了那,伙计们将告别你。再次感谢Bert,感谢IDERA的朋友。好吧,下次再谈,事实上,下周再谈。照顾自己!再见。