Допустим, у вас есть представление:
CREATE VIEW dbo.v_SomeJoinedTables AS
SELECT
a.date,
a.Col1,
b.Col2,
DENSE_RANK()
OVER(PARTITION BY a.date, a.Col2 ORDER BY a.Col3) as Something
FROM a JOIN b on a.date = b.date
Я обнаружил, что производительность:
SELECT *
FROM v_SomeJoinedTables
WHERE date > '2011-01-01'
намного хуже, чем
SELECT *,
DENSE_RANK()
OVER(PARTITION BY a.date, a.Col2 ORDER BY a.Col3) as Something
FROM a JOIN b ON a.date = b.date
WHERE a.date > '2011-01-01'
Я очень удивлен, что план запроса для этих двух операторов не одинаков.
Я также пытался использовать встроенную табличную функцию, но запрос по-прежнему занимает в 100-1000 раз больше времени, чем код, в который я копирую и вставляю логику представления.
Есть идеи?