2013-01-24 6 views
0

Hier, j'ai posé une question sur les CTE et les calculs du total cumulé;Optimisation des requêtes CTE

Calculating information by using values from previous line

je suis venu avec une solution, mais quand je suis allé à l'appliquer à ma base de données réelle (plus de 4,5 millions de disques), il semble prendre pour toujours. Cela a duré plus de 3 heures avant que je l'arrête. J'ai ensuite essayé de l'exécuter sur un sous-ensemble (CTEtest as (select top 100)) et ça a duré une heure et demie. Est-ce parce qu'il a encore besoin de parcourir toute l'affaire avant de choisir le top 100? Ou devrais-je supposer que si cette requête prend 2 heures pour 100 enregistrements, cela prendra des jours pour 4,5 millions? Comment puis-je optimiser cela?

Y at-il un moyen de voir combien de temps reste sur la requête?

+2

Jetez un oeil à cet article de @AaronBertrand sur l'exécution des totaux sur SQL Server: http://www.sqlperformance.com/2012/07/t-sql-queries/running-totals – Lamak

Répondre

0

Je pense que vous feriez mieux de faire la somme courante comme une sous-requête corrélée. Cela vous permettra de mieux gérer les index de la performance:

select memberid, 
     (select sum(balance - netamt) as runningsum 
     from txn_by_month t2 
     where t2.memberid = t.memberid and 
       t2.accountid <= t.accountid 
     ) as RunningSum 
from txn_by_month t 

Avec cette structure, un index sur txn_by_month(memberid, accountid, balance, netamt) devrait être en mesure de répondre à cette partie de la requête, sans retourner aux données d'origine.

+0

'accountid' semble être un 'varchar' – Magnus

+0

@Magnus. . . Les comparaisons sont toujours autorisées sur varchars. La logique est basée sur la question liée, qui a 'order by accountid' comme argument de commande' row_number() '. –

+0

Merci pour l'idée! J'ai supprimé la première CTE (partition rowno) et l'ai configurée comme sa propre requête dans une table temporaire. Ensuite, je l'ai référencé dans la deuxième CTE. Il n'a fallu que 4 minutes pour faire les 4,5 millions de lignes! – Swizanson