【发布时间】:2011-04-27 23:26:47
【问题描述】:
我在 Oracle 文档中找到了这一段
如果你想选择每个人的名字 部门及其名称 经理,您可以将查询写入 两种方式之一。在第一个例子中 接下来是提示 /++ordered++/ 说按顺序加入 表出现在 FROM 子句中 尝试优化连接顺序。
SELECT /*+ordered*/ d.NAME, e.NAME FROM DEPT d, EMP e WHERE d.MGR = e.SS#或:
SELECT /*+ordered*/ d.NAME, e.NAME FROM EMP e, DEPT d WHERE d.MGR = e.SS#假设有 10 个部门 和 1000 名员工,以及内部 每个查询中的表都有一个索引 连接列。在第一个查询中, 第一个表产生 10 排位赛 行(在这种情况下,整个表)。 在第二个查询中,第一个表 产生 1000 个符合条件的行。这 第一个查询将访问 EMP 表 10 次并扫描 DEPT 表一次。 第二个查询将扫描 EMP 表一次,但将访问 DEPT 表 1000 次。因此第一个 查询将执行得更好。作为一个 经验法则,表格应该是 从最小有效排列 行数到最大有效 行数。有效行大小 查询中的表由以下方式获得 应用逻辑条件 完全在该表上解决。
但我没有正确理解这一点。如果表t1有m行,表t2有n行,sql引擎不会在这两种情况下都经过m x n行吗?
更新:感谢所有回复。我不会重写优化器,只是想确认一下我的想法。
【问题讨论】:
-
您能否发布一个指向您阅读此文件的文档的链接?
-
您在 Oracle 文档中的第二个查询中缺少
WHERE-clause。 -
@Peter - 添加 where 子句 :)