В отсутствие указанного индекса SQL Server будет сканировать всю таблицу каждый раз, когда вы просматриваете значение. Так, например, если вы запустили следующее ....
SELECT * FROM #Tally WHERE N = 858;
SQL Server будет сканировать всю таблицу, чтобы получить эту одну запись, что не очень эффективно. Допустим, у вас было 30 процессов, выполняющих запросы просто так. В конечном итоге вы столкнетесь со всевозможными проблемами с блокировкой.
Если вы добавите указанный индекс, тот же запрос найдет N без сканирования всей таблицы и выдаст результат. Поиск в таблице будет эффективным, а созданная вами схема будет поддерживать больший параллелизм.
Теперь для предоставленного вами запроса ...
select dateadd(day, t.N - 1, @tmpDate)
from #Tally t
where t.N - 1 <= DATEDIFF(day, @tmpDate, @endDate)
SQL Server, скорее всего, все равно будет просто сканировать таблицу. Таким образом, наличие кластерного индекса на самом деле не дает вам тонны отдачи в этом случае.
У вас есть сеансовая таблица (#Tally) с одной записью на каждый день и 30-летним количеством дней. Запрос отбирает назад ... 30-летний срок. Поскольку в этом случае SQL Server должен выполнить полное сканирование, чтобы получить данные для каждой записи, я не вижу добавления индекса, дающего вам большую выгоду. Не со схемой и запросом из вашего примера.
Столбец N - хороший естественный ключ. Я не уверен, что было бы больно добавлять его, но я не думаю, что вы потеряете что-нибудь, если не сделаете. Однако, если вы начнете запрашивать подмножество значений из таблицы (а я не имею в виду весь набор записей минус один или два), кластерный индекс наверняка добавит преимущества.
Указатели состоят из страниц. Страницы могут хранить определенное количество данных. Как правило, вы хотите упаковать как можно больше данных на каждой странице. Таким образом, SQL Server не нужно сканировать слишком много страниц, чтобы найти ваши данные. Думайте о каждой странице как о ящике. Если бы в ящике было 1 предмет, для хранения 500 предметов понадобилось бы 500 ящиков. Если вы хотите найти 20 предметов, вам нужно открыть 20 ящиков. Если бы в каждом выдвижном ящике было по 100 предметов, вам нужно было бы открыть максимум 5 ящиков и хотя бы 1 ящик. Сказать FILLFACTOR equals 100
означает, что вы не оставляете места на странице (ящик); Вы наполняете это полностью. Для полей, в которых данные увеличиваются, использование коэффициента заполнения 100 является общей практикой, поскольку вы никогда не добавляете данные в середину индекса, а просто добавляете их в конец. Таким образом, вам не нужно места на существующих страницах вашего индекса для новых данных.