PostgreSQL查询优化器详解.pdfVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PostgreSQL 查询优化器详解 作者介绍 张树杰,《PostgreSQL 技术内幕:查询优化深度探索》作者,⽬前在 Pivotal 公司任 职 Apache HAWQ 数据库内核开发⼯程师,具有多年数据库内核开发经验。 本⽂的部分内容摘⾃《PostgreSQL 技术内幕:查询优化深度探索》,并且修改为以 ⼩明、⼤明、⽜⼆哥三⼈对话的⽅式展现,该⽂⾸发⾃ DBAPlus 的公众号。 1. 查询优化器的基本原理 ⼩明考上了北清⼤学的计算机研究⽣,今年学校开了数据库原理的课程,⼩明 对查询优化的内容不是很理解,虽然已经使出了洪荒之⼒,仍觉得部分原理有些晦涩 难懂,于是打算问⼀下⾃⼰的哥哥⼤明。 ⼤明是⼀位资深的数据库内核开发⽼码农,对 Greenplum/HAWQ 数据库有多 年的内核开发经验,眼镜⽚上的圈圈像年轮⼀样⻅证着⼤明⼗多年的从业经历。知道 ⼩明要来问问题,⼤明有点紧张,虽然⾃⼰做数据库内核好多年了,但是对优化器研 究不甚深⼊,如果被⼩明这样的⼩菜⻦问倒就尴尬了,于是⼤明只好临时抱佛脚,拿 出了好多年不看的《数据库系统实现》啃了起来。 ⼩明提出的第⼀个问题是:“为什么数据库要进⾏查询优化?” ⼤明推了推⿐梁上的眼镜,慢条斯理地说:“不⽌是数据库要进⾏优化,基本上 所有的编程语⾔在编译的时候都会优化,⽐如你在编译 C 语⾔的时候,可以通过编译 选项-o 来指定进⾏哪个级别的优化,但是查询数据库的查询优化和 C 语⾔的优化还 有些区别。” “有哪些区别呢?”⼤明停顿了⼀下,凝视着⼩明,仿佛期望⼩明能给出答案, 或是给⼩明腾挪出⾜够思考的空间。三五秒之后⼤明⼜⾃问⾃答道:“C 语⾔是过程化 语⾔,你已经指定好了需要执⾏的每⼀个步骤,但是 SQL 是描述性语⾔,它只指定了 WHAT ,⽽没有指定 HOW,这样它的优化空间就⼤了,你说是不是?” ⼩明点了点头说:“对,也就是说条条⼤路通罗⻢,它⽐过程语⾔的选择更多, 是不是这样?”⼤明笑道:“孺⼦可教也。虽然我们知道它的优化空间⼤,但具体如何 优化呢?” 说着⼤明将身⼦向沙发⼀靠,翘上⼆郎腿继续说:“通常来说分成两个层⾯,⼀ 个是基于规则的优化,另⼀个是基于代价的优化。基于规则的优化也可以叫逻辑优化 或者规则优化,基于代价的优化也可以叫物理优化或者代价优化。” “为什么要进⾏这样的区分呢?优化就优化嘛,何必还分什么规则和代价 呢?”,⼩明问道。 “分层不分层不是重点,有些优化器层次分得清楚点,有些优化器层次分得就不 那么清楚,都只是优化⼿段⽽已。”⼤明感到有点⼼虚,再这么问下去恐怕要被问住, 于是试图引开话题:“我们继续说说 SQL 语⾔吧,我们说它是⼀种介于关系演算和关 系代数之间的语⾔,关系演算和关系代数你看过吧?” ⼩明想了想,好像上课时⽼师说过关系代数,但没有说关系演算,于是说:“接 触过⼀点,但不是特别明⽩。”⼤明得意地说:“关系演算是纯描述性的语⾔,⽽关系 代数呢,则包含了⼀些基本的关系操作,SQL 主要借鉴的是关系演算,也包含了关系 代数的⼀部分特点。” ⼤明看⼩明有点懵,顿了⼀下继续说道:“上课的时候⽼师有没有说过关系代数 的基本操作?”⼩明想了⼀下说:“好像说了,有投影、选择、连接、交集、差集这⼏ 个。”⼤明点点头说:“对的,还可以有⼀个叫重命名的,⼀共 6 个基本操作,另外结 合实际应⽤在这些基本操作之上⼜扩展出了外连接、半连接、聚集操作、分组操作等 等。” ⼤明继续说道:“SQL 语句虽然是描述性的,但是我们可以把它转化成⼀个关 系代数表达式,⽽关系代数中呢,⼜有⼀些等价的规则,这样我们就能结合这些等价 规则对关系代数表达式进⾏等价的转换。” “进⾏等价转换的⽬的是找到性能更好的代数表达式吧?”⼩明问。 “对,就是这样。”⼤明投去赞许的⽬光。 “那么如何确定等价变换之后的表达式就能变得⽐之前性能更好呢?或者说为什 么要进⾏这样的等价变换,⽽不是使⽤原来的表达式呢?” ⼤明愣了⼀下,仿佛没有想到⼩明会提出这样的问题,但是基于⾃⼰多年的忽 悠经验,他定了定神,回答道:“这既有经验的成分,也有量化的考虑。例如将选择操 作下推,就能优先过滤数据,那么表达式的上层

文档评论(0)

moon8888 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档