L'écriture Efficace de Requêtes dans le SAS à l'Aide de Proc sql avec Teradata

EDIT: Voici un ensemble plus complet de code qui montre exactement ce qu'il se passe par la réponse ci-dessous.

libname output '/data/files/jeff'
%let DateStart = '01Jan2013'd;
%let DateEnd = '01Jun2013'd;
proc sql;
CREATE TABLE output.id AS (
  SELECT DISTINCT id
  FROM mydb.sale_volume AS sv
  WHERE sv.category IN ('a', 'b', 'c') AND
    sv.trans_date BETWEEN &DateStart AND &DateEnd
)
CREATE TABLE output.sums AS (
  SELECT id, SUM(sales)
  FROM mydb.sale_volue AS sv
  INNER JOIN output.id AS ids
    ON ids.id = sv.id
  WHERE sv.trans_date BETWEEN &DateStart AND &DateEnd
  GROUP BY id
)
run;

Le but est simplement d'interroger la table pour certaines id est basé sur la catégorie de membre. Alors j'en somme, ces activité des membres dans toutes les catégories.

L'approche ci-dessus est beaucoup plus lent que:

  1. L'exécution de la première requête pour obtenir le sous-ensemble
  2. De l'exécution d'un deuxième requête sommes tous les ID
  3. L'exécution d'une requête troisième intérieure entre les deux ensembles de résultats.

Si je comprends correctement, il peut être plus efficace pour s'assurer que l'ensemble de mon code est complètement passé à travers, plutôt que de la croix de chargement.


Après l'affichage d'une question d'hier, un membre a suggéré que je pourrais bénéficier de poser une question distincte sur le rendement qui est plus spécifique à ma situation.

Je suis à l'aide de SAS Enterprise Guide pour l'écriture de certains programmes/requêtes de données. Je n'ai pas les autorisations pour modifier les données sous-jacentes, qui est stocké dans 'Teradata'.

Mon problème de base qui est de l'écriture efficace des requêtes SQL dans cet environnement. Par exemple, j'ai une requête un tableau de grande taille (plusieurs dizaines de millions d'enregistrements) pour un petit sous-ensemble de l'ID. Ensuite, j'utilise ce sous-ensemble, à la requête de la plus grande table de nouveau:

proc sql;
CREATE TABLE subset AS (
  SELECT
    id
  FROM
    bigTable
  WHERE
    someValue = x AND
    date BETWEEN a AND b

)

Cela fonctionne dans une affaire de secondes et retourne 90k ID. Ensuite, je veux interroger ce jeu d'ID à l'encontre de la grande table, et les problèmes en découlent. Je suis désireux de la somme des valeurs au cours du temps pour les ID:

proc sql;
CREATE TABLE subset_data AS (
  SELECT
    bigTable.id,
    SUM(bigTable.value) AS total
  FROM
    bigTable
  INNER JOIN subset
    ON subset.id = bigTable.id
  WHERE
    bigTable.date BETWEEN a AND b
  GROUP BY
    bigTable.id
)

Pour quelque raison que ce soit, cela prend un temps très long. La différence est que la première requête drapeaux someValue'. La seconde s'intéresse à toutes les activités, quel que soit ce qui est dans 'someValue'. Par exemple, je pourrais drapeau de chaque client qui commande une pizza. Puis je regarde à chaque achat pour tous les clients qui ont commandé de la pizza.

Je ne suis pas trop familier avec SAS, donc je suis à la recherche pour obtenir des conseils sur la façon de le faire plus efficacement ou d'accélérer les choses. Je suis ouvert à toutes idées ou suggestions et s'il vous plaît laissez-moi savoir si je peux offrir plus de détails. Je suppose que je suis juste surpris de la deuxième requête prend tellement de temps à traiter.