Oracle DISTINCT 忽略主键索引导致性能问题
Oracle DISTINCT Ignoring Primary Key Index Causing Performance Issue
当我在下面的查询中包含 distinct 时,在 GROUP_WIDGET table 上进行了完整的 table 扫描并且我下面的查询非常慢。当我删除 distinct 时,它很快。知道为什么使用 distinct 时性能会受到影响吗?
Tables:
COMPONENT
ID (primary key)
GROUP
ID (primary key)
WIDGET
ID (primary key)
COMPONENT_ID (foreign key to COMPONENT TABLE)
GROUP_WIDGET (join table between GROUP AND WIDGET)
ID (primary key)
GROUP_ID (foreign key to GROUP table)
WIDGET_ID (foreign key to WIDGET table)
***all foreign keys are indexed
非常慢(30 秒):
SELECT DISTINCT GROUP_WIDGET.ID FROM GROUP_WIDGET GW, WIDGET W WHERE W.COMPONENT_ID=12345 AND W.ID=GW.WIDGET_ID
非常快(1 秒):
SELECT GROUP_WIDGET.ID FROM GROUP_WIDGET GW, WIDGET W WHERE W.COMPONENT_ID=12345 AND W.ID=GW.WIDGET_ID
而不是这个:
SELECT GW.ID
FROM GROUP_WIDGET GW, WIDGET W
WHERE W.COMPONENT_ID=12345 AND W.ID=GW.WIDGET_ID
我想你可以尝试使用 WHERE EXISTS
:
SELECT gw.id
FROM group_widget gw
WHERE EXISTS ( SELECT 1 FROM widget w
WHERE w.id = gw.widget_id
AND w.component_id = 12345 )
这样你就完全不用DISTINCT
了。
当我在下面的查询中包含 distinct 时,在 GROUP_WIDGET table 上进行了完整的 table 扫描并且我下面的查询非常慢。当我删除 distinct 时,它很快。知道为什么使用 distinct 时性能会受到影响吗?
Tables:
COMPONENT
ID (primary key)
GROUP
ID (primary key)
WIDGET
ID (primary key)
COMPONENT_ID (foreign key to COMPONENT TABLE)
GROUP_WIDGET (join table between GROUP AND WIDGET)
ID (primary key)
GROUP_ID (foreign key to GROUP table)
WIDGET_ID (foreign key to WIDGET table)
***all foreign keys are indexed
非常慢(30 秒):
SELECT DISTINCT GROUP_WIDGET.ID FROM GROUP_WIDGET GW, WIDGET W WHERE W.COMPONENT_ID=12345 AND W.ID=GW.WIDGET_ID
非常快(1 秒):
SELECT GROUP_WIDGET.ID FROM GROUP_WIDGET GW, WIDGET W WHERE W.COMPONENT_ID=12345 AND W.ID=GW.WIDGET_ID
而不是这个:
SELECT GW.ID
FROM GROUP_WIDGET GW, WIDGET W
WHERE W.COMPONENT_ID=12345 AND W.ID=GW.WIDGET_ID
我想你可以尝试使用 WHERE EXISTS
:
SELECT gw.id
FROM group_widget gw
WHERE EXISTS ( SELECT 1 FROM widget w
WHERE w.id = gw.widget_id
AND w.component_id = 12345 )
这样你就完全不用DISTINCT
了。