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