1

假设我有以下查询:

select * from A, B, C, D
where A.x = B.x
and B.y = C.y
and A.z = D.z

我有关于 Ax 和 Bx 以及 By 和 Cy 和 Dz 的索引

Az 上没有索引

如何给这个查询一个提示,在 Ax 上使用 INDEX 提示,但在 Az 上使用 USE_HASH 提示?似乎提示只采用表名,而不是特定的连接,因此当使用具有多个连接的单个表时,我只能为所有连接指定一个策略。

或者,假设我在上述查询中使用了 LEADING 或 ORDERED 提示。这两个提示也只需要一个表名,那么我怎样才能确保 Ax = Bx 连接发生在 Az = Dz 之前呢?我意识到在这种情况下我可以首先列出 D,但想象 D 随后连接到 E,并且 DE 连接是我在整个查询中想要的最后一个连接。

第三种配置——假设我希望 Ax 连接成为整个查询的第一个,并且我希望 Az 连接成为最后一个。如何使用提示从 A 进行单个联接,然后是 BC 联接,最后是 AD 联接?

4

2 回答 2

3

首先,使用此类提示应该是最后的手段,而不是编写查询的正常方式。大多数时候,您应该确保优化器统计数据是最新的,并让 CBO 为自己制定最佳路径——这就是它的工作!

INDEX 提示可以指定要使用的索引的名称,如下所示:

SELECT /*+ INDEX (A, A_X_IDX) */ *
...

(假设 AX 上的索引称为 A_X_IDX)。

您不能告诉 Oracle 在同一语句中使用 AX 上的索引使用哈希联接到表 A,这是没有意义的。但是,您可以(如果必须)为每个表指定访问路径,例如:

SELECT /*+ INDEX (A, A_X_IDX) INDEX(B, B_Y_IDX) USE_HASH(C) */ *

但重申一下,很少需要这样做。甲骨文已经投入数百万美元和工时来开发 CBO,那么为什么要有效地关闭它呢?

于 2010-03-26T16:17:03.027 回答
0

在 SQL Server 上,您会像这样执行哈希联合提示

SELECT * FROM table1 t1
INNER hash join table2 t2 ON  t1.id = t2.id

您还可以提供索引提示

select * from table1 t1
inner  join table2 t2 with (index( bla))  on  t1.id = t2.id

不知道 Oracle 中的语法是什么样的,顺便说一句,你为什么使用旧式连接?你还在用8i吗?

于 2010-03-26T15:50:47.270 回答