表值参数由于表扫描而导致性能降低

Pau*_*aul 6 t-sql sql-server performance stored-procedures

我有一个将参数传递给SQL中的过程的应用程序。参数之一是表值参数,其中包含要包含在where子句中的项目。

因为当我将TVP连接到具有200万行的表时,表值参数没有附加统计信息,所以查询速度非常慢。

我有什么选择?

同样,目标是将某些值传递给将包含在where子句中的过程:

从table1中选择*,其中id在其中(从@mytvp中选择id)

要么

从table1 t1中选择*在t1.id = tvp.id上加入@mytpv tvp

KM.*_*KM. 1

尽管看起来需要对 table1 中的每一行运行一次查询,但 EXISTS 通常经过优化,比 JOIN 或 IN 更高效。所以,试试这个:

select * from table1 t where exists (select 1 from @mytvp p where t.id=p.id)
Run Code Online (Sandbox Code Playgroud)

另外,请确保 t.id 与 p.id 具有相同的数据类型,并且 t.id 有索引。