All Abstractions Are Failed Abstractions (Linq vs Raw SQL)
codinghorror.com
codinghorror.com
1. What is the scope of the data context used for these queries? Caching that is keyed by id is done within the scope of the data context: http://blogs.msdn.com/dinesh.kulkarni/archive/2008/07/01/lin...
2. Is the code being run co-located with the database server? If so, this is atypical and these times do not include network overhead.
There are many more questions...
1) select top 48 Id from Posts
2) select * from Posts where Id in (<id's selected from previous query)
Unless the second query is 'abstracted' into 48 individual queries (which would make for an interesting abstraction-article in itself) your accusation is completely baseless.
I think Jeff's notation in the SQL queries were a bit confusing, but if you actually read the article his intention is clear and his point is valid. I'm baffled by the retaliation here on HN. Please rebut me and restore my faith in the HN community.
Doing a select is expensive relative to what? Assuming your select * where clause has only the index key in it, then select any column in the leaf of the index has the same cost as selecting all columns in the leaf. The expense is the disk read, if necessary.
Also, If you select the entire object then linq does a select * because it has to populate every value of the object. If you only need an id column, just select the id column.
Then he says: "Now, retrieving 48 individual records one by one is sort of silly, becase you could easily construct a single where Id in (1,2,3..,47,48) query that would grab all 48 posts in one go. But even if we did it in this naive way, the total execution time is still a very reasonable (48 * 3 ms) + 260 ms = 404 ms."
He says he could do an IN list, but he never does it. He assumes that selecting on one id is the worst case and then multiplying it by 48 gives him a total. The true time would depend on whether the index pages were in the cache of the database. It also depends on whether the query being run uses parameter versus literals because now compiling/optimizing time is there too.
Specifically, what point are you referring to that is valid?
His "naive way" is the 48 individual SELECTs, and he's claiming that that's faster than one SELECT (star).
His point about SQL vs. LINQ may or may not be valid --- I don't know since I don't use LINQ --- but his argument and measurements are certainly flawed.
The nice thing about software such as a database is that, if you spend enough time, it's not some magical black box. If you read some books and papers or go to school or read some source code then you can actually have an understanding of what goes on "under the hood" and you don't have to resort to voodoo measurements. So, if you know something about RDMBSs, you know that once a query retrieves some rows from disk they're cached, so any queries issued shortly after will be served from memory. This is probably what happened here, since 3ms is less than the disks' seek time, not counting networking and processing overhead...
If you're absolutely unwilling to learn something about how a software works and feel compelled to measure it, then at least create meaningful measurements, including averages, medians, deviations, plots...
As a final note, as a developer who's startup is writing a soon-to-be-released high-performance replicated key-value store, if their site is such that performance matters, then these are exactly the type of queries that could be offloaded to some key-value store or even memcached and recomputed asynchronously in the background every minute.
Yes he does: "even if we did it in this naive way, the total execution time is still a very reasonable".
He's getting 48 records back using two queries.
This is equally silly. The two queries would be equivalent to the single one if there weren't two round trips instead of one, more traffic (the ids are retrieved twice instead of once and they are also sent to the server) and the overhead from concatenating and then parsing all the ids in the second query.
I can't read things like this and avoid wondering why people keep reading him. He is so wrong so often I ... it's just beyond me.
Query execution time is just one part of performance. You still have to create the connection and transfer all the data across the wire. Sending N records in 1 big package is much more efficient than sending N+1 records in individual packages.
Run a performance measure on the actual code execution and I am almost positive you'll get worse performance than would be indicated by your query execution times alone.
From now on, I'm flagging every codinghorror post.
Now, of course, if you can do that you really should be thinking about memcached and/or a key/value store with possibly a distributed index rather than a relational db anyway.
I truly think that mixing code and requests is acceptable only for small projects. Not a single word about stored procedures, which are in a way an abstraction of your database logic.
More seriously; in some ways, I feel bad for the position Jeff Atwood is in. On the one hand, I don't think he really intends to speak with the authority implied by his prominence, but on the other hand, he has his prominence.
I agree, actually.
However, he never admits it. I suspect that although many of his posts might not start out as trolls, he is quite happy to engender a loud reaction without any real concern as to the accuracy or utility of what he writes.
On a side note, the author also neglects to mention that LINQ to SQL is a great way to make your code more portable to other platforms (Mono) or other databases (MySQL, PostgreSQL, etc.) so that you don't have to learn the intricacies of each databases' SQL syntax.
So, the performance improvements and code improvements that you speak of will never get done.
Are you saying that the Linq expression to SQL optimization will replace the SQL Server SQL plan optimization?
The gory details of producing a Linq query provider are covered in this series of blog posts: http://blogs.msdn.com/mattwar/pages/linq-links.aspx
Anyone experienced enough in web development will maybe get his point, but the newbies who read his blog will not and will fight more senior developers on this topic, all because "Jeff Atwood said it".
That's where the bashing is centered on.