Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 391
  • Last Modified:

Performance on Sum / Group By in a sql expression

I have a Sum/Group By query - without the sum, it takes about 4 seconds to execute in query analyzer, with the sum it takes 23 seconds (and I assume will get far worse as the date range increases).

Can anyone help me figure out if there is a better way to construct this query to improve the performance of the "SUM"

Code

select T_3.[ACCOUNTNUMBER],T_3.[DESCRIPTION],Sum(T_1.AMOUNT)

From DBO.GL7TRANSACTIONS AS GL7TRANSACTIONS
LEFT OUTER JOIN DBO.GL7TRANSACTIONDISTRIBUTIONS AS T_1 ON GL7TRANSACTIONS.GL7TRANSACTIONSID = T_1.GL7TRANSACTIONSID
LEFT OUTER JOIN DBO.tf_GL7SECUREPROJECTS(1, 1, 0) AS T_2 ON T_1.GL7PROJECTSID = T_2.GL7PROJECTSID
LEFT OUTER JOIN DBO.tf_GL7SECUREACCOUNTS(1, 1, 0) AS T_3 ON GL7TRANSACTIONS.GL7ACCOUNTSID = T_3.GL7ACCOUNTSID
LEFT OUTER JOIN DBO.GL7ACCOUNTCODES AS T_4 ON T_3.GL7ACCOUNTCODESID = T_4.GL7ACCOUNTCODESID
INNER JOIN DBO.GL7BATCHES AS T_5 ON GL7TRANSACTIONS.GL7BATCHESID = T_5.GL7BATCHESID

Where ((GL7TRANSACTIONS.[POSTDATE] BETWEEN '2010-06-01' AND '2010-07-31 23:59:59.997'
      AND T_2.[UNMASKEDPROJECTID]  =  'NYihrc'
      AND (T_4.ACCOUNTCODE) like '6%')
      AND GL7TRANSACTIONS.[GL7GENERALINFOID]  =  1
      AND T_5.[STATUS] NOT IN (8,9))

group by T_3.[Accountnumber],T_3.[Description]
0
akessel
Asked:
akessel
  • 3
  • 2
  • 2
2 Solutions
 
Raja Jegan RSQL Server DBA & ArchitectCommented:
Your query can't be tuned further..
Probably you can try rewriting those two table valued functions into a single one for better performance.
And the proper construct would be
select T_3.[ACCOUNTNUMBER],T_3.[DESCRIPTION],Sum(T_1.AMOUNT)
From DBO.GL7TRANSACTIONS AS GL7TRANSACTIONS
INNER JOIN DBO.GL7BATCHES AS T_5 ON GL7TRANSACTIONS.GL7BATCHESID = T_5.GL7BATCHESID
LEFT OUTER JOIN DBO.GL7TRANSACTIONDISTRIBUTIONS AS T_1 ON GL7TRANSACTIONS.GL7TRANSACTIONSID = T_1.GL7TRANSACTIONSID
LEFT OUTER JOIN DBO.tf_GL7SECUREPROJECTS(1, 1, 0) AS T_2 ON T_1.GL7PROJECTSID = T_2.GL7PROJECTSID
LEFT OUTER JOIN DBO.tf_GL7SECUREACCOUNTS(1, 1, 0) AS T_3 ON GL7TRANSACTIONS.GL7ACCOUNTSID = T_3.GL7ACCOUNTSID
LEFT OUTER JOIN DBO.GL7ACCOUNTCODES AS T_4 ON T_3.GL7ACCOUNTCODESID = T_4.GL7ACCOUNTCODESID
Where ((GL7TRANSACTIONS.[POSTDATE] BETWEEN '2010-06-01' AND '2010-07-31 23:59:59.997'
      AND T_2.[UNMASKEDPROJECTID]  =  'NYihrc'
      AND (T_4.ACCOUNTCODE) like '6%')
      AND GL7TRANSACTIONS.[GL7GENERALINFOID]  =  1
      AND T_5.[STATUS] NOT IN (8,9))
group by T_3.[Accountnumber],T_3.[Description]

Open in new window

0
 
ralmadaCommented:
Why you need to join to those functions? can you just join to the tables directly? that will certainly improve your performance. That will also make you be able to take advantage of indexes that you need to create for the columns you have in your joins and the where and group by clauses.
0
 
akesselAuthor Commented:
I am using as a base, sql that is generated from a tool the vendor supplies in their built in querying tool - in their client sofware.  But ....  I did extricate the query from this join:

LEFT OUTER JOIN DBO.tf_GL7SECUREPROJECTS(1, 1, 0) AS T_2 ON T_1.GL7PROJECTSID = T_2.GL7PROJECTSID

by using the GL7PROJECTTSID directly in the where clasue, and that seems to have made a huge difference.

Frankly I'm not to sure what's going on in the tf.dbo tables but its a complex database, with someone limited visibility into what is going on.  I'm just playing it safe and doing it the way they do it in their query tools.

I will take a look at DBO.tf_GL7SECUREACCOUNTS(1, 1, 0) and see if there is a straight table that gives me the same info - I only need the account number and description and the middle segment of the account description to execute the query and get the results I need, you would think I wouldn't need a derived table, but ...
0
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
Raja Jegan RSQL Server DBA & ArchitectCommented:
akessel,

Have you tried using the table directly and are you able to see some good performance on that..
0
 
akesselAuthor Commented:
Both commens suggesting using the table directly were on the right track, when I took that approach, which I was able to do easily, it cut execution speed 60%.

What the heck is a table valued function, anyway?
0
 
ralmadaCommented:
>>What the heck is a table valued function, anyway?<<
a Table-valued function, is just a function that returns a table as a result. Think of it as a view with steroids (because you can do more things in a function than in a view). More info here.
http://msdn.microsoft.com/en-us/library/ms191165.aspx 
0
 
akesselAuthor Commented:
Ah ... I see them out there .. these in particular were designed to hide availability of some data from some users who do input, not necessary for the purpose I am using them for since it is read-only.
0

Featured Post

Keep up with what's happening at Experts Exchange!

Sign up to receive Decoded, a new monthly digest with product updates, feature release info, continuing education opportunities, and more.

  • 3
  • 2
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now