【发布时间】:2011-03-11 06:46:47
【问题描述】:
我有 FOO 和 BAR 表。 FOO 有一个 BAR PK 的外键。
当我执行以下查询时,它需要几秒钟。
select foo.name, foo.description, bar.quadrant from FOO, BAR
where FOO.BAR_ID = BAR.BAR_ID
这是我的解释计划:
OPERATION OBJECT_NAME OPTIONS COST
SELECT STATEMENT 39
HASH JOIN 39
TABLE ACCESS BAR FULL 2
TABLE ACCESS FOO FULL 36
FOO 中有 6000 条记录,而 BAR 只有 5 条。BAR_ID 列是 NUMBER。
这是在 Oracle 10g 上运行的,大约需要 3 秒才能完成。考虑到它执行其他查询的速度,这似乎很极端。
编辑表定义:
CREATE TABLE BAR
(
"BAR_ID" NUMBER NOT NULL,
"QUADRANT" VARCHAR2(100 BYTE) NOT NULL,
CONSTRAINT "BAR_PK" PRIMARY KEY ("BAR_ID")
)
CREATE TABLE FOO
( "FOO_ID" NUMBER NOT NULL,
"BAR_ID" NUMBER NOT NULL,
"NAME" VARCHAR2(250 BYTE) NOT NULL,
"DESCRIPTION" VARCHAR2(250 BYTE),
CONSTRAINT "FOO_PK" PRIMARY KEY ("FOO_ID"),
CONSTRAINT "FOO__FK1" FOREIGN KEY ("BAR_ID") REFERENCES BAR ("BAR_ID") ENABLE
);
【问题讨论】:
-
我只是想知道您是否在表中有 FK/PK 关系,那么为什么不使用“JOIN”而不是比较选择性列呢?
-
你能发布表格定义吗?
-
你有关于 FOO.BAR_ID 的索引吗?
-
@Mike 是的,但解释计划保持不变,除非我使用 /*+ INDEX ... */ 提示明确强制它。使用索引对查询速度没有任何明显影响。
-
Oracle 的优化器过去非常关心
from子句中的表顺序。我不确定它是否仍然存在 - 尝试反转它们只是为了查看 - 对于哈希连接,您希望较小的表成为驱动表,而不是较大的表。