fun9g子句中,因为在g肉pbຘy之前无຀从知道聚合函数的结果。任何与聚合无关的条件都应放在9here子句中,从而减少为进行g肉pby而必须执行的排序操作所处理的数据量。现在回过头来看客户与订单的例子,我承认先前处理订单的方法比较复杂。在订单完成之前๩,必须经历几个阶段,这些都记录在表orderstatus中ณ,该表的主要字段有:ordid订单id、staທtus、statusdate时间戳等,主ว键由áordid和statusdate组成。我们的需求是列出所有尚未标记为ฦ完成状态的订单假设所有交易都已终止的下列ต字段:订单号、客户名、订单的最后状态,以及设置状态的时间。最终,我们写出下列查询,滤掉已๐完成的订单,并找出订单当前状态:色le9ame,oordid,osstaທtus,osstaທtusdatefromcustomersc,ไorderso,orderstatusos9hereoordid=๡osordidandnotexists色le9ullfro摸rderstatusos29aທplete'aທndos2๐ordid=oordidandosstatusdate=色lectmaxstatusdatefro摸rderstatusos39hereos3๑ordid=oordidandocustid=ustid乍一看,这个ฐ查询很合理,但事实上,它让人非常担心。先,上面代码中有两个子查询,但它们嵌入的方式和前一个例子的方式不同,它们只是彼此间接相关的。最让人担心的是,这两个子查询访问相同的表,而且该表在外层已经被访问过。我们编写的过滤条件质量如何呢?因为只检查了订单是否完成,所以它不是非常精确。这个查询如何执行的呢?很显然,可以扫描orders表,检查每一条订单记录是否为ฦ已完成状态——注意,仅通过表orders即可找出所要信息似乎令人高兴,但实际情况并非如此,因为只有上述活动之后,才能检查最新状态的日期,即必须按照子查询编写的顺序来执行。上述两个子查询是关联子查询,这很不好。因为必须要扫描orders表,这意味着我们必须检查orders的每条订单记录状态是否为“plete”,虽然检查状态的子查询执行很快,但多次重复执行就不那么快了。而且,若第一个子查询没找到เ“plete”状态时,还必须执行第二个子查询。那ว么เ,何不试试非关联子查询呢?要编写非关联子查询,最简单的办法是在第二个子查询上做文章。事实上,在某些sql方แ言中,我们可以这么写:andoordid,osstatusdate=๡色lectordid,maxstatusdatefro摸rderstatusg肉pbyordid这个子查询会对orderestatus作“全扫描”,但未必是坏事,下面会对此加以解释。重写的子查询条件中ณ,等号左端的“字段对”有点别扭,因为这两个字段来自不同的表,其实不必这样。我们想让orders和orderstaທtus的订单id相等,但优化器能感知这一点吗?答案是不一

--ๅ----ๅ---ๅ----ๅ-----ๅ--ๅ-ๅ--page47-ๅ---ๅ--ๅ-------ๅ---ๅ---ๅ--ๅ--

本书假定你已๐精通sql语言。这里所说的“精通”不是指在你大学里学了sql101并拿来a+的成绩,当然也๣并非指你是国际公认的sql专家,而是指你必须具有使用sql开数据库应用的经验、必须ี考虑索引、必须ี不把5๓000行的表当大表。本书的目标不是讲解连接、外连接、索ิ引的基础知识,阅读本书过程中,如果你觉得某个sql结构还显神秘,并影响了整段代码的理解,可先阅读几本其他sql书。另外,我假定读者至少熟悉一种编程语言,并了解计算机程序设计的基本原则。性能已很差、用户已抱怨、你已在解决性能ม问题的前线,这就是本书的假定。本书内容我现sql和战争如此相像,以至于我几乎ๆ沿用了《孙子兵法》的大纲,ไ并保持了大部分题目名称注2。本书分为12章,每一章包含许多原则ท或准则,并通过举例的方式对原则进行解释说明,这些例子大多来自于实际案例。第1้章,制ๆ定计划ฐ:为性能而设计讨论如何设计高性能数据库第2章,动战争:高效访问数据库解释如何进行程序设计才能高效访问数据库第3章,战术部ຖ署:建立索引揭示为何建立索引,如何建立索ิ引第4章,机动灵活:思考sql语句解释如何设计sql语句第5๓章,了如指掌:理解物理实现揭示物理实现如何影响性能第6章,锦囊妙计:认识经典sql模式包括经典的sql模式、以及如何处理第7章,变换战术:处理层次结构说明如何处理层次数据第8章,孰优孰劣:认识困难,处理困难指出如何认识和处理比较棘手的情况第9章,多条战线:处理并讲解如何处理并第1้0章,集中兵力:应付大数据量讲解如何应付大数据量第11章,精于计谋:挽救响应时间分享一些技巧,以挽救设计糟糕的数据库的性能第12章,明察秋毫:监控性能收尾,解释如何定义和监控性能ม本书约定本书使用了如下