• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 152
  • Last Modified:

Strange SQL view, where clause, COALESCE perfomance issue

I have a weird sql issue.
I don't have control over these SQL statements.  They are created and executed (behind the scenes) by an application (Sage CRM).
So please don't ask me to change the SQL statement because I can't and the product manufacturer (Sage CRM) says the issue is with my sql server...

The only reason I know what the sql statement looks like is because it times out and an error gets written to a log file.

This SQL statement takes 4 minutes to return 792 records -

SELECT * FROM z_vmailinglistreport WHERE
(( COALESCE(comp_type, '') = N'rescontractor' ) )
AND ((pers_secterr = -2034921070))
AND coalesce(pers_cstatus,'') = 'Active'

If I use the SELECT statement from the view and add the WHERE clause it runs in 1 second.

If I remove either one of COALESCE functions it runs in 1 second.

Any ideas?

Thanks,

Kevin.
0
kevinvw1
Asked:
kevinvw1
  • 2
  • 2
  • 2
  • +1
1 Solution
 
Scott PletcherSenior DBACommented:
The COALESCE (or any other function) used on a column will prevent SQL from doing an index seek for that column.  Thus, even if the tables are perfectly indexed for the query, SQL won't be able to take advantage of it.

The only way to get the best performance out of such queries is remove the unnecessary COALESCE (NULL will never be =, <>, < or > any value anyway, so converting null to '' isn't needed):

WHERE
 ( comp_type = N'rescontractor'  )
 AND ((pers_secterr = -2034921070))
 AND pers_cstatus = 'Active'
0
 
kevinvw1Author Commented:
Thanks for the info.  

Any idea why the query runs almost instantly when I take the select statement from the underlying view and add the where clause to it (with the COALESCE) ?

Or if I add the where clause to the view it runs instantly as well.

Thanks, Kevin.
0
 
Scott PletcherSenior DBACommented:
No, unless there are other WHERE conditions or JOINs in the view itself.
0
Learn to develop an Android App

Want to increase your earning potential in 2018? Pad your resume with app building experience. Learn how with this hands-on course.

 
chaauCommented:
You need to create a function based index. But there is a catch, SQL Server does not support it natively like it is in Oracle or Postgresql. There is a workaround. Create two computed column. Here is an example for one, comp_type:
ALTER TABLE z_vmailinglistreport ADD COMPUTED_comp_type AS COALESCE(comp_type, '');
-- And then create an index on the computed column:
CREATE INDEX ix_z_vmailinglistreport_COMPUTED_comp_type ON [z_vmailinglistreport](COMPUTED_comp_type);

Open in new window

BTW, tell the software vendors to stop using non-sargable queries and stop blaming you
0
 
Lee SavidgeCommented:
Which version and patch level of Sage CRM is this?
0
 
kevinvw1Author Commented:
Hi Lee, it is 7.2e

Just to clarify, the issue happens even when just running the query in SQL Server Management Studio.
So unless Sage changes the way they use the COALESCE feature I may be stuck.

I actually changed the view around to pre-filter the on pers_cstatus = "Active".
This took that criteria out of the report and resolved the issue for now.

But I'm still curious about why the view and where clause behave the way they are behaving.

Thanks,

Kevin.
0
 
Lee SavidgeCommented:
Believe me I know all about Sage using the coalesce function. It's caused me no end of problems in other areas of CRM. I'm guessing this is a report and the fields that CRM is having issues with are the search criteria fields in the report builder.

Are you allowing the users to choose their own values for the search criteria or are they fixed?
0

Featured Post

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.

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