我有一个SProc,它具有dbo.SectionIn
类型的表值参数@section
。这个参数在整个SProc中都在使用,我想从中删除一些记录,但它当然是只读的。
The table-valued parameter "@sections" is READONLY and cannot be modified.
我的计划是将其内容复制到表变量中,然后使用它。
DECLARE @sectionDups as dbo.SectionIn
INSERT INTO @sectionDups
SELECT *
FROM @sections
我的问题是,这会对查询计划的性能造成影响吗?如果不会,ReadOnly要求背后的原因是什么?
由于复制表,性能会受到影响,param表中的行越多,对性能的影响就越大,但如果它对sp 的总运行量可以忽略不计
AFAIK只读tvp的唯一原因是-因为它是sql server中非常新的功能,读写仍在构建中,所以-请耐心等待
不应将TVP表变量复制到新的表变量中。如果要排除行,请执行以下操作之一:
-
使用
WHERE
子句过滤掉不需要的行。或
-
创建一个本地临时表(单个
#
),并将TVP数据复制到其中。尽管这样做似乎需要使用WHERE子句,所以这在之外没有太多价值- 与表变量相比,临时表的统计信息更好(但使用语句级
OPTION (RECOMPILE)
可以解决这个问题) - 添加列的能力
- 修改TVP中已有值的能力
- 与表变量相比,临时表的统计信息更好(但使用语句级