当尝试了解如何SQL声明是执行,它有时建议看看的解释的计划。什么样的过程是一个应该通过在解释(感觉到)的解释的计划?我应该脱颖而出,"哦,这是工作出色的?"对"哦,不,那是不正确的。"

有帮助吗?

解决方案

我不寒而栗,每当我看到的评论意见,完全tablescans是坏和索引的访问是好的。完整的表扫描、指数范围扫描、快速全指扫描、嵌套的循环,合并的加入,散列加入等等。简单地访问的机制,必须理解的分析和结合一个知识数据库的结构和目的的查询,以便达成任何有意义的结论。

全面扫描是简单的最有效的方法阅读的比例大块的数据分段(表或表(子)分),并且,虽然它经常可以表明性能的问题,即是只有在上下文中是否这是一个有效的机制,用于实现这些目标的查询。作为一个数据仓库和双家伙,我的号码一个警告标志性是指数据的方法和一套循环。

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

有一个良好的通读性能的调整指南。

还有一个谷歌"基数的反馈意见",一种技术在其中一个解释的计划可以用来比较的估计数的基数在各个阶段在查询与实际的基数经历了期间的执行。沃尔夫冈*百年是作者的方法,我相信。

因此,底线:了解访问机制。了解该数据库。了解本意的查询。避免规则的拇指。

其他提示

这个问题太大,无法回答这样的问题.你应该花一些时间来阅读 Oracle性能的调整指南

下面两个例子显示一个完整的扫描和快速扫描使用索引。

这是最好专注于自己的成本基数。看着的例子使用的指数降低了成本的运行查询。

它是一个比较复杂(以及我没有100%的把手上)但是基本成本是一个功能的CPU和IO成本基数是行数Oracle期望分析。减少这些都是一件好事。

不要忘记,查询可以受您的查询和Oracle优化模型(例如:成本,选择等)和如何经常运行的统计数据。

实例1:

扫描http://docs.google.com/a/shanghainetwork.org/File?id=dd8xj6nh_7fj3cr8dx_b

例2中使用索引:

索引http://docs.google.com/a/fukuoka-now.com/File?id=dd8xj6nh_9fhsqvxcp_b

并且如已经建议,注意台扫描。你通常可以避免这些。

在寻找的东西喜欢顺序扫描可以比较有用,但现实是,在数字...除了当数字只是估计!通常是什么 更有助于寻找在查询 计划 是看实际的 的执行.在Postgres,这是之间的差别解释和解释进行分析。解释进行分析的实际执行查询,以及获取实时信息对每个节点。可以让你看到什么 实际上 发生的事情,而不是有什么计划 认为 会发生。很多时候你会发现一个顺序扫描并不是一个问题,而是别的东西在查询。

其他关键是确定什么昂贵的实际步骤。许多图形的工具,将使用不同大小的箭头指示如何从不同的部分计划的成本。在这种情况下,只要看看步骤,有薄箭和一个粗箭头离开。如果你不使用GUI你需要眼球的人数,并寻找他们在那里突然得到大得多。有一点点的做法变得相当容易出问题地区。

真正的问题,这样做的最好的事情是 ASKTOM.特别是他对这个问题的答案含有链接的网上Oracle医生,那里有很多的这些各种各样的规则来解释。

一件事,要记住,这是解释的计划真的是最好的猜测。

这将是一个很好的想法,学习使用sqlplus,并试验的AUTOTRACE命令。有一些硬数据,通常可以做出更好的决策。

但你应该ASKTOM.他知道所有关于它:)

输出的解释告诉你多久每个步骤已经采取。第一件事就是找到的步骤已经采取了很长一段时间,并了解他们是什么意思。东西就像一个循序扫描告诉你,你需要更好的指数--它主要是一个问题的研究到你的特别数据库和经验。

一个"哦,不,那是不对的"通常的形式 表扫描.表扫描不利用任何特殊的索引,并可以有助于清除的每一个用于记忆缓存。在postgreSQL,例如,你将会找到它看起来像这样。

Seq Scan on my_table  (cost=0.00..15558.92 rows=620092 width=78)

有时表扫描是想过来说,使用指标来查询该行。然而,这是那些红色的标志图案,你似乎是在寻找。

基本上,你看看每一个动作,看看如果操作的"有意义"鉴于你的认识应该如何能够工作。

例如,如果你加入两个表,而B在它们各自的列C和D(A C=B.D),和您的计划展示了一个聚集指标扫描(SQL服务器的术语--不确定的oracle期)上表一,然后嵌套循环加入的一系列集群索引寻求在表B,你可能认为有一个问题。在这种情况下,你可能期望的引擎做一对索引扫描(在索引加入了列)随后由一个合并的加入。进一步的调查可能揭示出不良的统计数据制作的优化选择,加入模式,或一种指数,实际上并不存在。

看看花费的时间百分比,在每个小节的计划,并考虑什么样的发动机是这样做的。例如,如果是扫描一个表,考虑把索引领域(s)就是扫描

我主要寻找的索引,或表格的扫描。这通常告诉我我丢失的索引的一个重要列在那里发言,或参加发言。

http://www.sql-server-performance.com/tips/query_execution_plan_analysis_p1.aspx:

如果你看到任何的以下一个 执行计划,应该考虑 他们警告标志和调查 他们为潜在的性能 问题。他们每个人都不到 理想的从业绩的观点。

* Index or table scans: May indicate a need for better or  additional indexes.
* Bookmark Lookups: Consider changing the current clustered index,
  consider using a covering index, limit
  the number of columns in the SELECT
  statement.
* Filter: Remove any functions in the WHERE clause, don't include wiews
  in your Transact-SQL code, may need
  additional indexes.
* Sort: Does the data really need to be sorted? Can an index be used to
  avoid sorting? Can sorting be done at
  the client more efficiently? 

它并不总是可以避免 这些,但更可以避免 他们的速度越快,查询业绩 将。

规则的拇指

(你可能会想读了关于详细信息:

糟糕

表扫描,几个大型的表

很好的

使用一个独特的索引
指数包括所有需要的领域

最常见的赢

在大约90%的性能的问题,我们已经看到,最简单的赢是要打破了一个查询,有很多(4个或更多的)表格进入2个较小的查询和临时表。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top