如何选择不同的提示为不同的查询提示连接单个表?
-
22-09-2019 - |
题
假设我有以下查询:
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?
不隶属于 StackOverflow