EDIT: я обновил код примера и предоставил полную таблицу и просмотрел реализации для справки, но основной вопрос остается без изменений.
У меня довольно сложное представление в базе данных, к которой я пытаюсь выполнить запрос. Когда я пытаюсь получить набор строк из представления путем жесткого кодирования предложения 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
Я уверен, что функция окна - это проблема, но я фильтрую свой запрос на одно значение, которое оконная функция разделяет, поэтому я бы ожидал, что оптимизатор сначала будет фильтровать, а затем запустит функцию окна. Он делает это в жестко закодированном примере, но не в параметризованном примере. Ниже приведены два плана запросов. Верхний план хорош, а нижний план плох.