NH Prof: How to detect SELECT N + 1
One of the things that the NHibernate Profiler is going to do is to inspect your NHibernate usage and suggest improvements to them.
Since I consider this to be a pretty important capability, I wanted to stream line the process as much as possible.
Here is how I detect this now:
It is not perfect, but it is pretty close.
Comments
Can you post a good link to the SELECT N + 1 "problem"(?)
ayende.com/.../...SelectN1ProblemInNHibernate.aspx
It's nice! Can you explain why you picked 4 as the threshold? Was it just arbitrary or based on some experience that if you have less than 4 it's not a problem?
Cheers
Is the .RawSql '==' operator overridden? If the raw sql is just a string, it would be a lot more useful to compare the actual pieces of the string (and their order) instead of seeing if the two strings are identical.
IE: select * from
should be the same as
select * from something
I had to pick a threshold, and 3 identical queries in the session seemed to be a good max to use.
I don't want to have to false positives.
Bryan,
I don't need to worry about this, since NH produce predictable SQL for all scenarios
Why not add these features to the NHibernate add-in for Resharper? I downloaded it recently and am added it. These could be warnings or something like that.
Scott,
I intend on making this a commercial project. As such, I don't want to limit myself to people having R#.
It is also a very different mindset than what R# is doing. The information is gathered at runtime, from the execution of the code, not from analyzing the source.
Not wanting too pedantic but any 'magic numbers' (i.e. not 0 or 1) should be a constant at least.
Wouldn't it be possible to catch N+1 using listeners?
I don't think so. You don't have enough information there
I don't understand why none of the ORMs have built-in support to dynamically detect and optimize N+1 in a live environment.
The basics would be real easy to write - the ORM can correlate the "N" queries with the "+1" query, and prefetch batches of results when it detects a likely problem. Add in some statistics to enable smart decisions, and pretty soon you have the first ORM in the world to not care about N+1.
Steve,
I would gladly take a patch for that. I don't consider this an easy problem