У меня есть хранимая процедура. Если я использую where (@detailId равно null или SalesOrderDetailID = @detailId), то используется некластеризованный индекс, но если я изменил предложение where на SalesOrderDetailID = @detailId, то будет использоваться индекс с кластером.почему вместо кластеризованного индекса используется некластеризованный индекс
Проверьте приведенную ниже процедуру. Первичный ключ - это комбинация столбцов - (SalesOrderID, SalesOrderDetail).
alter procedure samproc
@detailId int = null
with recompile
as
begin
select SalesOrderID
from sales.SalesOrderDetail
where (@detailId is null or SalesOrderDetailID = @detailId)
end
go
exec dbo.samproc @detailId = 1
Вопрос - почему кластеризованный индекс не используется, когда я использую или условие в предложении where. Мне нужно использовать или потому, что хотите пропустить где состояние, если параметр не passed.I также используется
where isnull(@detailId,SalesOrderDetailID)
но реальный сценарий-х у меня есть 10 параметров, и это может быть дорогостоящим, поскольку индекс столбцов внутри IsNull функции не будет и во-вторых isnull вызывает сканирование таблицы. Именно по этой причине я использовал
where (@detailId is null or SalesOrderDetailID = @detailId)
Может кто-нибудь сказать мне, как избежать некластеризованного индекса и использовать кластерный индекс.
Если вы чувствуете, что определенный индекс обеспечивает лучшую производительность, чем тот, который выбрал SQL Server, вы можете заставить его использовать этот индекс. –
'SalesOrderDetailID = isnull (@ detailId, SalesOrderDetailID)' IS SARGable "SQL Server не может использовать индексный указатель при применении функции к столбцу« – lad2025