2016-04-21 2 views
0

J'ai une table avec une grande quantité de données (Dites 1 000 000 000 lignes).Méthodes permettant d'optimiser l'utilisation de la mémoire pour une requête avec des fonctions d'agrégation sur des tables très volumineuses dans Oracle

Tableau Structure:

Id(Primary Key) 
Name 
... 

J'ai omis d'autres champs de la table que je ne peux pas utiliser l'une des mesures visant à limiter les données que je vais chercher.

Ici la clé primaire est Id. Je n'ai aucun index sur, seulement la colonne de nom.

J'ai besoin de trouver une liste de noms qui se produisent plus de n nombre de fois (Dites n = 10).

J'ai essayé les options ci-dessous:

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; 

Les deux prennent grand espace temp. Toutes les autres suggestions pour optimiser la requête pour utiliser moins d'espace temporaire.

La vitesse n'est pas la principale préoccupation ici pour moi. C'est bien, même si la requête prend environ 2 heures.

Répondre

0

avec des noms AS ( sélectionnez Nom, COUNT (ID) OVER (PARTITION PAR Nom) AS CNT DE T) sélectionnez le nom des noms où DISTINCT names.CNT> 10

+0

Ceci est similaire à la deuxième requête I ont posté. Cela ne réduit pas la quantité d'espace temporaire requise. –

+0

La clause WHERE s'exécute avant les fonctions analytiques. Donc, la deuxième requête de la question ne fonctionnera pas. Je l'ai donc ajouté dans une clause WITH. Si c'est aussi plus lent, pouvez-vous essayer cela? WITH noms AS (sélectionnez Nom, COUNT (ID) OVER (PARTITION PAR nom) AS CNT FROM T ORDER PAR 2 DESC) sélectionnez nom parmi les noms où noms.CNT> 10 – ArtBajji