比Oracle Database Union更快的选项

时间:2012-10-10 20:10:00

标签: database performance oracle oracle10g union

我有一个包含多个存储文本值的列的表。例如:

ID    FATHER_NAME    MOTHER_NAME
--------------------------------
1     Henry          Sarah
2     Martin         Rebecca
3     Martin         Nancy

我希望得到表格中的所有名字。我知道我可以做一个工会来做到这一点:

(SELECT FATHER_NAME FROM MY_TABLE)
UNION
(SELECT MOTHER_NAME FROM MY_TABLE)

然而,在我的真实表中,我需要联合15列,查询显然需要一段时间(大约12秒)。我仍然需要加入这些名称等等。除了做工会还有其他选择吗?

仅供参考:我正在使用Oracle。

1 个答案:

答案 0 :(得分:5)

如果您使用的是Oracle 11g,则可以使用UNPIVOT功能:

select id, value, col
from yourtable
unpivot
(
  value for col in (FATHER_NAME, MOTHER_NAME) -- other columns will go here
) u;

请参阅SQL Fiddle With Demo

或者您可以使用UNION ALL代替UNION,区别在于您不会获得DISTINCT值:

select id, FATHER_NAME value, 'FATHER_NAME' col
from yourtable
union all
select id, MOTHER_NAME value, 'MOTHER_NAME' col
from yourtable

请参阅SQL Fiddle With Demo

由于UNION尝试获取DISTINCT值,{{1}}可能会变慢。