Я работаю над API, который выполняет агрегацию данных и возвращает результат. После возврата результата я использую Java-код для окончательной настройки данных перед отправкой их в качестве ответа.
Весь этот процесс занимает около 12 секунд strong>, если я получу данные за один месяц. Если я выберу данные за 6 месяцев, это займет навсегда и никогда не ответит мне.
Изначально я использовал JPA, но затем я переключился на собственный подход к запросам, который немного сократил время, но 12 секунд на 30 дней обработки данных по-прежнему слишком много. Я хочу сократить время, которое это занимает.
Я придумал две вещи
- Кэширование >
- Индексирование базы данных
Мне нужно некоторое руководство по стратегии кэширования и по сокращению времени ответа API.
Ниже моего SQL-запроса:
Код: Выделить всё
WITH DateRange AS (
SELECT DATEADD(DAY, n, :fromDate) AS date
FROM (
SELECT TOP (DATEDIFF(DAY, :fromDate, :toDate) + 1)
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1 AS n
FROM sys.columns
) AS Numbers
)
SELECT
FORMAT(d.date, 'MM/dd/yyyy') AS label,
ISNULL(SUM(abc.data1), 0) AS data1,
ISNULL(SUM(abc.data2), 0) AS data2,
ISNULL(SUM(abc.data3), 0) AS data3
FROM
DateRange d
LEFT JOIN ABC abc ON
CAST(abc.date AS DATE) = d.date
WHERE filtering1
AND filtering2
AND d.date >= :fromDate
AND d.date {
dateLabels.add((String) result[0]);
data1.add(((Number) result[1]).intValue());
data2.add(((Number) result[2]).intValue());
data3.add(((Number) result[3]).intValue());
});
- Почему я использую этот тип запроса?
Я хочу чтобы отобразить данные как 0, если для этой конкретной даты данные отсутствуют.
[/list]
[*]Как можно Я улучшаю этот запрос.
[*]Как сделать API быстрее.
[*]Как правильно обрабатывать проецирование данных.
Мне нужны данные в порядке возрастания метки даты.
Буду признателен за любую помощь в этом.
Подробнее здесь: https://stackoverflow.com/questions/791 ... to-respond
Мобильная версия