2016-04-21 47 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

相關問題