joe*_*c12 3 sql-server stored-procedures t-sql
我在网上读到,如果您在存储过程中使用局部变量而不是输入变量,那么存储过程就会被优化,就像使用提示“OPTIMIZE FOR UNKNOWN”一样。这到底是怎么发生的?另外,一般来说,什么是好的做法:直接使用输入变量还是创建局部变量并将输入变量分配给它们?
来自我的博客文章又一篇关于局部变量的文章
\n\n\n在存储过程中(甚至在即席查询或动态 SQL 中,如上面链接的示例中),如果您在该代码块中声明一个变量并稍后将其用作谓词,您将不会获得固定的值猜测基数,或者比使用直方图时信心不足的估计。
\n本文其余部分讨论的局部变量效果会产生与 OPTIMIZE FOR UNKNOWN 提示或使用 sp_prepare 执行查询相同的行为相同的行为。
\n该估计将基于表中的行数和\n\n\xe2\x80\x9c列的所有密度\xe2\x80\x9d 相乘,对于单个\n等式谓词。多个谓词的过程取决于您\xe2\x80\x99 使用的基数估计模型。
\n
您得到的猜测取决于您使用的谓词类型。
\n相等谓词将表基数乘以列选择性:
\n\n不等式谓词使用不同的表基数固定百分比,具体取决于您使用的基数估计模型。
\n\n