Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Entity Framework Issue When running Stored Procedures

I have an issue with stored procedures and Entity Framework.

Let me explain what is happening... and what I have tried thus far.

I have a stored procedure, which does not do an awful lot

SELECT 
    COUNT(DISTINCT(EmailAddress)) AcceptedQuotes, 
    CONVERT (DATE,QuoteDate) QuoteDate
FROM
    Quote Q
JOIN 
    Person P on Q.PersonPk = P.Pk
JOIN 
    Product Pr on Q.ProductPk = Pr.Pk
JOIN 
    Accepted A on Q.Pk = A.QuotePk
WHERE               
    QuoteDate between @startDate and @endDate
    AND CompanyPk = @companyPk
    AND FirstName != 'Test'
    AND FirstName != 'test'
    AND FirstName != 'EOH'

I want to execute this, and it works fine in SSMS and does not even take 1 second.

Now, I import this in to Entity Framework, it times out and I set the command timeout to 120...

Ok so what I have tried thus far and what I have tested.

If I use SqlCommand, SqlDataAdapter, DataTable way, with my own connection string, it executes as expected. When I use Entity Framework connection string in this scenario, it times out.

I altered my stored procedure to include "Recompile" option and also tried the SET ARITHABORT way, no luck, it times out when run through the EF.

Is this a bug in EF?

I have now just about decided to rewrite this using "old school" data access.

Also note that the EF executes fine with other stored procs, from the same database.

Any ideas or help would be greatly appreciated...

PS. I found this article, but no help either :(

http://www.sommarskog.se/query-plan-mysteries.html

like image 949
Kobie Avatar asked May 07 '15 06:05

Kobie


People also ask

Does Entity Framework support stored procedures?

The Entity Framework has the capability of importing a Stored Procedure as a function. We can also map the result of the function back to any entity type or complex type.

Can we use stored procedure in Entity Framework Core?

Stored procedures are one of the key advantages that the Microsoft SQL server provides. For boosting the query performance, the complex query should be written at the database level through stored procedures. Microsoft . NET Core supports calling of raw query and store procedure through entity framework.

What is a stored procedure in Entity Framework?

Stored Procedure in Entity Framework. The Entity Framework allows you to use stored procedures in the Entity Data Model. You can use stored procedures to perform predefined logic on database tables.

What are the limitations of executesqlcommand methods in EF Core2?

There are some limitations on the execution of database stored procedures using FromSql or ExecuteSqlCommand methods in EF Core2: Result must be an entity type. This means that a stored procedure must return all the columns of the corresponding table of an entity. Result cannot contain related data.

What is your opinion on the performance of Entity Framework?

My opinion is that Entity Framework provides a very good feature but can’t beat the performance of the stored procedure because of its precompiled nature. Please let me know if you have a different opinion.

How to execute an Entity Framework database query asynchronously?

Four changes were applied to enable the Entity Framework database query to execute asynchronously: The method is marked with the async keyword, which tells the compiler to generate callbacks for parts of the method body and to automatically create the Task<ActionResult> object that is returned.


1 Answers

This may be caused by Parameter Sniffing

When a stored procedure is compiled or recompiled, the parameter values passed for that invocation are "sniffed" and used for cardinality estimation. The net effect is that the plan is optimized as if those specific parameter values were used as literals in the query.

  1. Using dummy variables that are not directly displayed on parameters also ensure execution plan stability without need to add recompile hint, example below:

create procedure dbo.SearchProducts @Keyword varchar(100) As Declare @Keyworddummy as varchar(100) Set @Keyworddummy = @Keyword select * from Products where Keyword like @Keyworddummy

  1. To prevent this and other similar situations, you can use the following query option:

OPTIMIZE FOR RECOMPILE

  1. Disable auto-update statistics during the batch
like image 188
Hussein Khalil Avatar answered Oct 11 '22 15:10

Hussein Khalil