【问题标题】:Query Performance - Order By on Primary key or other key查询性能 - 按主键或其他键排序
【发布时间】:2014-12-30 16:56:23
【问题描述】:

我对 Oracle 11g 的查询性能有疑问。

我有两个按主键和非主键排序的查询。

materialid 是主键。 material 是非主键。

Query A: select * from rawmaterial_t order by materialid;
Query B: select * from rawmaterial_t order by material;

以上查询中哪一个在性能上会更好,或者它们是等效的? 我们如何提高性能?

谢谢!

【问题讨论】:

  • 您实际上是在选择表格中的每一行吗?或者现实中是否有一个WHERE 子句将结果限制为较少的行数?这将影响 Oracle 是否会考虑任何索引,或者是否会进行全表扫描然后对结果进行排序。 rawmaterial_t 是堆组织表吗?还是按索引组织的表?

标签: sql database oracle11g database-performance query-performance


【解决方案1】:

检查性能的最佳方法是尝试在您自己的系统上运行这两个查询。

一般来说,Oracle 足够聪明,可以在适合order by 的情况下使用索引,尤其是在没有连接、聚合或过滤器的情况下。如果两列都有索引,那么主索引可能会快一点。

所以,我希望 order by materialidorder by material 快​​。如果您在material 上有索引,则性能应该相当。

【讨论】:

  • 如果没有WHERE 子句,但是,我希望执行表扫描然后对内存中的数据进行排序而不是使用索引和执行ROWID 会更有效查找表中的每一行。正如所写,我不希望 Oracle 使用任何索引。
  • @JustinCave 。 . .在这种情况下,Oracle 可能会也可能不会使用索引。文档确实说“如果可以使用索引来满足ORDER BY 子句,那么优化器将使用此选项并避免排序。” (docs.oracle.com/cd/B28359_01/server.111/b28274/…)
  • 当然可以。如果它确实如此,我会感到非常惊讶,除非有人对表和索引上的统计数据进行了大量的处理,以使索引看起来足够吸引人使用。不过,我怀疑真正的问题涉及一些谓词,这些谓词会减少返回的行数并使索引可能更加合理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-08
  • 2012-08-04
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多