У меня длительный запрос, который возвращает большой набор данных.Этот запрос вызывается из веб-службы, а результаты преобразуются в файл CSV для конечного пользователя.Предыдущие версии выполнялись более 10 минут и возвращали результаты конечному пользователю только после завершения запроса.
Я переписал запрос туда, где он выполняется, в большинстве случаев примерно за минуту, и переписал способ доступа к нему, чтобы результаты передавались клиенту по мере его поступления в веб-службу asp.net изсервер базы данных.Я проверил это, используя локальный экземпляр SQL Server, а также удаленный экземпляр без проблем.
Теперь, на пороге производственного развертывания, кажется, что наш рабочий сервер SQL-сервера не отправляет никаких результатов обратно в веб-службу, пока запрос не завершит выполнение.Кроме того, я обнаружил, что другой компьютер, идентичный работающему удаленному серверу (клоны), также не передает результаты.
Версия SQL Server 2008 идентична на всех машинах.На производственном компьютере установлена немного другая версия Windows Server (6.0 против 6.1).Рабочий сервер имеет 4 ядра и в несколько раз больше оперативной памяти, чем другие серверы.Другие серверы одноядерные с 1 Гб оперативной памяти.
Есть ли какие-либо настройки, которые могут быть причиной этого?Или есть какой-либо параметр, который я могу установить, чтобы SQL Server не буферизировал результаты?
Хотя я знаю, что это вообще не повлияет на общее время выполнения, оно сильно изменит восприятие конечного пользователя.
тл; д-р;Мне нужно, чтобы результаты запроса передавались конечному пользователю во время выполнения запроса.Он работает с некоторыми компьютерами баз данных, но не на других.Все машины работают под управлением одной и той же версии SQL Server.
Суть того, что я делаю в C #:
var reader = cmd.ExecuteReader();
Response.Write(getHeader());
while(reader.Read())
{
Response.Write(getCSVForRow(reader));
if(shouldFlush()) Response.Flush()
}
Разъяснение, основанное на ответе ниже
Есть 4 сервера базы данных, Local,Прод, QA1, QA2.Все они работают под управлением SQL Server 2008. Все они имеют идентичные базы данных, загруженные в них (более или менее, с задержкой в 1 день для не-prod).
Веб-сервис размещен на моей машине (хотя я также тестировал и удаленно).
Единственное изменение между тестами - это строка подключения в web.config.
QA2 работает (потоковая передача) и является клоном QA1 (виртуальные машины).Единственная разница между QA1 и QA2 заключается в добавленной базе данных на QA2, вообще не связанной с этим запросом.
QA1 не работает.
Все тесты включают в себя набор данных максимального размера в результате (в настоящее время мы ограничиваем до 5 тыс. Строк).Браузер отображает диалог загрузки, как только происходит первая очистка.Это желаемый результат.Мы хотим, чтобы они знали, что их загрузка обрабатывается, даже если скорость загрузки низкая и иногда падает до нуля (так обстоит дело с базами данных).
В настоящее время мой код очистки прост.Каждые k строк, которые мы сбрасываем, с k в настоящее время установлены на 20.
Самая запутанная часть этого - факт, что QA1 и QA2 ведут себя по-разному.Я заметил, что наш производственный сервер настроен на режим совместимости 2005 (90), где для QA и локальной базы данных установлено значение 2008 (100).Я сомневаюсь, что это имеет значение.Когда я выполняю sprocs через SSMS, у меня одинаковое поведение на всех машинах.Я вижу результаты потока сразу.
Есть ли какая-либо настройка строки подключения, которая могла бы отключить потоковую передачу?