Небольшое исследование на тему больших таблиц и индексов

Статья образовалась в ходе обсуждения статьи "История оптимизации одного большого запроса средствами MSSQL Profiler и 1С". По ходу обсуждения был задан вопрос: "Что выгоднее оптимизировать - количество обрабатываемых строк или скорость выполнения операции?" В статье проведено небольшое исследование поведения оптимизатора на больших таблицах и влияние индексирования на скорость выполнения запросов.

Статья образовалась в ходе обсуждения статьи "История оптимизации одного большого запроса средствами MSSQL Profiler и 1С". По ходу обсуждения был задан вопрос: "Что выгоднее оптимизировать - количество обрабатываемых строк или скорость выполнения операции?"

В статье проведено небольшое исследование поведения оптимизатора на больших таблицах и влияние индексирования на скорость выполнения запросов.

Еще раз добрый день, уважаемые коллеги. 

Эта небольшая статья родилась в ходе обсуждения моей предыдущей статьи - История оптимизации одного запроса. Спасибо Сергею Костякову (Srom), который подтолкнул меня к проведению этого исследования. Я сначала даже хотел ответить в комментариях к статье, но когда понял что есть ограничение на количество скриншотов, подумал что есть смысл это вынести в небольшую статью.

Если вкратце, то Srom задал резонный вопрос

Проиндексировать эту таблицу вместо анализа запроса(анализ, конечно, правильней, не спорю) не проще был сначала попробовать? Как бы это первое, что приходит в голову.

На что я ответил:

Сложно судить, но мне почему-то как раз пришло в голову именно с таблицей разобраться, чем пытаться помочь с TABLE SCAN'ом ) 


И далее у меня родилась следующая гипотеза (цитирую свой комментарий):

По-большому счету любую операцию можно рассматривать как V=f(P,T), где V объем, т.е. количество выполненных операций за все время, P производительность, т.е. скорость выполнения этих операций в единицу времени) и T время затрачиваемое на работу, т.е. общее время выполнения операции. Предположим (для упрощения, но можно проверить и составить реальный график по реальным данным) график будет линейным (V=P*T). 

Предположим, что у нас на начальном этапе скорость обработки данных - 100 единиц в единицу времени, а объем необходимый для производства равен 100 000 единиц (у нас цифры были другие 2 млн строк и 2 минуты), тогда время которое необходимо затратить, чтобы произвести (обработать) 100 000 единиц - 100 000 / 100 = 1000 единиц времени. 

Двигаемся дальше - скорость оставляем НЕИЗМЕННОЙ, а значительным образом уменьшим количество записей до 1000, тогда время будет равно 10 единицам, а теперь подумаем во сколько раз нам нужно увеличить скорость выполнения операций при НАЧАЛЬНЫХ условиях объема 100 000 и заданном времени T=10, скорость выполнения операции должна стать 10 000, т.е. вырасти в 100 раз (математика начальная школа :)))). 

Ну, а в нашем случае, у нас было 2 млн. строк и я планировал его уменьшить до 2000 примерно, соответственно скорость выполнения нужно было увеличить в 1000 раз, чтобы получить сравнимый прирост :) 

С моей точки зрения, я мог с высокой степенью гарантии уменьшить количество записей до 2000, но получить прирост в 1000раз при добавлении индекса - я получил бы вряд ли. 


Я задался целью проверить эту гипотезу - уменьшение количества записей в среднем случае выгоднее, чем увеличение скорости их обработки. Для этого на тестовой базе создал модель:

две таблицы MainTable (2 млн. строк) и CopyTable (160 строк). Каждая содержит две колонки ID и Rand - заполненных случайным образом двузначными числами (CopyTable получалась из MainTable путем копирования только 160 строк).

Запрос для теста будет следующим:

select M.ID,M.Rand,C.ID,M.Rand

from MainTable M 

inner join CopyTable C 

on M.ID = C.ID

1) Выполняем запрос без всяких индексирований - время выполнения 23 секунды. Видим везде Table Scan. Оптимизатор говорит - не хватает индекса - "ну надо так надо" (с)

ПВЗ №1

2) Выполняем тот же запрос, но с созданным индексом по полю ID. И видим следующую интересную картину - время выполнения уменьшилось на 1 секунду :) - 22 секунды. И оптимизатор использует индекс только для первой (маленькой) таблицы, а вторую продолжает гонять table scan'ом.

