[dba-SQLServer] Scalar UDFs -- NOT!

Arthur Fuller fuller.artful at gmail.com
Tue Jun 24 05:12:48 CDT 2008


The problem, insofar as my investigations have identified it (serious
qualifer there), is that calling a UDF in a WHERE clause causes it to
execute for every potential row, emphasis on Potential, i.e. every actual
row investigated prior to the WHERE clause's cutting down the qualifying
rows. And I think (just guessing) this is where the performance penalty
kicks in. So let me revise my previous diatribe and say instead "don't use
scalar UDFs in a WHERE clause".

The UDFs in question did things such as return the PK corresponding to a
description, i.e. BankAccountType('Savings') might return 3, say. The
original consultant thought that these UDFs would be good because if
anything changed, it would only have to change in one place, and to that
extent he is certainly correct. But in practice it turns out that calling a
bunch of these (similar) functions costs us dearly. 23 seconds to zero
seconds is meaningful, especially given that the sproc in question is called
frequently.

New topic:
Suppose that a web app calls sproc A, passing parm 123, and its execution
takes 3 seconds.
Suppose that another user logs on and at approximately the same time
executes sproc A, passing parm 234.
Suppose that another user logs on and at approximately the same time
executes sproc A, passing parm 345.

What happens to the execution time? Does each additional user executing the
same sproc with different parms cause the time to multiply by the number of
users? Or perhaps it's better engineered than that and some optimization
occurs under the covers. I don't know enough about the belly of the beast to
even guess about this. Does somebody on this list?

TIA.
Arthur


On Mon, Jun 23, 2008 at 6:01 PM, Jim Lawrence <accessd at shaw.ca> wrote:

> Hi Arthur:
>
> Does the poor performance persist even when the UDF is called a numbers
> time? It should load into memory and optimize when called a number of
> times?
>
> Jim
>
> -----Original Message-----
> From: dba-sqlserver-bounces at databaseadvisors.com
> [mailto:dba-sqlserver-bounces at databaseadvisors.com] On Behalf Of Arthur
> Fuller
> Sent: Monday, June 23, 2008 12:36 PM
> To: Discussion concerning MS SQL Server
> Subject: [dba-SQLServer] Scalar UDFs -- NOT!
>
> When scalar UDFs first appeared, I was a big fan. No longer. In my current
> project, we had a bunch of them and in some sprocs they were called
> frequently. In one sproc various UDFs were called 57 times (they were
> emebedded in CASE WHEN blocks and such, mostly, but some were called from
> WHERE clauses. The first sproc I investigate was taking 28 seconds to
> execute. I copied it and replaced all the UDFs with hard-coded calls. The
> execution time went down to 3 seconds. I then tackled another
> time-consuming
> sproc (23 seconds) and did the same thing. The results were even more
> spectacular. Execution time as reported in Query Analyzer was zero seconds.
>
> I'm big enough to eat my own words. I've written various articles about how
> cool scalar UDFs are. I take it all back.
>
> Arthur
> _______________________________________________
> dba-SQLServer mailing list
> dba-SQLServer at databaseadvisors.com
> http://databaseadvisors.com/mailman/listinfo/dba-sqlserver
> http://www.databaseadvisors.com
>
> _______________________________________________
> dba-SQLServer mailing list
> dba-SQLServer at databaseadvisors.com
> http://databaseadvisors.com/mailman/listinfo/dba-sqlserver
> http://www.databaseadvisors.com
>
>



More information about the dba-SQLServer mailing list