Я не сталкивался с такой проблемой раньше, но у меня есть некоторые теории о лучшей скорости .
Когда система сохраняет данные в виде 40-байтовых символов и на них есть индекс, индекс будет настолько коротким, насколько этого хватит, чтобы различить точно запись данных. Например:
0101101.... => 010(3-byte index)
0111111.... => 011(3-byte index)
Иными словами, когда система сохраняет данные в виде 8-байтового (Int64) целого числа и в нем есть индекс, индекс должен составлять ровно 8 байт на запись.
В общей теории баз данных, чем меньше используется памяти, тем выше производительность запросов .
Если ваших данных достаточно для того, чтобы базе данных понадобилось все символы (40-байтовые символы) для индексации записи, размер индекса в некоторых записях будет 40-байтовым.
И 8-байтовый целочисленный индекс, как объяснено, все еще остается в 8 байтах, однако данные растут.
В приведенной выше теории есть предварительное условие: сопоставляемые данные должны занимать лишь небольшую часть от всех.
Существует важный фактор, который необходимо учитывать при работе с индексами: вам нужно 20 индексов (логически), чтобы ускорить стратегию 20 Int32. Действительно, для стратегии из 80 символов и для отдельной стратегии Int64 необходим только один индекс.
Давайте объясним, если индекс не работает, что означает, что система баз данных выполняет запрос, используя стратегию полного сканирования таблиц (FTS).
Мы предполагаем, что 40-байтовые (символьные) данные сохраняются как 40 байт на запись, каждая страница в SQL Server может содержать 8 КБ * 1024/40 = 204 записи.
Для 8-байтовых (Int64) данных с 8 байтами на запись каждая страница в SQL Server может содержать 8K * 1024/8 = 1024 записи.
Если у вас есть 20000 записей, базе данных необходимо 20000/204 = 99 операций ввода-вывода для выполнения FTS и 20000/1024 = 20 операций ввода-вывода для другой.
Чем меньше требуется ввода-вывода, тем выше производительность.