假设我有以下查询:

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

我有A.x和B.x和B.y和C.y和D.z索引

有上A.z没有索引。

我怎样才能给一个提示这个查询使用上A.x索引提示,但在A.z一个USE_HASH暗示?这似乎是暗示只需要表名,而不是具体的加盟,让使用具有多个单表连接我只能指定为所有这些单策略时。

替代,假设我使用上述查询的领先的或有序的暗示。这两种提示的只需要一表名一样,所以我怎么能保证A.x = B.x加入发生在A.z = D.z一个过吗?我知道在这种情况下,我可以列出d第一,但想象d随后加入到E和该d-E连接是最后一个我想在整个查询。

一个第三构型 - 假设我希望A.x加入成为第整个查询,我希望A.z加入是最后一个。如何使用一个提示有一个单一的从A加入到发生,其次是B-C加入,和A-d加入最后?

有帮助吗?

解决方案

首先,使用这样的提示应该是最后的手段,而不是编写查询的正常方式。大多数时候,你应该确保优化器统计数据是最新的,让CBO制定出自己的最佳路径 - 这是其工作

索引提示可以指定要使用这样的索引的名称:

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

(假定上A.X的索引称为A_X_IDX)。

您不能告诉甲骨文使用用途上A.X 索引和使用哈希联接表A在同一份声明中,这是没有意义的。但是,您可以(如果必须)指定为每个表类似的访问路径:

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

但重申一下,它应该是罕见以需要这样做。甲骨文已经投入了数百万美元和工时到发展CBO,那么为什么有效地关掉它?

其他提示

在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

不知道语法看起来像甲骨文,BTW为什么你使用的是什么旧式加入?你还在8I?

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