大量のデータ (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 時間程度かかる場合でも問題ありません。