2016-04-21 39 views
0

我有一个包含大量数据(称为1,000,000,000行)的表。如何在Oracle中非常大的表上使用聚合函数查询优化内存使用情况

表结构:

Id(Primary Key) 
Name 
... 

我已经从表中省略了其它领域我不能使用任何这些的限制我获取数据。

这里的主键是Id。我没有任何索引,只有名称列。

我需要找到n次以上的名字列表(说n = 10)。

我曾尝试以下选项:

SELECT /+full(T)/ Name,COUNT(Id) AS CNT FROM T GROUP BY Name HAVING COUNT(ID) >10; 

select distinct Name, COUNT(ID) OVER (PARTITION BY Name) AS CNT FROM T where CNT>10; 

他们两人正在大的临时空间。

任何其他建议可优化查询以使用较少的临时空间。 速度不是我最关心的问题。即使查询大约需要2个小时也没关系。

回答

0
WITH AS( 选择名称,COUNT(ID)OVER(PARTITION BY名称)AS CNT FROM T)名称

选择从名称DISTINCT名称,其中names.CNT> 10

+0

这是类似于第二查询我已发布。它不会减少所需的临时空间量。 –

+0

WHERE子句在分析函数之前执行。所以问题中的第二个查询将不起作用。因此我已将它添加到WITH子句中。如果这也慢,你可以试试吗? WITH name AS(select name,COUNT(ID)OVER(PARTITION BY Name)AS CNT FROM T ORDER BY 2 DESC)从names.CNT> 10的名称中选择名称 – ArtBajji

相关问题