• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 394
  • 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
Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
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
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

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