При подключении к нашему производственному серверу (SQL Server 2008, очень мощный компьютер) этот оператор SELECT занимает 2 секунды , выполняя все поля (всего 4 МБ данных).
SELECT TOP (30000) *
FROM person
WITH(NOLOCK);
Из любого другого блока в той же сети (подключение с использованием проверки подлинности SQL или проверки подлинности Windows) тот же запрос занимает 1 минуту 8 секунд .
Я тестирую это очень простое утверждение, чтобы проиллюстрировать, что это не проблема индексации или проблема, связанная с запросами. (У нас проблемы с производительностью по всем запросам на данный момент ...)
Ряды бывают кусками, а не все сразу. Я получаю свои первые ряды мгновенно, а затем жду более 1 минуты, пока не появятся партии рядов.
Вот клиентская статистика запроса, когда он запускается из удаленного окна:
Query Profile Statistics
Number of INSERT, DELETE and UPDATE statements 0
Rows affected by INSERT, DELETE, or UPDATE statements 0
Number of SELECT statements 2
Rows returned by SELECT statements 30001
Number of transactions 0
Network Statistics
Number of server roundtrips 3
TDS packets sent from client 3
TDS packets received from server 1216
Bytes sent from client 266
Bytes received from server 4019800
Time Statistics
Client processing time 72441 ms (72 seconds)
Total execution time 72441 ms
Wait time on server replies 0
Мы видим, что «Время обработки клиента» равно общему времени выполнения.
Кто-нибудь знает, какие шаги я могу предпринять, чтобы диагностировать, почему передача фактических данных занимает много времени?
Существует ли параметр конфигурации SQL, который ограничивает или ограничивает скорость передачи данных между компьютерами?
источник
Ответы:
Ваша проблема определенно связана с сетью, основываясь на вашей информации. Как таковой, он должен иметь дело с сетевыми профессионалами (я не один).
Вещи, которые могут помочь:
Находится ли веб-сервер в той же подсети, что и SQL-сервер?
Есть ли между ними маршрутизаторы / мосты?
Не много возможных изменений на сервере SQL:
Вы используете размер по умолчанию: смотрите статистику: «Пакеты TDS, полученные с сервера 1216» (4MB / 1K = 4KB). Да, размер буфера TDS можно изменить: см. В Google: «Размер пакета протокола TDS»
Хорошая дискуссия на тему: "действительно ли размер сетевого пакета sql определяет двусторонний трафик?"
Однако изменение размера пакета TDS неизбежно приведет к непредсказуемым последствиям и должно использоваться только в исключительных случаях.
Также может помочь изменение архитектуры или введение кеширования данных на промежуточном уровне.
источник
Эта проблема теперь решена.
Это была проблема с сетью, и в блоке SQL использовалась карта NIC 100 МБ / с вместо карты NIC 10 ГБ / с ...
Изменение конфигурации сети для использования правильной сетевой карты устранило проблему. Теперь мы получаем аналогичную производительность для всех запросов из блока «Рабочий SQL» и из других блоков в сети.
Спасибо всем за вашу помощь.
источник
При первоначальном чтении звучит так, как будто вы испытываете некоторые задержки в сети. Вы смотрели на некоторые счетчики Network Perfmon? Они могут дать вам некоторое представление о том, что происходит с сетью.
Цитата Какие счетчики Perfmon я должен контролировать и что каждый из них означает?
источник
Некоторые предварительные вопросы: 1) На сервере есть клиент SQL на Prod. сервер настроен, верно? Так что, если вы сделаете тот же запрос от клиента, расположенного на той же машине, он будет выполнен через 2 секунды? Вы пытались это сделать? Это действительно 2 секунды? 2) Вы упомянули, что конфигурация вашей производственной среды была изменена (или рабочий сервер перенесен на другую сеть / полное восстановление сервера выполнено), верно? Сколько времени занимал запрос в старой производственной среде?
Из любопытства: это пример запроса? или точная формулировка запроса? Запрос действительно НЕ содержит предложения WHERE? Согласитесь со мной, что это очень необычно .. Таблица имеет кластерный индекс или это куча? Таблица содержит сколько строк всего? Стол сильно фрагментирован? Из любопытства: почему ВЫБРАТЬ ТОП NNN? Почему бы не установить ROWCOUNT NNN - тогда ВЫБРАТЬ *? Этот запрос выдается клиентом сколько раз в день? 1? 100? 1млн? Базовые данные статичны или динамичны и сильно изменены? Сколько (0,01 процента в день? 1 процент в день? 10 процентов в день?) Вывод запроса обрабатывается программно? (не пользователем?) Почему он не кэшируется / не сохраняется на промежуточном уровне? спасибо Алексей
источник