ПВЗ №2

Почему не использует индекс? Добавим инструкцию WITH (Index = name_index) и заставим оптимизатор использовать индекс, хоть он этого и не очень хочет. Посмотрим что будет :)))

3) Выполняем запрос с конкретным индексом. Время выполнения опять 22 секунды. Видим следующую картину (см. ниже). Данные лежат в куче (heap), что логично, так как у нас индекс не кластерный. И оптимизатор тратит 97% на поиск строки по закладке - оператор RID LookupNB! Оптимизатор говорит, что ему явно не хватает поля Rand в индексе - попробуем его добавить в оба индекса

ПВЗ №3

4) Выполняем исходный запрос. Время выполнения - ОПЯТЬ 22 секунды!!! =))) ПВЗ - четко использует оба индекса, но возникает Nested Loop. И кстати Index Seek на 2 млн. записей - все равно отнимает 77% от общего выполнения запроса, что кстати БОЛЬШЕ!!! чем Table Scan из второго запроса, где он занимал 56% от общего времени (а время выполнения одинаковое для обоих запросов)

ПВЗ №4

5) Делаем оба индекса кластерными - посмотрим что из этого получится. Ну и собственно ничего из этого особенного не получилось - Clustered Index Scan и Nested Loops и 24 секунды времени

ПВЗ №5

6) Ну и напоследок уменьшаем количество записей до 20 000 и смотрим на время выполнения и план выполнения запроса:

select M.ID,M.Rand,C.ID,M.RAND

from (select top 20000 * from MainTable) M

inner join CopyTable C on

M.ID = C.ID

ПВЗ №6

Два Clustered Index Scana и меньше 1 секунды на выполнение

7) Убираем оба индекса и прогоняем запрос. Вернулись оба Table Scana, но время выполнения все равно осталось меньше 1секунды

ПВЗ №7

Выводы

1) С моей точки зрения гипотеза подтвердилась. В общем случае - выгоднее оптимизировать количество обрабатываемых данных, чем оптимизировать скорость операции. Кстати зависимость времени от количества строк действительно практически линейная (см. диаграмму ниже)

График зависимости времени от количества записей

2) Индексы не панацея. Во-первых, индексы не всегда можно создать (например если есть колонка с строкой неограниченной длины). Во-вторых, индексы не всегда работают. В-третьих, когда индексы работают - не факт, что они дадут прирост производительности.

Начать дискуссию

Официально: даны прогнозы роста основных показателей экономики

Минэкономразвития ждет, что за 2024 год ВВП превысит 191 трлн рублей, реальные доходы населения вырастут на 5,3%, а безработица сохранится в пределах 3%.

Курсы повышения
квалификации

20
Официальное удостоверение с занесением в госреестр Рособрнадзора

Бухгалтеры не знают элементарных вещей!

20 лет я главный бухгалтер. Большую часть из них работала в Хабаровском крае. С проблемой ниже, конечно, сталкивалась, но не сплошь, а вопрос с контрагентом решался быстро и безболезненно.

Бухгалтеры не знают элементарных вещей!
Общество

На сколько подорожал шашлык: суммы и наш опрос

Заметнее всего подорожал шашлык из курицы. Стоимость блюда выросла на 20%, до 389 рублей.

Лучшие спикеры, новый каждый день

Летом стартует очередной эксперимент по маркировке товаров

Минпромторг предложил с 1 июля 2024 года провести эксперимент по маркировке полимерных труб и их сырья.

Мошенничество

Малоактивные и брошенные аккаунты работников сервисов доставок стали основой мошеннической схемы

В Санкт-Петербурге полицейские задержали подозреваемого в интернет-мошенничестве через сервисы доставок.

Инвестиции

Держатели облигаций «Киви финанс» могут потребовать погасить их досрочно

Эмитент проведет выплаты в течение 7 рабочих дней с даты получения требования.

Опытом делятся эксперты-практики, без воды

Оценивать риск нарушения закона и принимать решение о проверке будут по 500 индикаторам. А работать когда? 🕵️‍♀️«Ночной бухгалтер» № 1671

Минэкономразвития уже согласовал 30 новых критериев оценки рисков, а до конца года добавят еще 60-70. К концу 2024 году число индикаторов риска увеличится до 500. Как вообще следить за всеми?

