У меня есть таблица со следующими столбцами:
ItemCode VARCHAR
PriceA DECIMAL(10,4)
PriceB DECIMAL(10,4)
В таблице около 1000 строк.
Мое требование - проверить разницу (PriceA-PriceB) для каждой строки, а затем отображать 50 лучших товаров, которые имеют максимальную разницу в цене.
Есть два способа реализовать это
1) Поверьте, что расчет SQL несложный, простой и быстрый, поэтому я выполняю следующий запрос:
SELECT ItemCode, (PriceA - PriceB) AS PDiff FROM testtable ORDER BY PDiff DESC LIMIT 50
и во-вторых,
2) Добавьте еще один столбец (называемый PriceDiff), в котором будет храниться разница (PriceA-PriceB).
Однако их придется вставлять вручную, и для этого потребуется дополнительное пространство. Но он может просто запустить запрос выбора MAX(PriceDiff) для 50 лучших.
У меня вопрос - какой из вышеперечисленных методов лучше с точки зрения скорости и эффективности веб-приложения (отображение результатов на веб-сайте / в приложении)?
Я попытался сгенерировать время, затраченное на каждый запрос, но оба сообщают схожие цифры, поэтому не могу сделать никаких выводов.
Мы будем очень благодарны за любые объяснения экспертов или любую точную настройку кода.
Спасибо
СУХОЙ. Не повторяйся. То, что можно рассчитать, следует рассчитать. Нет необходимости дублировать информацию (изменение значений тоже может привести к ошибкам)
Обратите внимание, что вам нужно использовать ABS(PriceA - PriceB) в случае, если PriceB больше, чем PriceA.






В общем, для повышения производительности всегда нужно выбирать между памятью и временем. Результаты кэширования улучшают скорость, но требуют больше памяти. Вы можете уменьшить использование памяти, вычисляя данные на лету за счет производительности.
В вашем случае для хранения дополнительных 1000+ значений в БД требуется несколько дополнительных килобайт. Вычисление разницы на лету окажет незначительное влияние на производительность. Любой вариант - абсолютная ерунда для любой БД и сервера.
Я бы придерживался выполнения вычислений на лету, поскольку это менее сложно и поддерживает нормализацию db.
Большое спасибо @EriksKlotins (и другим) за ваш ценный вклад. Я выберу первый, учитывая все предоставленные обоснования.
Первый метод самый быстрый, но, как уже упоминалось, подвержен ошибкам.
Могу я предложить другое решение с использованием первичного ключа. Затем вы можете установить значение нового столбца, которое вы пытаетесь вычислить из веб-приложения.
Затем, если вы хотите узнать 50 лучших, вы можете использовать свой исходный метод поиска 50 лучших, используя второй метод, где вы должны выбрать из таблицы, в которой хранятся различия. Эти ссылки объясняют первичные ключи и способы их использования:
Используйте номер 1 вместо вычисляемого столбца.