Самый быстрый способ найти частное путем деления двух чисел

#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, это потребовало бы, чтобы база данных прочитала каждую запись, выполнила вычисление, а затем выбрала те, которые дают правильный ответ. Возможно, ваша проблема не в арифметике, а в индексации.