У нас есть продукт, поддерживаемый БД (в настоящее время Oracle, планирующий поддержку MS SQL Server) с несколькими десятками таблиц. Для простоты возьмем одну таблицу под названием TASK.Вычисление счетов по нескольким столбцам в DB
У нас есть прецедент, когда нам нужно представить пользователю количество задач, имеющих конкретные критерии. Например, предположим, что среди многих столбцов таблицы задача, есть 3 колонки, подходящие для этого случая использования:
- возможные значения приоритетами LOW, средняя, высокая
- ВЛАДЕЛЕЦ - возможные значения зарегистрированных пользователей в система (может быть 10s)
- СТАТУС возможные значения IDLE, IN_PROCESS, СДЕЛАНО
Таким образом, мы хотим показать пользователю, сколько именно задачи LOW, MEDIUM, HIGH, как многие из них принадлежат некоторые конкретный пользователь и сколько из них относятся к различным статусам. Разумеется, основная реализация заключалась бы в том, чтобы поддерживать эти подсчеты в актуальном состоянии при каждой модификации таблицы TASK. Однако то, что усложняет вопрос, заключается в том, что пользователь может дополнительно фильтровать результат по некоторым критериям, которые могут включать (или не) часть столбцов, упомянутых выше.
Например, использование может хотеть видеть эти подсчеты только для задач, которые принадлежат ему и были созданы в прошлом месяце. Количество возможных комбинаций фильтров здесь бесконечно, поэтому бессмысленно утверждать, что поддержание современных показателей невозможно.
Итак, вопрос в том, как решить эту проблему без серьезного влияния на производительность БД? Может ли это быть разрешено исключительно по БД, или мы должны прибегать к использованию других хранилищ данных, таких как редкий хранилище данных? Это похоже на проблему, которая присутствует во многих компаниях. Например, в магазине Amazon вы можете видеть подсчеты по категориям, используя критерии произвольного текстового поиска, а это значит, что они также рассчитывают его на месте, а не постоянно обновляют его.
Последнее: мы можем принять определенное функциональное ограничение, заявив, что счет должен быть точным до 100, но начиная с 100 он может просто сказать «более 100 задач». Возможно, это смягчение может позволить нам генерировать более эффективные SQL-запросы.
Спасибо!
спасибо Макс. Это, конечно, наивный подход, который мы уже тестировали. Проблема в том, что выполнение этого ужасно.Для завершения такого запроса требуется не только значительное время, это, конечно, влияет на других пользователей, которые выполняют другие простые запросы по БД. Поэтому я искал творческие подходы к решению этой проблемы, которые каким-то образом распределяли бы эту нагрузку в более унифицированном виде во времени. – Stas