Рассмотрим, что такое индекс в SQL - и индекс действительно является фрагментом памяти, указывающим на другие фрагменты памяти (то есть указатели на строки). Индекс разбит на страницы, так что его части можно загружать и выгружать из памяти в зависимости от использования.
Когда вы запрашиваете набор строк, SQL использует индекс для поиска строк быстрее, чем сканирование таблицы (просмотр каждой строки).
SQL имеет кластеризованные и некластеризованные индексы. Мое понимание кластерных индексов состоит в том, что они группируют одинаковые значения индексов на одной странице. Таким образом, когда вы запрашиваете все строки, соответствующие значению индекса, SQL может возвращать эти строки из кластеризованной страницы памяти. Вот почему попытка кластеризовать индекс столбца GUID - плохая идея - вы не пытаетесь кластеризовать случайные значения.
Когда вы индексируете целочисленный столбец, индекс SQL содержит набор строк для каждого значения индекса. Если у вас диапазон от 1 до 10, то у вас будет 10 указателей индекса. В зависимости от количества строк это может быть разбито на страницы по-разному. Если ваш запрос ищет индекс, соответствующий «1», а затем, где Name содержит «Fred» (при условии, что столбец «Name» не проиндексирован), SQL очень быстро получает набор строк, соответствующих «1», затем таблица сканирует, чтобы найти остальные.
Итак, что в действительности делает SQL - это пытается уменьшить рабочий набор (количество строк), который он должен перебирать.
Когда вы индексируете битовое поле (или некоторый узкий диапазон), вы только уменьшаете рабочий набор на количество строк, соответствующих этому значению. Если у вас есть небольшое количество соответствующих строк, это значительно уменьшит ваш рабочий набор. Для большого числа строк с распределением 50/50 это может принести вам очень небольшой прирост производительности по сравнению с поддержанием индекса в актуальном состоянии.
Причина, по которой все говорят о тестировании, заключается в том, что SQL содержит очень умный и сложный оптимизатор, который может игнорировать индекс, если он решит, что сканирование таблицы выполняется быстрее, или может использовать сортировку, или может организовать страницы памяти, как ему чертовски нравится.