Из цепочки комментариев, похоже, вы интерпретируете, ASYNC_NETWORK_IO
что означает, что проблема связана с сетью. Это (как правило) нет.
Как @martinSmith намекнул (дважды), наиболее вероятным объяснением этого является SSMS или приложение, которое вы используете, не получая результаты так быстро, как их обслуживает SQL Server. Выполните любой из предложенных способов, чтобы удалить потребление строк из вашего измерения, и вы получите истинную (r) картину максимальной пропускной способности ввода-вывода:
На тот случай, если вы этого еще не сделали, вам, очевидно, нужно DBCC DROPCLEANBUFFERS
убедиться, что данные действительно читаются с диска, а не из кеша буфера. Применяются обычные предупреждения «только на тесте, не делайте этого в активной живой среде» и т. Д.
Оттачивая пару других ваших комментариев:
Хотя при выполнении запроса, который возвращает 9 миллионов строк, загрузка ЦП останется на уровне 13%, а 9% - на sqlserver ... разве он не вернет результаты быстрее, чем за 3 минуты, если все данные будут в ОЗУ?
Что именно мы здесь тестируем, как и почему? Если ваш запрос на 9 миллионов строк отличается от a, SELECT * FROM dbo.SomeTable
то в игру вступают 1001 фактор, кроме простой пропускной способности ввода-вывода.
Ваш Intel I7-3820 является 4-ядерным процессором. Если ваш тестовый запрос не генерирует параллельный план, я был бы удивлен, если бы вы могли получить более 20% загрузки ЦП из системы.
3 минуты, чтобы вернуть 9 миллионов строк, очень подозрительно и говорят о том, что мы не получаем полной картины того, что вы тестируете. Я предполагаю, что это случай неоптимального (непараллельного) плана запроса, заполненного множеством операторов вложенного цикла, тянущих миллионы строк, то есть не одну таблицу SELECT
для проверки потребления ввода-вывода.
Я предлагаю:
SELECT *
проверить только IO через SQL Server.
- Новый вопрос с планом выполнения вашего запроса, если вы хотите разобраться, почему он не насыщает ввод-вывод.