SQLCommand . Метод ExecuteReader медленный

У меня проблема с производительностью объекта SqlDataReader.

Я привык использовать Entity Framework, но по определенной причине мне следует использовать запросы ADO.NET в своем приложении.

Проблема в том, что когда я выполняю свой запрос, это занимает почти 10 секунд.

Я запускаю точно такой же запрос в SQL Server Management Studio, это занимает всего 1 секунду.

Я подумал, что, возможно, это SqlDataReader, и попытался заполнить DataTable SqlDataAdapter, но получил тот же результат.

Что не так с моим кодом? Есть ли способ улучшить производительность SqlDataReader?

Вот запрос и код С#.

string commandText = "SELECT Pati_FirstName, Pati_LastName, Pati_Gender AS Gender, "
        + " Pati_HeadQuarterID, Pati_AgencyID, Pati_Address1, Pati_Address2, Pati_BirthDate, Pati_FullName, Pati_FirstNameIfDiff, Pati_LastNameIfDiff, Pati_FootSize, Pati_ID, Pati_Height, Pati_MailAddress,"
        + " Pati_MobileNumber, Pati_PhoneNumber, Pati_PostCode, Pati_SecurityNumber, Pati_Weight,"
        + " Agen_Name, Head_Name, pat.Path_Name AS Pati_Pathologie,"
        + " gender.Capt_CulturInfo AS Pati_Gender, prof.Capt_CulturInfo AS Pati_Profession, title.Capt_CulturInfo AS Pati_Title, sport1.Capt_CulturInfo AS Pati_Sport1, sport2.Capt_CulturInfo AS Pati_Sport2,"
        + " p1.Pres_FullName AS Prescriber1, p2.Pres_FullName AS Prescriber2, pSender.Pres_FullName AS SentBy, Prac_FullName, City_Name"

        + " FROM Patient INNER JOIN HeadQuarter ON Head_ID = Pati_HeadQuarterID INNER JOIN"
        + " Agency ON Agen_ID = Pati_AgencyID LEFT OUTER JOIN"
        + " CustomCaption AS gender ON gender.Capt_Family = 'Pati_Gender' AND gender.Capt_Code = Pati_Gender LEFT OUTER JOIN"
        + " CustomCaption AS prof ON prof.Capt_Family = 'profession' AND prof.Capt_Code = Pati_Profession LEFT OUTER JOIN"
        + " Pathology AS pat ON pat.Path_ID = Pati_Pathologie LEFT OUTER JOIN"
        + " CustomCaption AS title ON title.Capt_Family = 'title' AND title.Capt_Code = Pati_Title LEFT OUTER JOIN"
        + " CustomCaption AS sport1 ON sport1.Capt_Family = 'sports' AND sport1.Capt_Code = Pati_Sport1 LEFT OUTER JOIN"
        + " CustomCaption AS sport2 ON sport2.Capt_Family = 'sports' AND sport2.Capt_Code = Pati_Sport2 LEFT OUTER JOIN"
        + " Prescriber AS p1 ON p1.Pres_ID = Pati_Doctor1 LEFT OUTER JOIN"
        + " Prescriber AS p2 ON p2.Pres_ID = Pati_Doctor2 LEFT OUTER JOIN"
        + " Prescriber AS pSender ON pSender.Pres_ID = Pati_SentBy LEFT OUTER JOIN"
        + " Practitioner ON Prac_ID = Pati_PracticionerID LEFT OUTER JOIN"
        + " City ON City_ID = Pati_CityID"
        + " WHERE Pati_Deleted IS NULL AND Pati_AgencyID = @AgencyID ORDER BY Pati_LastName, Pati_FirstName"; 

List<VPatient> retVal = new List<DataRepository.VPatient>();

try
{
    using (SqlConnection sqlConn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString))
    {
        using (SqlCommand sqlComm = new SqlCommand("", sqlConn))
        {
            sqlComm.CommandText = commandText.Replace("_CulturInfo", "_" + currentCultur);
            sqlComm.Parameters.AddWithValue("@AgencyID", agencyID);

            sqlComm.Connection.Open();

            // This line takes 10 seconds. 
            SqlDataReader sqlRd = sqlComm.ExecuteReader();

            // I tried this as an alternative, it doesn't change anything.
            // SqlDataAdapter sqlAdp = new SqlDataAdapter(sqlComm);
            // System.Data.DataTable dtPatients = new System.Data.DataTable();
            // sqlAdp.Fill(dtPatients);

            VPatient pat;

            while (sqlRd.Read())
            {
                pat = new VPatient();
                pat.Pati_HeadQuarterID = sqlRd["Pati_HeadQuarterID"].ToString();
                pat.Pati_AgencyID = sqlRd["Pati_AgencyID"].ToString();
                ....

                retVal.Add(pat);
            }
        }
    }
}
catch (Exception ex)
{
    CoreMethods.ParseError(ex, "GetPatientList");
}

И если я выполняю тот же запрос в SQL Server Management Studio, это занимает всего 1 секунду.


person Coskun Ozogul    schedule 05.02.2020    source источник
comment
Это много соединений.   -  person Robert Harvey    schedule 05.02.2020
comment
Он отлично работает в студии управления и в приложении, когда база данных находится на локальном компьютере.   -  person Coskun Ozogul    schedule 05.02.2020
comment
Что заставляет меня думать, что SqlReader работает медленно.   -  person Robert Harvey    schedule 05.02.2020
comment
Если бы я работал с этим SQL, я бы создал хранимую процедуру и выполнил ее из С#. Гораздо проще поддерживать и отлаживать, чем волшебные строки SQL в коде C #, IMO.   -  person haldo    schedule 05.02.2020
comment
Да, я не думаю, что это решит его проблемы с производительностью. Снижение скорости не связано с тем, где хранится SQL. Как указывает OP, одна и та же строка SQL отлично работает в SSMS.   -  person Robert Harvey    schedule 05.02.2020
comment
SqlReader действительно старая школа. Я бы рассмотрел возможность использования чего-то вроде Dapper или необработанных запросов в Entity Framework. для этого. См. также дубликат сообщения, на который я ссылался.   -  person Robert Harvey    schedule 05.02.2020
comment
Можете ли вы позвонить sqlComm.ExecuteNonQuery, это быстро возвращается? С другой стороны, у помеченного дубликата даже нет принятого ответа, закрытие этого слишком быстро, ИМХО.   -  person zaggler    schedule 05.02.2020
comment
Роберт Харви, я попробовал ответы на дубликате, это не работает. А так как нет принятого ответа, пришлось перепробовать все. У меня нет ответа, например.   -  person Coskun Ozogul    schedule 05.02.2020
comment
Çöđěxěŕ, Выполнение не-запроса не требует времени.   -  person Coskun Ozogul    schedule 05.02.2020
comment
@CoskunOzogul хорошо, это приятно слышать, надеюсь, у меня есть кое-что для вас здесь.   -  person zaggler    schedule 05.02.2020