Иллюстрация: Вера Ревина/Клерк.ру
Товарный знак

👏 Суд: в товарных знаках нельзя указывать «№1». Но многие компании пренебрегают, хотя это не очень эффективно — говорит эксперт

Роспатенту напомнили, что при регистрации брендов нельзя использовать элементы, которые создают впечатление о превосходстве товаров.

Реклама

С 4 мая упростили продление договора на рекламную конструкцию

Начинают действовать изменения в закон о рекламе и ряд других нормативных актов.

Обзоры новостей

⚡️ Итоги дня: депутат заработал 200 млн рублей, организм может сам вырабатывать алкоголь, у «Яндекс Маркет» ребрендинг, а нейросеть придумала рецепт кофе

Подготовили обзор главных событий дня — 24 апреля 2024 года. Все самое интересное, что писали и обсуждали в сети, в одной подборке.

Тренды договорной работы — 2024

Качественная работа над договором — это работа по минимизации рисков при его исполнении. Потребность что-то отразить в договоре обычно отражает обычаи делового оборота или новые позиции в судебной практике. Если мы говорим о трендах договорной работы в 2024 году, то здесь мы можем отметить и новое, появившееся в этом году, и то, что сохраняет свою актуальность не первый год. В этой статье остановимся коротко на основных договорных трендах.

Тренды договорной работы — 2024

Начальника отдела камеральных проверок арестовали по делу о взятке

За получение взятки в размере 12 млн рублей суд заключил под стражу сотрудника ФНС в Новосибирске.

Миникурсы, текстовые и видеоинструкции для бухгалтеров
ЭДО

Электронные перевозочные документы станут обязательными. Когда и как с ними работать

С 1 сентября 2022 года стартовала работа ГИС ЭПД — государственная информационная система электронных перевозочных документов. Она обеспечивает обмен сведениями между всеми участниками перевозочного процесса. Оператором ГИС ЭПД стал Минтранс. Рассказываем об электронных документах по грузоперевозкам, как с ними работать и как их внедрять.

Электронные перевозочные документы станут обязательными. Когда и как с ними работать
НДС

☝️Как изменился порядок возмещения НДС в 2024 году

Налоговики разъяснили, что изменилось в упрощенном порядке возмещения НДС и какие компании потеряли право его применять.

Иллюстрация: Вера Ревина / Клерк.ру

💥 ФНС запретила требовать пояснения по отмененным КС

Налогоплательщики стали активно жаловаться в ФНС по поводу неправомерного направления требований дать пояснения в рамках камеральных проверок 6-НДФЛ.

Налоговая не установила Блиновской срок погашения недоимки

Следователи снимут арест с некоторого имущества Елены Блиновской, чтобы она смогла погасить долги перед бюджетом.

Маркетинг

Как видео оптимизирует затраты бизнеса. Реальные примеры

Задача владельца компании — сделать бизнес прибыльным и оптимизировать затраты на отдел продаж, маркетинг, рекламу.

Иллюстрация: создано с помощью ИИ OpenAI © Вера Ревина/Клерк.ру

Что нужно знать о допросах в налоговой

Кого могут вызвать на допрос в налоговой, какое наказание грозит за неявку, как проходит допрос свидетеля и способы обезопасить себя разбираем в статье.

Иллюстрация: cottonbro studio/pexels
Кадровый учет

Меняем режим работы в организации

Режим работы устанавливается руководством компании и утверждается в правилах трудового распорядка или прописывается в трудовых договорах. Изменить график работы без согласования с сотрудниками можно будет только если в компании происходят организационных и технологических изменений. Во всех остальных случаях изменения придется согласовывать с сотрудниками.

Иллюстрация: создано с помощью ИИ OpenAI © Вера Ревина/Клерк.ру

Интересные материалы

Бесплатно с Компенсации работникам

Как правильно платить компенсацию за использование личного авто: лимиты, что входит в компенсацию, облагается ли НДФЛ и взносами. Мини-курс

Разбираем в мини-курсе, как платить компенсацию за использование личного авто, облагается ли она НДФЛ и страховыми взносами и что компенсация включает.

Как правильно платить компенсацию за использование личного авто: лимиты, что входит в компенсацию, облагается ли НДФЛ и взносами. Мини-курс