З ланцюжка коментарів, схоже, ви інтерпретуєте ASYNC_NETWORK_IO
очікування, що проблема пов’язана з мережею. Це (як правило) не так.
Як @MartinSmith натякнув на (двічі), найбільш вірогідним поясненням цього є SSMS або програма, яку ви використовуєте, не використовує результати так швидко, як SQL Server їх обслуговує. Виконайте будь-який із запропонованих методів, щоб зняти витрату рядків з вимірювання, і ви отримаєте справжню (r) картину максимальної пропускної здатності:
На випадок, якщо ви ще цього не зробили, вам, очевидно, потрібно DBCC DROPCLEANBUFFERS
буде переконатися, що дані дійсно читаються з диска, а не з кеш-пам'яті. Застосовуються звичайні застереження "лише на тест, не робіть цього в активному середовищі" тощо.
Очікуйте пару ваших інших коментарів:
Під час виконання запиту, який повертає 9 мільйонів рядків, використання процесора залишиться приблизно на 13%, 9% можна віднести до sqlserver ... чи не поверне він результати швидше, ніж на 3 хвилини, якби всі дані були в оперативній пам’яті?
Що саме ми тут тестуємо, як і чому? Якщо ваш 9-мільйонний запит рядків - це щось інше, ніж SELECT * FROM dbo.SomeTable
тоді, то 1001 фактор може брати участь у відтворенні, крім простого пропускної здатності вводу-виводу.
Ваш Intel I7-3820 - це 4-ядерний процесор. Якщо ваш тестовий запит не генерує паралельний план, я буду здивований, якщо ви зможете знищити більше 20% використання процесора з системи.
Три хвилини, щоб повернути 9 мільйонів рядків, є дуже підозрілими і свідчать про те, що ми не отримуємо повного уявлення про тестування. Я думаю, що це випадок неоптимального (непаралельного) плану запитів, наповненого вкладеними операторами вкладених циклів, що тягнуть мільйони рядків, а не лише одну таблицю SELECT
для перевірки споживання IO.
Я пропоную:
SELECT *
перевірити тільки IO через SQL Server.
- Нове запитання щодо плану виконання вашого запиту, якщо ви хочете розібратися, чому він не насичує IO.