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. Также внимательно посмотрите на столбцы в разделе "Ожидания", и вы узнаете, не вызывает ли обслуживание индекса проблемы для других запросов.

Другие вопросы по тегам