gpt4 book ai didi

sql-server-2008 - 表值参数的参数嗅探

转载 作者:行者123 更新时间:2023-12-04 07:15:05 24 4
gpt4 key购买 nike

我相当肯定将参数嗅探添加到表值参数几乎没有值(value),但是我想知道是否有人可以确认这一点?

(INT_LIST 是用户定义的表类型,它是 INT 类型的单列)

CREATE PROCEDURE [dbo].[TVPSniffTest](
@param1 varchar(50),
@idList INT_LIST readonly
)
AS
BEGIN
DECLARE @param1_sniff VARCHAR(50) = @param1 --this is worth doing

DECLARE @idList_sniff INT_LIST
INSERT INTO @idList_sniff SELECT value FROM @idList --will this help?

--query code here
END

最佳答案

正如 Jeroen 已经提到的,TVP 没有参数嗅探问题。而且,缓解缺乏统计数据的一种选择是将 TVP 复制到本地临时表(它确实维护统计数据)。

但是,有时更有效的另一种选择是对使用表变量(即 TVP)的任何查询进行语句级重新编译。统计信息不会跨查询维护,因此需要在涉及表变量的任何查询上完成,而不是像简单的 SELECT 那样。

下面说明了这种行为:

DECLARE @TableVariable TABLE (Col1 INT NOT NULL);

INSERT INTO @TableVariable (Col1)
SELECT so.[object_id]
FROM [master].[sys].[objects] so;

-- Control-M to turn on "Include Actual Execution Plan".
-- For each of the 3 following queries, hover over the "Table Scan"
-- operator to see the "Estimated Number of Rows".

SELECT * FROM @TableVariable; -- Estimated Number of Rows = 1 (incorrect)

SELECT * FROM @TableVariable
OPTION (RECOMPILE); -- Estimated Number of Rows = 91 (correct)

SELECT * FROM @TableVariable; -- Estimated Number of Rows = 1 (back to incorrect)

关于sql-server-2008 - 表值参数的参数嗅探,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28695033/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com