У меня была задача получить определенные учетные записи и транзакции на основе нескольких правил. Стоит отметить, что счета и транзакции находятся в разных таблицах, и мой запрос возвращает в основном счета - пропорции составляют около 70 счетов на 1 транзакцию . Я хотел получить их в одном запросе для удобства - это этап в более крупном процессе.
Исходный запрос:
SELECT DISTINCT
CASE
WHEN (a.transaction_type IN ('500', '501', '502', '920') AND a.transaction_date >= '#DATE#' AND to_char(a.transaction_date,'HH24') >= 16) THEN 'Transaction time'
WHEN b.closing_date >= '#DATE#' THEN 'Closing time'
WHEN b.opening_date >= '#DATE#' THEN 'Opening time'
WHEN (b.type = 'X' AND b.active = 'NO') THEN 'Frozen account'
END AS "comment"
,b.branch
,b.basic
,b.lmt
FROM
VDS.transactions a
JOIN VDS.accounts b ON a.acct_no = b.acct_no
WHERE
(a.transaction_type IN ('500', '501', '502', '920')
AND a.transaction_date >= '#DATE#'
AND to_char(a.transaction_date,'HH24') >= 16)
OR
(b.closing_date >= '#DATE#'
OR b.opening_date >= '#DATE#'
OR (b.type = 'X' AND b.active = 'NO'))
Казалось, что работает нормально , хотя и несколько вяло - его время выполнения обычно составляло где-то около 12 с. Проблема в том, что иногда это вообще не заканчивается . Похоже, база данных полностью застряла в запросе. Поскольку я не являюсь администратором Oracle, я не могу подтвердить свое подозрение, что это ошибка этого запроса, но многочисленные тесты показывают, что это действительно так.
Итак, я подготовил другой вариант, учитывая, что транзакций намного меньше, чем счетов.
Вариант с подзапросом:
SELECT
'Transaction time' AS "comment"
,b.branch
,b.basic
,b.lmt
FROM
VDS.transactions a
JOIN VDS.accounts b ON a.acct_no = b.acct_no
WHERE
a.transaction_type IN ('500', '501', '502', '920')
AND a.transaction_date >= '#DATE#'
AND to_char(a.transaction_date,'HH24') >= 16
UNION
SELECT
CASE
WHEN closing_date >= '#DATE#' THEN 'Closing time'
WHEN opening_date >= '#DATE#' THEN 'Opening time'
WHEN (type = 'X' AND active = 'NO') THEN 'Frozen account'
END AS "comment"
,branch
,basic
,lmt
FROM
VDS.accounts
WHERE
closing_date >= '#DATE#'
OR opening_date >= '#DATE#'
OR (type = 'X' AND active = 'NO'))
И вот - время выполнения было сокращено до 3-5 с, а запрос нетбольше заблокированная база данных . Он также дал немного больше результатов, что странно, но не проблема.
Итак, мой последний вопрос: может ли кто-нибудь объяснить мне , что, возможно, происходило в кишечнике базы данных, что он с радостью принял вариант с подзапросом, в то время как получал ошибочный с исходным? Я могулучше понять производительность с помощью подзапроса, но я не знаю, почему запрос иногда работает, а иногда зависает целиком.