У нас є база даних для продукту, який важкий для запису. Ми щойно придбали нову серверну машину з SSD, щоб допомогти. На наш подив, вставки були не швидшими, ніж на нашій старій машині зі значно повільнішим зберіганням. Під час бенчмаркінгу ми помітили, що показник IO, демонструваний процесом SQL Server, був дуже низьким.
Наприклад, я запустив скрипт, знайдений на цій сторінці , за винятком того, що я додав BEGIN TRAN і COMMIT навколо циклу. У кращому випадку я міг бачити, як витрачання диска досягає 7 Мбіт / с, в той час як процесор ледь торкався 5%. На сервері встановлено 64 Гбіт і використовує 10. Загальний час запуску склав 2 хвилини 15 секунд для першого дзвінка до приблизно 1 хвилини для наступних дзвінків. База даних працює на простому відновленні і в ході тесту простоювала. Я кидав стіл між кожним дзвінком.
Чому такий простий сценарій так повільний? Апаратне забезпечення майже не використовується. Як спеціалізовані інструменти для порівняння дисків, так і SQLIO вказують на те, що SSD працює правильно зі швидкістю до 500 Мбіт / с як для читання, так і для запису. Я розумію, що випадкові записи проходять повільніше, ніж послідовні, але я б очікував, що така проста вставка, як ця, до таблиці без кластерної індексації, буде набагато швидшою.
Зрештою, наш сценарій набагато складніший, але я відчуваю, що мені потрібно спершу зрозуміти простий випадок. Коротше кажучи, наша програма видаляє старі дані, потім використовує SqlBulkCopy для копіювання нових даних у таблиці постановки, виконує деяку фільтрацію та, нарешті, використовує MERGE та / або INSERT INTO залежно від випадків, щоб скопіювати дані у підсумкові таблиці.
-> EDIT 1: Я дотримувався процедури, пов'язаної Мартіном Смітом, і отримав такий результат:
[Wait Type] [Wait Count] [Total Wait (ms)] [T. Resource Wait (ms)] [T. Signal Wait (ms)]
NETWORK_IO 5008 46735 46587 148
LOGBUFFER 901 5994 5977 17
PAGELATCH_UP 40 866 865 1
SOS_SCHEDULER_YIELD 53279 219 121 98
WRITELOG 5 145 145 0
PAGEIOLATCH_UP 4 58 58 0
LATCH_SH 5 0 0 0
Мені здається, що дивна NETWORK_IO займає більшу частину часу, враховуючи, що немає результатів для відображення і немає даних для передачі куди-небудь, крім файлів SQL. Чи включає тип NETWORK_IO весь IO?
-> EDIT 2: Я створив диск на 20 Гб оперативної пам’яті і звідти встановив базу даних. Найкращий час, який я мав на SSD, - 48 секунд, при цьому оперативна пам’ять знизилася до 37 секунд. NETWORK_IO - все ще найбільше очікування. Максимальна швидкість запису на диск оперативної пам’яті становила близько 250 Мбіт / с, хоча він здатний робити кілька гігабайт в секунду. Він все ще не використовував багато процесора, так що ж підтримує SQL?
NETWORK_IO
може бути від 3 млн «1 ряду (ів) постраждалі» повідомлення відправляються назад. Ви намагалися додати SET NOCOUNT ON
до сценарію?
EE_WaitStats*.xel
тому старі забруднюють ваші результати.
SET NOCOUNT ON
до цього теж додавав .