We have a website which is using linq to entities, we found that it’s very slow recently, after troubleshooting, I found whenever we use linq to entities to search data from database, it will consume very much CPU time, like toList() function. I know it might because we have lots of data in database which caused to slow response, but I just wonder if there are any other reasons which might cause this problem?
How should I do to optimize these kinds of problem? following is the possible reasons:
-
ToList()might load all object’s foreign object(foreign key), how can I force it only load the object? -
Is my connection pool too small?
Please let me know if there are any other possible reason, and point me the right direction to solve this issue.
In Linq – a query returns the results from a sequence of manipulations to sources when the query is enumerated.
An executing query requires a few things (in no particular order)
Additionally, the database has a few steps, here listed from the point of view of querying a sql server:
So – to find out where the problem with your query is, you need to start measuring. I’ll order these targets in the order I’d check them. This is not a complete list.
Get the translated sql text of the query. You can use sql server profiler for this. You can use the debugger. There are many ways to go about it. Make sure the query text returns what you require for your objects, no more no less. Make sure the tables queried match your expectations. Run the query a couple times.
Look at the result set. Is it reasonable or are we looking at 500 Gigs of results? Was a whole table queried, when the whole thing wasn’t needed? Was a cartesian result generated unexpectedly?
Get the execution plan of the query (in sql studio, click the
show estimated execution planbutton). Does the query use the indexes you expect it to? Does the plan look wierd (possibly a bad plan came from the cache)? Does the query work on tables in the order you expect it to, and perform nested/merge/hash joins in the way you expect? Is there parallellization kicking in, when the query doesn’t deserve it (this is a sign of bad indexes/TONS of IO)?Measure the IO of the query. (in sql server, issue SET STATISTICS IO ON). Examine the logical IO per table. Which table stands out? Again, look for a wrong order of table access or an index that can support the query.
If you’ve made it this far, you’ve likely found and fixed the problem. I’ll keep going though, in case you haven’t.
Compare the execution time of the query to the execution time of the enumeration. If there’s a large difference, it may be that the code which interprets the data objects is slow or that it generated slow. It could also be that the translation of the query took a while. These are tricky problems to solve (in LinqToSql we use compiled queries to sort them out).
Measure Memory and CPU for the machine the code is running on. If you are capped there, use a code profiler or memory profiler to identify and resolve the issue.
Look at the network stats on the machine, in particular you may want to use TCPView to see the TCP socket connections on the machine. Socket resources may be mis-used (such as opening and closing thousands in a minute).
Examine the database for locks held by other connections.
I guess that’s enough. Hope I didn’t forget any obvious things to check.