五 [译]数据库是如何工作查询管理器

这部分是数据库的强大之处 。在这部分中,一个写的不太好的查询被转换成一个快速的可执行代码 。然后执行代码,并将结果返回给客户端管理器 。这是一个多步骤操作:
在这部分,我不会讨论最后两点因为他们不那么重要 。在阅读这部分之后,如果你想了解更多我推荐你阅读:
查询解析()
每条SQL语言都会被送到解析器,在那里检查语法是否正确 。如果你的查询语句有错,解析器会拒绝这条语句 。例如:如果你写“SLECT ... ” 而不是 “ ... ”,就会在马上结束 。
解析不仅仅是检查单词拼写,还会更深入 。它还检查关键字是否按正确的顺序使用 。例如,WHERE 在之前也会拒绝 。
然后,对查询中的表和字段进行分析 。解析器会使用数据库的元数据()来检查:
接着,它会检查你是否用读表(或写表)的授权 。同样的,这些表的访问权限由你的DBA设置的 。在解析的时候,SQL查询语句会被转换成内部的表示(通常是树)
如果一切正常,就会把内部表示发送给查询重写器
查询重写器
在这步,我有一个查询语句的内部表示 。重写的目标是
这重写器执行 这重写器会对查询(query,这里应该是说内部表示)执行一系列已知的规则 。如果这查询匹配到规则,就会用这个规则重写 。一下是一些(可选)的非详尽的规则:
举个例子
SELECT PERSON.*FROM PERSONWHERE PERSON.person_key IN(SELECT MAILS.person_keyFROM MAILSWHERE MAILS.mail LIKE 'christophe%');
或被替换成
SELECT PERSON.*FROM PERSONWHERE PERSON.person_key IN(SELECT MAILS.person_keyFROM MAILSWHERE MAILS.mail LIKE 'christophe%');
然后会将这个重写的查询发送到查询优化器,开始有趣起来了!
统计
在我们看到数据库是如果优化查询之前,我们需要讨论一下统计因为没有了他,数据库是一个愚蠢的。如果你没有告诉数据库要分析它自己的数据,它是不用去做的,而且它会做出非常糟糕的假设 但是什么样的信息是数据库需要的呢? 我不得不(简要)地谈论数据库和操作系统是如何存储数据的 。他们都使用一个最小的单元叫页(page) 或者块(block)(默认是4或者8KB 。这意味着如果你需要 1KB无论如何起码都会用掉你一页了 。如果你一页是 8KB,就会浪费掉 7KB 回到统计!当你要求数据库要收集统计信息时,他会计算这些值:
有关表索引的信息
这些统计会帮助优化器预估查询的磁盘 I/O、CPU 和内存使用情况 每列的统计信息都很重要 。举个栗子,如果有一个的表格就要关联(JOIN)两个列:,。通过统计,数据库知道只有只有 1,000 不同值,而有 1,000,000 个不同值(每个人都有和,量是一样) 。所以数据库会按 , 的顺序连到数据上,而不是按 , 的顺序 。这能减少很多对比因为大多不相同,因为很多是时候只要对比前面 2(或者3) 个的字符就够了 。但这些是基础统计 。你可以要求数据库计算很高级的数据叫柱状图() 。柱状图可以统计列中的()值的分布的信息 。例如:
这额外的统计会帮助数据库讯号一个很好的查询计划 。特别是对于等式谓词(如:WHERE AGE = 18)或者是范围谓词(如:where AGE > 10 AND AGE < 40)因为这数据库能更好地知道这些谓词涉及的行数 这些统计会存储在数据库的元数据()中 。例如你可以看到表(非分区表)的这些统计:
这些统计必须是最新的 。没有什么比数据库认为表只有 500 行实际上有 1,000,000行更糟糕了 。统计的唯一缺点是需要时间去计算 。这就是大部分数据库默认不是自动计算的原因 。数百万的数据让计算变得很困难 。在这种情况下,你可以选择只计算基本统计信息或者按事例数据那样统计信息