views:

1556

answers:

14

One of my co-workers claims that even though the execution path is cached, there is no way parameterized SQL generated from an ORM is as quick as a stored procedure. Any help with this stubborn developer?

Edit: I won't pick an answer but instead vote up all the great replies

+10  A: 

I would start by reading this article:

http://decipherinfosys.wordpress.com/2007/03/27/using-stored-procedures-vs-dynamic-sql-generated-by-orm/

Here is a speed test between the two:

http://www.blackwasp.co.uk/SpeedTestSqlSproc.aspx

Espo
Nice find, im going to use that one :)
pete blair
Glad i could help
Espo
+4  A: 

For most people, the best way to convince them is to "show them the proof." In this case, I would create a couple basic test cases to retrieve the same set of data, and then time how long it takes using stored procedures versus NHibernate. Once you have the results, hand it over to them and most skeptical people should yield to the evidence.

Rob
+7  A: 

Round 1 - You can start a profiler trace and compare the execution times.

Gulzar
+1  A: 

Measure it, but in a non-micro-benchmark, i.e. something that represents real operations in your system. Even if there would be a tiny performance benefit for a stored procedure it will be insignificant against the other costs your code is incurring: actually retrieving data, converting it, displaying it, etc. Not to mention that using stored procedures amounts to spreading your logic out over your app and your database with no significant version control, unit tests or refactoring support in the latter.

Boris Terzic
I have my entire DB under source control effectivley using VSTS DB Edition. I think in the past I might have aggreed but the tools are catching up.
JoshBerke
+1  A: 

Benchmark it yourself. Write a testbed class that executes a sampled stored procedure a few hundred times, and run the NHibernate code the same amount of times. Compare the average and median execution time of each method.

matt b
+1  A: 

It is just as fast if the query is the same each time. Sql Server 2005 caches query plans at the level of each statement in a batch, regardless of where the SQL comes from.

The long-term difference might be that stored procedures are many, many times easier for a DBA to manage and tune, whereas hundreds of different queries that have to be gleaned from profiler traces are a nightmare.

Eric Z Beard
+1  A: 

I've had this argument many times over.
Almost always I end up grabbing a really good dba, and running a proc and a piece of code with the profiler running, and get the dba to show that the results are so close its negligible.

DevelopingChris
True, unless you have a lot of logic built in. For example, if you have a loop that pulls a range of invoices, then for each invoice it updates the invoice lines based on some criteria, it will almost definitely be faster as a proc ... simply because it doesn't need to push the SELECTed data across the wire.
Jess
updates in a loop, with nhibernate, are faster because it doesn't send them on the wire 1 at a time. where as a loop in a proc is highly inefficient.
DevelopingChris
A: 

Measure it.

Really, any discussion on this topic is probably futile until you've measured it.

Johannes Passing
A: 

He may be correct for the specific use case he is thinking of. A stored procedure will probably execute faster for some complex set of SQL, that can be arbitrarily tuned. However, something you get from things like hibernate is caching. This may prove much faster for the lifetime of your actual application.

l0st3d
+2  A: 

The problem here is that you've accepted the burden of proof. You're unlikely to change someone's mind like that. Like it or not, people--even programmers-- are just too emotional to be easily swayed by logic. You need to put the burden of proof back on him- get him to convince you otherwise- and that will force him to do the research and discover the answer for himself.

A better argument to use stored procedures is security. If you use only stored procedures, with no dynamic sql, you can disable SELECT, INSERT, UPDATE, DELETE, ALTER, and CREATE permissions for the application database user. This will protect you against most 2nd order SQL Injection, whereas parameterized queries are only effective against first order injection.

Joel Coehoorn
I like your tactic. You're right - convincing people while accepting the burden of proof yourself will get you no where.
David Robbins
+4  A: 

I would only add a couple things to Rob's answer:

First, Make sure the amount of data involved in the test cases is similiar to production values. In other words if your queries are normally against tables with hundreds of thousands or rows, then create such a test environment.

Second, make everything else equal except for the use of an nHibernate generated query and a s'proc call. Hopefully you can execute the test by simply swapping out a provider.

Finally, realize that there is usually a lot more at stake than just stored procedures vs. ORM. With that in mind the test should look at all of the factors: execution time, memory consumption, scalability, debugging ability, etc.

Chris Lively
A: 

The additional layer of abstraction will cause it to be slower than a pure call to a sproc. Just by the fact that you have additional allocations on the managed heap, and additional pushes and pops off the callstack, the truth of the matter is that it is more efficient to call a sproc over having an ORM build the query, regardless how good the ORM is.

How slow, if its even measurable, is debatable. This is also helped by the fact that most ORM's have a caching mechanism to avoid doing the query at all.

FlySwat
A: 

Even if the stored procedure is 10% faster (it probably isn't), you may want to ask yourself how much it really matters. What really matters in the end, is how easy it is to write and maintain code for your system. If you are coding a web app, and your pages all return in 0.25 seconds, then the extra time saved by using stored procedures is negligible. However, there can be many added advantages of using an ORM like NHibernate, which would be extremely hard to duplicate using only stored procedures.

Kibbee