Оптимизация планов выполнения для параметризованных запросов T-SQL, содержащих функции окна
РЕДАКТИРОВАТЬ: ЯМы обновили пример кода и предоставили полную таблицу и реализации представлений для справки, но существенный вопрос остается неизменным.
У меня довольно сложное представление в базе данных, которую я пытаюсь запросить. Когда я пытаюсь извлечь набор строк из представления путем жесткого кодирования предложения WHERE для конкретных значений внешнего ключа, представление выполняется очень быстро с оптимальным планом выполнения (индексы используются правильно и т. Д.)
SELECT *
FROM dbo.ViewOnBaseTable
WHERE ForeignKeyCol = 20
Однако, когда я пытаюсь добавить параметры в запрос, внезапно мой план выполнения разваливается. Когда я запускаю запрос ниже, яя получаю сканирование по индексу вместо поиска повсюду, а производительность запросов очень низкая.
DECLARE @ForeignKeyCol int = 20
SELECT *
FROM dbo.ViewOnBaseTable
WHERE ForeignKeyCol = @ForeignKeyCol
м с использованием SQL Server 2008 R2. Что здесь дает? Что это за использование параметров, которые вызывают неоптимальный план? Любая помощь будет принята с благодарностью.
Для справки, вот определения объектов, для которых яЯ получаю ошибку.
CREATE TABLE [dbo].[BaseTable]
(
[PrimaryKeyCol] [uniqueidentifier] PRIMARY KEY,
[ForeignKeyCol] [int] NULL,
[DataCol] [binary](1000) NOT NULL
)
CREATE NONCLUSTERED INDEX [IX_BaseTable_ForeignKeyCol] ON [dbo].[BaseTable]
(
[ForeignKeyCol] ASC
)
CREATE VIEW [dbo].[ViewOnBaseTable]
AS
SELECT
PrimaryKeyCol,
ForeignKeyCol,
DENSE_RANK() OVER (PARTITION BY ForeignKeyCol ORDER BY PrimaryKeyCol) AS ForeignKeyRank,
DataCol
FROM
dbo.BaseTable
Я уверен, что проблема с оконной функцией, но я фильтрую свой запрос по одному значению, по которому оконная функция разделяет, поэтому я ожидал, что оптимизатор сначала отфильтрует, а затем запустит оконную функцию. Это делается в жестко заданном примере, но не в параметризованном примере. Ниже приведены два плана запроса. Верхний план хорош, а нижний план плох.