У меня есть определенное представление, которое перечисляет транзакции вместе с промежуточной суммой, что-то вроде
CREATE VIEW historyView AS
SELECT
a.createdDate,
a.value,
m.memberId,
SUM(a.value) OVER (ORDER BY a.createdDate) as runningTotal,
...many more columns...
FROM allocations a
JOIN member m ON m.id = a.memberId
JOIN ...many joins...
В самых больших таблицах, на которые смотрит этот запрос, ~ 10 миллионов строк, но в среднем, когда представление являетсязапросит только несколько десятков строк.
Моя проблема в том, что когда этот оператор SELECT
запускается непосредственно для данного члена, он выполняется очень быстро и возвращает результаты в течение нескольких миллисекунд.Однако, когда запрашивается как представление ...
SELECT h.createdDate, h.value, h.runningTotal
FROM historyView h
WHERE member.username = 'blah@blah.com'
... производительность ужасна.Два плана запроса очень разные - в первом случае он в значительной степени идеален, но во втором случае загружается множество сканов и считываются сотни тысяч / миллионы строк.Это очевидно, потому что фильтр на элементе запускается последним после того, как все остальное было сделано, а не сразу при запуске.
Если я удалю предложение SUM(x) OVER (ORDER BY y)
, эта проблема исчезнет.
Могу ли я что-нибудь сделать, чтобы предложение SUM(x) OVER (ORDER BY y)
не нарушило план запроса?