0

大量のデータ (1,000,000,000 行など) を含むテーブルがあります。

テーブル構造:

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 時間程度かかる場合でも問題ありません。

4

1 に答える 1

0

WITH names AS ( name, COUNT(ID) OVER (PARTITION BY Name) AS CNT FROM T) select DISTINCT name from names where names.CNT > 10

于 2016-04-21T13:58:33.603 に答える