question

Usha avatar image
Usha asked

Query performance

Hi

I have a stored procedure which queries in 5 secs.

Recently i have added a UDF in select

select col1,col2,col3,UDF_function(col1),col4 from table inner join table 1 ..........11 tables are joined here.

after adding udf_function() my query execution time is taking minimum 15 mins which is horrible. Kindly help me to how to improve the performance.

the function returns the values of a column as comma seperated string. it means i am looping through the records in the function.

The reason why i am using UDF is becos of the below table structure and requirement

Table1

p.k 	
col1    col2    col3
1       x       z
2       v       q
3       n       w
4       m       e

Table2

f.k 
1       a
1       b
1       c
2       a
2       d

Output

col1    col2
1       a,b,c
2       a,d
3
4

This is mainly to avoid duplicates

Thanks in advance Usha

performanceuser-defined-function
1 comment
10 |1200

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Can you provide us with some more details please (table strucutre, sample data)?
0 Likes 0 ·
Blackhawk-17 avatar image
Blackhawk-17 answered

You could try creating an indexed view based off the UDF for pre-aggregation. Go to BOL and search on Creating Indexed Views

Based on your new information I would say you could create an indexed view utilizing the UDF for every table.

The views would basically be

Create View vTabx 
With Schemabinding
As
Select col1, UDF(col2)
From Tabx

You would then have persisted data and could join this into your query.

Assuming the views created column one as the FK and column two as the comma separated list you could do something similar to the following:

Select Tab0.col1, vTab1UDF.col2, vTab2UDF.col2,...
From Tab0
Inner Join vTab1UDF On vTab1UDF.col1 = Tab0.col1
Inner Join vTab2UDF On vTab2UDF.col1 = Tab0.col1 ...
10 |1200

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Melvyn Harbour 1 avatar image
Melvyn Harbour 1 answered

I suspect your problem is that you're falling into Jeff Moden's RBAR (Row By Agonising Row). What you're attempting to do should be possible with an appropriate aggregate.

10 |1200

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Peso avatar image
Peso answered

You probably want to read this blog post http://sqlblog.com/blogs/adam_machanic/archive/2009/05/31/grouped-string-concatenation-the-winner-is.aspx

It is all about how to return grouped strings. There is an attached file which contains the winning scripts. Look at them to see what can be done with this matter.

//Peso

10 |1200

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Matt Whitfield avatar image
Matt Whitfield answered

Also, bear in mind that calling any sort of scalar UDF on a row-by-row basis can dramatically reduce performance.

10 |1200

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

dave ballantyne avatar image
dave ballantyne answered

Im not clear behind your reasons for doing this.

You say "This is mainly to avoid duplicates" surely, is that you want the distinct characters in the columns ?

Please provide a better example , as SQL script would be perfect

10 |1200

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Peso avatar image
Peso answered

Here is another link with exact matching samples
http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=81254

10 |1200

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Write an Answer

Hint: Notify or tag a user in this post by typing @username.

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.