Я работаю над написанием запроса, который бьет очень большую базу данных нашей компании, для того, чтобы тянуть назад максимальные суммы счетов (A и B, в данном примере) для клиентов. Мы хотим оттянуть максимальный A/B для каждого клиента за последний месяц и максимальный A/B за последний год.Oracle запрос выполняется очень медленно из-за большой набор данных, а отрицательных значениями
Один вопрос, который мы заметили, с нашей базой данных биллинговой путь он хранит «отмененные» счета. Это делается путем добавления второй, отрицательной версии первой платежной записи в таблицу фактурирования. Как так:
В этом случае 41040 был неправильный счет, поэтому был добавлен отрицательный вариант записи. Однако, когда я пытаюсь выбрать максимальное значение в этом столбце, я все равно вернусь 41040 вместо правильного выставленного счета 50. Эта таблица, похоже, не помещает эти неправильные счета каким-либо образом, что облегчит их отфильтровано.
Мое текущее решение было принять максимальное значение столбца ID, как правильный счет. Это делает предположение, что окончательный счет, который был введен в течение месяца, является правильным.
Это, видимо, возвращает правильные данные, но запрос выполняется невероятно медленно на большом наборе данных, и у меня нет доступа к этой таблице, чтобы добавлять или просматривать индексы. Всего насчитывается 98 007 807 строк и 1 596 491 уникальных клиентов. Нужно ли оптимизировать запрос для повышения производительности?
select mth.KY_CUSTOMER_NO,max(QY_MTH_BILLED_A) as QY_MTH_BILLED_A, max(QY_MTH_B) as QY_MTH_BILLING_B, max.MAX_BILLING_A, max.MAX_BILLING_B
from (
--Get the max A/B values for the past month
select m.*
from CUSTOMER_USAGE m
where rev_year = to_number(to_char(sysdate,'yyyy'))
and rev_mth in (to_number(to_char(add_months(sysdate, -1), 'mm')),to_number(to_char(sysdate,'mm')))
and ID in (select max(ID) from CUSTOMER_USAGE where KY_CUSTOMER_NO = m.KY_CUSTOMER_NO group by rev_mth, rev_year)
) mth join
(
--Get the max A/B values for the past year
select KY_CUSTOMER_NO, max(QY_MTH_B) as MAX_BILLING_B, max(QY_MTH_BILLED_A) as MAX_BILLING_A from CUSTOMER_USAGE m
where DT_ADDED > current_timestamp - 365 ID in (select max(ID) from CUSTOMER_USAGE where KY_CUSTOMER_NO = m.KY_CUSTOMER_NO group by rev_mth, rev_year)
group by KY_CUSTOMER_NO
) max on mth.KY_CUSTOMER_NO = max.KY_CUSTOMER_NO
group by mth.KY_CUSTOMER_NO, max.MAX_BILLING_KVA, max.MAX_BILLING_KW
Какие индексы существуют и каков текущий план запросов? –