我有一些带有一些IN
子句的 sql 查询。为了改进查询计划缓存,我决定使用表值参数。这是示例WHERE ID IN (SELECT ID FROM @P1)
。@P1 是以下类型的变量:
CREATE TYPE [dbo].[Ids] AS TABLE(
[ID] [int] NOT NULL,
PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (IGNORE_DUP_KEY = OFF)
)
但我注意到一些查询变得更慢。这是查询示例:
select * from SomeTable s where ((s.SomeForeignId in (select id from @p1)) or s.SomeForeignId is null)
在我的数据库上执行 2.1 秒。
和旧查询:
select * from SomeTable s where ((s.SomeForeignId in (1,2,3.....)) or s.SomeForeignId is null)
在 1.8 秒内执行。
我注意到查询计划的差异。第一个查询的计划由两部分组成(一个用于空检查,一个用于 in 子句),然后是连接。而第二个计划只是索引搜索。
有什么方法可以改进我的参数化查询以更快地执行?
PS 这只是示例提炼查询,我想知道这in (select id from @p1)
部分是否有任何不正确之处。