SQL Server: расчет производительности производительности запросов
Недавно я настроил некоторые запросы, добавив индекс, и теперь пытаюсь оценить, улучшается ли общая ситуация в этой таблице.
Я захватил некоторые показатели из sys.dm_db_index_usage_stats
, Первый график показывает разницу между количеством user_seeks
(сканирует, ищет и user_updates (пишет)) для этого конкретного нового индекса. Второй график просто вычитает user_updates
из всех чтений по этому индексу. Глядя только на эти цифры, я ясно вижу, что индекс больше записан, чем фактически прочитан.
Однако этот индекс, в частности, помогал двум запросам мониторинга попадать на сервер каждую минуту 24/7. Прежде чем я добавил этот индекс, эти запросы выполняли сканирование кластерного индекса. Просматривая метрики для кластеризованного индекса, я ясно вижу, что количество сканирований уменьшилось с той же скоростью, по которой теперь ищется новый индекс (720 запросов в 6-часовое окно и, следовательно, 2,880 запросов (или предыдущих сканирований кластерного индекса) в день.
Спасибо за то, что вы терпеливы и читаете все это... теперь на мой вопрос. Каким образом я могу рассчитать объем МБ, который вызывает запись в мой новый индекс? Я хотел бы сравнить IO (в МБ) со всеми этими сканированиями таблиц и IO после поиска и поддержки нового индекса.
Так вот расчет, который я сделал:
Read IO Table Scan 79.977 Reads / 128 = 765,45 MB
-Read IO Index Seek 15 Reads / 128 = 0,12 MB
= Read IO Savings per query 765,33 MB
Read IO savings per day 765,33 MB * 2.880 = 2.152 GB
-Запись нового индекса в день 26.000 записей * 49 байт на строку написано = 1.274.000 байт
Overall benefit per day 2.152 - 754.000/(1024^3) = 2.152 - 0,0011= 2.151,99 ?????
Моя экономия на чтении ввода-вывода довольно проста, поскольку я собирал эту информацию во время настройки запросов. Однако как я могу рассчитать (или сделать обоснованное предположение) накладные расходы ввода-вывода для записи в этот индекс? Я знаю, что я делаю примерно 26 000 записей в день. Индекс имеет следующую структуру:
[2 KEYS] column1 {datetime 8}, column2 {datetime 8} [3 INCLUDES] column3 {бит 1}, column4 {bigint 8}, column5 {int 4} [СЕКРЕТНЫЕ КОЛОННЫ (Кластерный ключ)] [3 KEYS] column6 {bigint 8}, column7 {bigint 8}, column8{int 4}
Так что я думаю, что запись уровня листа имеет 49 байт (суммируя все эти числа). Есть это? Как я мог угадать промежуточные уровни?
Во всяком случае...(подробнее о направлении "образованного предположения") в вашем опыте это действительно имеет значение, поскольку я все равно избавляю меня от сканирования стола и делаю это регулярно?
Большое спасибо за то, что прочитали и поделились со мной своими соображениями по поводу расчета прибыли при настройке запросов.
1 ответ
Проверьте dmv sys.dm_db_index_operational_stats, он предоставит информацию о том, сколько страниц SQL Server нужно перемещать и читать для выполнения запросов / обновлений. Это дает лучшее представление о реальном IO. Также внимательно посмотрите на столбцы в разделе "Ожидания", и вы узнаете, не вызывает ли обслуживание индекса проблемы для других запросов.