sql - 您如何解释查询的解释计划?

标签 sql database performance oracle sql-execution-plan

当试图了解 SQL 语句的执行方式时,有时建议查看解释计划。在解释(理解)解释计划时应该经历什么过程?什么应该脱颖而出,“哦,这工作得很好?”与“哦不,那不对。”

最佳答案

每当我看到完整表扫描不好而索引访问很好的评论时,我都会不寒而栗。全表扫描、索引范围扫描、快速全索引扫描、嵌套循环、合并连接、散列连接等都是简单的访问机制,分析师必须理解这些机制,并结合数据库结构知识和查询目的以便得出任何有意义的结论。

全扫描是读取数据段(表或表(子)分区)的大部分块的最有效方法,虽然它通常可以指示性能问题,但这只是在它是否是实现查询目标的有效机制的上下文中。作为一名数据仓库和 BI 人员,我的第一个性能警告标志是基于索引的访问方法和嵌套循环。

因此,对于如何阅读解释计划的机制,Oracle 文档是一个很好的指南:http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/ex_plan.htm#PFGRF009

也请仔细阅读性能调优指南。

还有一个用于“基数反馈”的谷歌,一种解释计划可用于将查询中各个阶段的基数估计与执行期间遇到的实际基数进行比较的技术。我相信 Wolfgang Breitling 是该方法的作者。

因此,归根结底:了解访问机制。了解数据库。了解查询的意图。避免经验法则。

关于sql - 您如何解释查询的解释计划?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/79266/

相关文章:

mysql - 从 mysql 表中的同一列获取计数?

multithreading - 计时 Spark 过程,如果过慢则将其终止

python - 如何在 python 中高效地多线程或多进程处理大型 itertools.combinations?

c++ - 指针追逐基准 : Read+Write(+CLFLUSH) faster than Read(+CLFLUSH)

php - Rails 和 PHP 可以在不同时间访问同一个 SQL 数据库吗?如何?

sql - where 子句中的 Oracle 案例

sql - 具有多个值的 CASE IN 语句

mysql - 将常规 SQL 结果数组保存为另一个表中的条目确实减少了查询次数,好主意与否?

database - 微服务 - 在无事务系统中处理幽灵记录的最佳实践

sql - 在复制中处理标识列的最佳方法