#c# #asp.net #sql-server #azure #sqldatareader
#c# #asp.net #sql-сервер #azure #sqldatareader
Вопрос:
Система, над которой я работаю, использует SqlDataReader для широкого чтения данных из базы данных по всей системе. Однако в конкретном случае количество времени, необходимое для выполнения строки
sqlDataReader.GetValues(values);
может занять 2 секунды вместо менее 1 миллисекунды, которую обычно занимает. Этот конкретный экземпляр получает данные из представления с двумя разными условиями where, что приводит к двум разным наборам данных одного и того же типа представления, но довольно часто одни и те же данные находятся в обоих наборах данных. Обычно количество записей составляет от 50-200, а временная задержка влияет примерно на 1 из 6, поэтому для 100 записей это более 30 секунд дополнительно. Что еще более странно, так это то, что даже при идентичных данных получение набора данных одним способом не имеет задержки, но получение его другим способом имеет задержку для определенных записей.
Другими словами:
DatasetA
RecordId, ColumnA
1, AAA
2, BBB
3, CCC
DatasetB
RecordId, ColumnA
1, AAA
3, CCC
5, EEE
6, FFF
Набор данных A загрузится менее чем за 5 миллисекунд, однако набор данных B займет 3 секунды, и это будет связано с тем, что чтение 3, CCC
займет менее 1 миллисекунды GetValues
для набора данных A, но займет 2,7 секунды GetValues
для тех же данных при чтении набора данных B.
Также кажется, что это происходит только в Azure, а не на моем тестовом сервере с голым металлом или на моей машине разработки.
Если бы это была какая-то задержка между экземпляром SQL server в Azure и веб-приложением в Azure, я бы ожидал, что это поведение будет случайным и непротиворечивым. Кто-нибудь видел что-нибудь подобное или имеет представление о том, что с этим делать? Я в недоумении.
Спасибо!
Комментарии:
1. Вы также запускали «необработанный» sql-запрос отдельно от SSMS, подключающихся к экземпляру SQL Azure? Хотите сосредоточиться на том, что здесь медленно, на стороне кода или на стороне БД?
2. ДА. Оба в коде (SqlDataReader SqlDataReader = SqlCommand . ExecuteReader();) и SSMS среднее время, необходимое для выполнения запроса, составляет менее 2 секунд.
Ответ №1:
Терпение — это достоинство.
Когда я запускал запрос в SSMS, я недостаточно долго ждал завершения всего запроса. Я получал результаты, которые заполняли мой экран в течение 2 секунд, но я никогда не понимал, что на самом деле он извлекает больше записей. Следовательно, то, что, как я думал, занимало 2 секунды, на самом деле занимало 30 секунд. Я также не понимал, что SqlDataReader начинает возвращать данные, как только некоторые из них доступны, и не обязательно после завершения запроса. Вот почему в getValues он будет ждать, пока с сервера не будет возвращено больше данных.
Так что, в конце концов, проблема не в getValues, а в самом запросе, который выполняется медленно.