x

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

more ▼

asked Nov 03, 2009 at 08:54 AM in Default

avatar image

Usha
110 7 9 12

Can you provide us with some more details please (table strucutre, sample data)?

Nov 03, 2009 at 09:23 AM John Sansom
(comments are locked)
10|1200 characters needed characters left

6 answers: sort voted first

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 ...
more ▼

answered Nov 03, 2009 at 10:45 AM

avatar image

Blackhawk-17
12k 30 35 42

(comments are locked)
10|1200 characters needed characters left

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

more ▼

answered Nov 03, 2009 at 09:38 AM

avatar image

Peso
1.6k 5 6 9

(comments are locked)
10|1200 characters needed characters left

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.

more ▼

answered Nov 03, 2009 at 08:58 AM

avatar image

Melvyn Harbour 1 ♦♦
1.4k 19 40 26

(comments are locked)
10|1200 characters needed characters left

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

more ▼

answered Nov 03, 2009 at 09:42 AM

avatar image

Matt Whitfield ♦♦
29.5k 62 66 88

(comments are locked)
10|1200 characters needed characters left

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

more ▼

answered Nov 08, 2009 at 04:06 AM

avatar image

Peso
1.6k 5 6 9

(comments are locked)
10|1200 characters needed characters left
Your answer
toggle preview:

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

SQL Server Central

Need long-form SQL discussion? SQLserverCentral.com is the place.

Topics:

x290
x29

asked: Nov 03, 2009 at 08:54 AM

Seen: 1515 times

Last Updated: Nov 04, 2009 at 08:12 AM

Copyright 2016 Redgate Software. Privacy Policy