#mysql #sql-server #oracle #teradata
#mysql #sql-сервер #Oracle #teradata
Вопрос:
Я должен выполнить некоторую логику, основанную на следующей реализации.
У меня есть большое число до 36 цифр, например 913695089923267549815145223638290430 (случайно сгенерированное другим приложением). Мне нужно разделить его на любое число меньшей длины, скажем, 70368844197664; (случайным образом генерируется другим приложением) Предположим, я получаю частное как 19956694.3256
Для моего кода важна только последняя цифра частного перед десятичной (т.е. 4). Цель состоит в том, чтобы проверить, является ли частное четным или нечетным, и, если возможно, значение последней цифры тоже.
Я не могу использовать простые функции БД, такие как модуль или деление, поскольку это отнимает очень много времени. Есть ли какой-нибудь более быстрый и эффективный способ? Любые предложения будут высоко оценены.
Большое вам спасибо.
С уважением, Neeraj
Комментарии:
1. Итак, учитывая 128-битные
unsigned int m
и 64-битныеunsigned int n
, вы хотите вычислить(m / n) % 10
. Это верно? Это странное требование! Это говорит о том, что что-то требует редизайна. Для чего вам это нужно?2. @TonyK: Я не могу изменить требование, но оно есть. Проблема скорее математическая, чем программная. Но я испытываю свою удачу
3. Вам это нужно в запросе или в функции / процедуре?
4. мне это было нужно в коде, но мы перенесли это в sql-запрос и изменили некоторую логику проектирования, чтобы у нас это работало.
Ответ №1:
То, что вы хотите сделать, в значительной степени соответствует определению «арифметики по модулю». Если встроенная арифметика в вашей базе данных не может выполнить вычисления достаточно быстро, я не уверен, что вы могли бы сделать, чтобы улучшить это, за исключением написания собственного движка базы данных или покупки более мощного оборудования.
Проблема действительно в скорости арифметики, или это извлечение записи или индексация? Я имею в виду, если вы говорите что-то вроде:
select ... whatever ... from table1 join table2 using (someid)
where (table1.q / table2.d) % 10 = 4
и у вас нет индекса для функции (table1.q / table2.d) % 10, это потребовало бы, чтобы база данных прочитала каждую запись, выполнила вычисление, а затем выбрала те, которые дают правильный ответ. Возможно, ваша проблема не в арифметике, а в индексации.