2017-07-16 1 views
0

J'essaie d'optimiser une procédure stockée pour améliorer les performances globales. Actuellement, la conception a plusieurs tables temporaires avec la dernière colonne conçue pour effectuer des fonctions d'agrégat (telles que SUM) sur les champs dont elle tire des données.Optimisation de la procédure stockée qui utilise plusieurs tables temporaires pour joindre et générer des données

Par exemple:

CREATE TABLE #TBL_Refunds (CurrencyID int, DateValue DATETIME, Refunds decimal(18,2)) 

CREATE TABLE #TBL_Fees (CurrencyID int, DateValue DATETIME, Fees decimal(18,2)) 

CREATE TABLE #TBL_Deposits (CurrencyID int, DateValue DATETIME, Deposits decimal(18,2)) 

CREATE TABLE #TBL_Cancellations (CurrencyID int, DateValue DATETIME, Cancellations decimal(18,2))   

Un exemple de l'une des fonctions d'agrégat effectué sur le dernier champ de l'une des tables temporaires ressemble à ce qui suit:

INSERT #TBL_Cancellations(currencyID, DateValue, Cancellations) 
    SELECT C.CurrencyID, C.Date, SUM(T.Amount) - SUM(T.Debit) 
    FROM Currency C 
    JOIN Transaction T ON C.CurrencyId = T.CurrencyId 
    -- More conditions here . . . 
    GROUP BY C.CurrencyId, C.Date 

Les sorties de sélection finale de la agréger le champ de chaque table temporaire et utilise un LEFT JOIN pour faire correspondre chacun d'entre eux.

Par exemple.

SELECT DISTINCT 
    C.CurrencyCode 'Currency Code', 
    C.ConversionRate 'Conversion Rate', 
    R.Refunds, 
    F.Fees 'Fees', 
    D.Deposits 'Desposits' 
    -- More here . . . 
FROM 
    #TBL_Refunds (CurrencyID int, DateValue DATETIME, Refunds decimal(18,2)) R 
LEFT JOIN 
    Currency C ON R.CurrencyID = C.CurrencyID 
LEFT JOIN 
    #TBL_Fees F ON F.CurrencyID = C.CurrencyID 
LEFT JOIN 
    #TBL_Deposits D ON D.CurrencyID = C.CurrencyID 
-- More JOINS here. . . 

Y a-t-il une meilleure conception pour résoudre ce problème sans l'utilisation de tables temporaires? Y a-t-il une approche plus moderne pour résoudre ce problème?

Je suis relativement nouveau dans l'écriture de procédures stockées et SQL, donc toute aide serait géniale.

Merci!

+0

'Y a-t-il une meilleure conception pour résoudre ce problème' - quel problème? Vos morceaux de SQL ne décrivent aucun des problèmes de performance possibles. La clé de l'optimisation est l'analyse des goulots d'étranglement. En avez-vous détecté? –

Répondre

0

Eh bien, je vous suggère d'utiliser des index sur vos tables temporaires aussi parce qu'il semble qu'à la fin vous utilisez uniquement select query pour trouver les enregistrements distincts. et assurez-vous qu'à la fin vous devriez soit laisser tomber votre table temporaire, soit vous indexer car la prochaine fois ils prendront plus de temps pour reconstruire leurs index.

Je préfère également ne pas utiliser l'instruction create pour vos tables temporaires, utilisez insert dans statement.

assurez-vous que vous avez les index appropriés sur vous les colonnes où vous effectuez ces fonctions d'agrégation

0

Ce qui ne fonctionne pas bien. Tout de suite je voudrais:

  1. Modèle vous agrégats sous forme de colonnes calculées
  2. utilisation avec TABLOCKX sur les inserts
  3. SELECT 'DISTINCT' - pourquoi?
  4. Tous les JOINTS EXTÉRIEURS GAUCHE - est-ce nécessaire?
  5. Aucun index sur n'importe quel CurrencyID dans vos tables, et d'ailleurs
  6. Pourquoi n'est-ce pas simplement combiné à une table, ou où sont les clés naturelles dans les tables? S'agit-il vraiment de relations 1: 1?
+0

lmao foule grossière –