views:

2962

answers:

9

Related

LINQ-to-SQL vs stored procedures?

I have heard a lot of talk back and forth about the advantages of stored procedures being pre compiled. But what are the actual performance difference between LINQ and Stored procedures on Selects, Inserts, Updates, Deletes? Has anyone run any tests at all to see if there is any major difference. I'm also curious if a greater number of transactions makes a difference.

My guess is that LINQ statements get cached after the first transaction and performance is probably going to be nearly identical. Thoughts?

A: 

See LINQ-to-SQL vs stored procedures for help - I think that post has most of the info. you need.

Galwegian
+1  A: 

LINQ2SQL queries will not perform any differently from any other ad-hoc parameterized SQL query, other than the possibility that the generator may not optimize the query in the best fashion.

Adam Robinson
+2  A: 

LINQ queries can (and should be) precompiled as well. I don't have any benchmarks to share with you, but I think everyone should read this article for reference on how to do it. I'd be especially interested to see some comparison of precompiled LINQ queries to SPROCS.

JoshJordan
I think you are confusing two issues. Precompiling the LINQ query simply means that the SQL statement is pregenerated instead of generated on the fly. There isn't any DB server optimization done until the command is actually executed. With SPROCS the server is able to pre-optimize based on usage.
tvanfosson
Nope, just a hint. :) Note the words "as well"
JoshJordan
+2  A: 

There is not much difference except that LINQ can degrade when you have lot of data and you need some database tuning.

CodeToGlory
+5  A: 

LINQ should be close in performance but I disagree with the statement above that says LINQ is faster, it can't be faster, it could possibly be just as as fast though, all other things being equal.

I think the difference is that a good SQL developer, who knows how to optimize, and uses stored procedures is always going to have a slight edge in performance. If you are not strong on SQL, let Linq figure it out for you, and your performance is most likely going to be acceptable. If you are a strong SQL developer, use stored procedures to squeeze out a bit of extra performance if you app requires it.

It certainly is possible if you write terrible SQL to code up some stored procedures that execute slower than Linq would, but if you know what you are doing, stored procedures and a Datareader can't be beat.

EJB
I honestly do not know how this is possible but I ran my own adhoc tests and they are showing LINQ is faster than sprocs. 2 different data contexts run each, and I am doing inserts. Will post results when I have them.
Al Katawazi
All of the "auto-magical" sql tools that I've ever seen generate workable queries that are better than the worst human written queries, but worse than the best written ones.
KM
Are you comparing a linq query versus an SP executed by Linq? that may be different, but an SP executed by a datareader should be faster than a linq query, or a linq executed SP. It may be undetectably faster, but I can't understand how it could possibly be slower.
EJB
Yes I am using LINQ to run both. Now maybe I am wrong for doing so but my understanding was all the pooling and caching of requests was done automaticlaly for you via linq. I wanted to eliminate that as a confounding factor.
Al Katawazi
Don't optimize prematurely: it's easier to optimize correct code than to correct optimized code.
FreshCode
A: 

Unless you are trying to get every millisecond out of your application, whether to use a stored procedure or LINQ may need to be determined by what you expect developers to know and maintainability.

Stored procedures will be fast, but when you are actively developing an application you may find that the easy of using LINQ may be a positive, as you can change your query and your anonymous type that is created from LINQ very quickly.

Once you are done writing the application and you know what you need, and start to look at optimizing it, then you can look at other technologies and if you have good unit testing then you should be able to compare different techniques and determine which solution is best.

You may find this comparison of various ways for .NET 3.5 to interact with the database useful. http://toomanylayers.blogspot.com/2009/01/entity-framework-and-linq-to-sql.html

James Black
+1  A: 

The common perception is that ad-hoc sql queries perform better than Stored Procedures. However, this is false:

SQL Server 2000 and SQL Server version 7.0 incorporate a number of changes to statement processing that extend many of the performance benefits of stored procedures to all SQL statements. SQL Server 2000 and SQL Server 7.0 do not save a partially compiled plan for stored procedures when they are created. A stored procedure is compiled at execution time, like any other Transact-SQL statement. SQL Server 2000 and SQL Server 7.0 retain execution plans for all SQL statements in the procedure cache, not just stored procedure execution plans.

-- SqlServer's Books Online

Given the above and the fact that LINQ generates ad-hoc queries, my conclusion is that there is no performance difference between Stored Procedures & LINQ. And I am also apt to believe that SQL Server wouldn't move backwards in terms of query performance.

Gavin Miller
Why do you say it is a common perception?
FreshCode
A: 

Consider a database table with a million entries, joined to another table with a million entries... do you honestly think that doing this on the webserver (be it in LINQ or ad-hoc SQL) is going to be faster or more efficient than letting SQL Server do it on the database?

For simple queries, then LINQ is obviously better as it will be pre-compiled, giving you the advantage of having type checking , etc. However, for any intensive database operations, report building, bulk data analysis that need doing, stored procedures will win hands down.

devhead
LINQ to SQL and adhoc SQL are still both done on the SQL server.
Matthew Whited
A: 

I don't think I would like having my database layer in compiled code. It should be a separate layer not combined. As I develop and make use of Agile I am constantly changing the database design, and the process goes very fast. Adding columns, removing columns or creating a new tables in SQL Server is as easy as typing into Excel. Normalizing a table or de-normalizing is also pretty fast at the database level. Now with Linq I would also have to change the object representation every time I make a change to the database or live with it not truly reflecting how the data is stored. That is a lot of extra work.

I have heard that Linq entities can shelter your application from database change but that doesn't make sense. The database design and application design need to go hand in hand. If I normalize several tables or do some other redesign of the database I wouldn't want a Linq object model to no longer reflect the actual database design.

And what about advantage of tweaking a View or Stored Procedure. You can do that directly at the database level without having to re-compile code and release it to production. If I have a View which shows data from several tables and I decide to change the database design all I have to do is change that View. All my code remains the same.

David
What is the different between redeploying an assembly with the new database updates as deploying stored procs? You can also replace tables with updatable views if you want to replace database tables without updating LINQ or other data access technologies.
Matthew Whited