Есть ли разница между сохранением значений в виде числа с плавающей запятой или десятичной дробью и целым числом при извлечении записей в базе данных при использовании ORDERBY в операторе SELECT?
Есть ли разница в скорости сортировки по int и float?
Ответы (3)
Это зависит. Вы не указали СУБД, поэтому я могу говорить только с SQL Server, но типы данных имеют разные затраты на хранение, связанные с ними. Ints варьируются от 1 до 8 байтов, Десятичные знаки: 5-17 и числа с плавающей запятой составляют от 4 до 8 байтов.
РСУБД потребуется читать страницы данных с диска, чтобы найти ваши данные (в худшем случае), и они могут вместить только такое количество строк на странице данных размером 8 КБ. Итак, если у вас 17-байтовые десятичные дроби, вы получите 1/17 от количества строк, считываемых с диска за одно чтение, чем вы могли бы получить, если бы вы правильно рассчитали размер данных и использовали tinyint со стоимостью 1 байт для хранения X.
Эта стоимость хранения будет иметь каскадный эффект, когда вы перейдете к сортировке (упорядочению) данных. Он попытается выполнить сортировку в памяти, но если у вас есть миллиард строк и вам не хватает памяти, он может сбросить во временное хранилище для сортировки, и вы снова и снова платите эту стоимость.
Индексы могут помочь, поскольку данные могут храниться в отсортированном виде, но опять же, если получение этих данных в памяти может быть не таким эффективным для типов данных с избыточным весом.
[редактировать]
@Bohemian делает тонкое замечание об эффективности ЦП при сравнении целочисленных значений и чисел с плавающей запятой, но на сервере базы данных загрузка ЦП происходит на удивление редко. Скорее всего, вы будете ограничены подсистемой ввода-вывода диска и памятью, поэтому мой ответ фокусируется на разнице в скорости между получением этих данных в движке, чтобы он выполнял операцию сортировки, по сравнению со стоимостью сравнения ЦП.
(Отредактировано) Поскольку как int, так и float занимают точно такое же пространство на диске и, конечно же, в памяти - т.е. 32 бита - единственная разница заключается в том, как они выглядят обработано.
int
должен быть быстрее сортировать, чем float
, потому что сравнение проще: процессоры могут сравнивать целые числа за один машинный цикл, но биты с плавающей запятой должны быть «интерпретированы», чтобы получить значение перед сравнением (не уверен, сколько циклов, но, вероятно, больше чем один, хотя некоторые процессоры могут иметь специальную поддержку для сравнения с плавающей запятой).
В общем, выбор типов данных должен определяться тем, подходит ли тип данных для хранения значений, которые необходимо сохранить. Если данный тип данных неадекватен, не имеет значения, насколько он эффективен.
С точки зрения дискового ввода-вывода разница в скорости второго порядка. Не беспокойтесь об эффектах второго порядка, пока ваш проект не будет хорош в отношении эффектов первого порядка.
Правильный дизайн индекса приведет к значительному сокращению задержек, когда запрос может быть получен в отсортированном порядке с самого начала. Однако ускорение этого запроса выполняется за счет замедления других процессов, например процессов, которые изменяют индексированные данные. Компромисс должен быть рассмотрен, чтобы увидеть, стоит ли оно того.
Короче говоря, беспокойтесь о вещах, которые могут удвоить ваш дисковый ввод-вывод или хуже, прежде чем беспокоиться о вещах, которые собираются добавить 10% к вашему диску ввода-вывода.