Чому запити SQL Server не використовують більше 7 Мб / сек дискового вводу / виводу


11

У мене є SSD, який, використовуючи тест IOmeter, показує продуктивність понад 200 Мб / с. Однак, коли я запускаю будь-який запит SQL з локальної машини, монітор ресурсів Windows ніколи не показує дискову IO вище 7 Мб / сек. Це справедливо навіть для запитів, на виконання яких потрібно більше 2 хвилин. Що може бути вузьким місцем у тому, що він використовує лише 7 МБ / сек від SSD?

Я бігаю:

  • Windows Server 2012 Standard
  • SQL-сервер 2008 r2
  • Intel i7 3820
  • 32 ГБ оперативної пам’яті
  • сандиск SSD

2
можливо, дані вже є в оперативній пам'яті, і доступ до диска не потрібен?
gbn

1
@DeanMacGregor - Як ти споживаєш результати? Якщо в SSMS, що робити, якщо спробувати варіант відкинути результати. Це щось змінює? Також ви можете спробувати подивитися, sys.dm_os_waiting_tasksпоки запит працює, щоб побачити, чи є інші типи очікування, з якими він стикається.
Мартін Сміт

1
Чи 200 Мб / с для зчитування з випадкового доступу (випадкове зчитування для блоків 4 КБ)? Я думаю, що це зазвичай робиться база даних. Чи запит записується на диск (тимчасовий файл, тимчасовий набір результатів або таблиця)?

2
@DeanMacGregor - Отже, щоб вийняти це з рівняння, ви можете призначити результат скалярним змінним (наприклад, запит). DECLARE @Name VARCHAR(10), @High int; SELECT @Name=name, @High = high FROM master..spt_values. Таким чином, результати не надсилаються клієнтові, але план і IO все одно будуть однаковими.
Мартін Сміт

4
Припустимо, що ви інтерпретуєте, що ASYNC_NETWORK_IO чекає, а це означає, що проблема пов’язана з мережею? Це (як правило) не так. Швидше за все, оскільки @MartinSmith запропонував (двічі), що SSMS або програма, яку ви використовуєте, не споживають результати так швидко, як SQL їх обслуговує. Дотримуйтесь будь-якого із запропонованих способів опущення споживання рядків, і ви отримаєте справжню (r) картину максимальної пропускної здатності IO.
Марк Сторі-Сміт

Відповіді:


7

З ланцюжка коментарів, схоже, ви інтерпретуєте 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.

Я пропоную:

  1. SELECT *перевірити тільки IO через SQL Server.
  2. Нове запитання щодо плану виконання вашого запиту, якщо ви хочете розібратися, чому він не насичує IO.

Насправді це просто вибрати * з dbo.sometable. Вибачте, що не згадував про це раніше; що я мав на увазі, що я міг запустити цей запит з будь-якої таблиці. Генезис мого запитання полягав у тому, що я помітив, що введення диска в мене набагато менше, ніж я очікував навіть від простого запиту "дай мені багато даних" Моє основне занепокоєння полягало в тому, що якщо диск IO настільки низький, продуктивність може бути покращена, якщо коренева причина низького дискового вводу виникла.
Дін Макгрегор
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.