希望这只是一个简单的问题,涉及 Sql 2008 中的查询时的性能优化。
我曾在一些公司工作过,这些公司在 ETL 流程以及一些网站中大量使用存储过程。我见过这样的场景:他们需要根据一组有限的键值检索特定记录。我已经看到它以 3 种不同的方式处理,通过下面的伪代码进行说明。
连接字符串并执行它的动态 Sql。
EXEC('SELECT * FROM TableX WHERE xId IN (' + @Parameter + ')'
使用用户定义的函数将分隔字符串拆分到表中
SELECT * FROM TableY INNER JOIN SPLIT(@Parameter) ON yID = splitId
使用 XML 作为参数而不是分隔的 varchar 值
SELECT * FROM TableZ JOIN @Parameter.Nodes(xpath) AS x (y) ON ...
虽然我知道由于多种原因在第一个片段中创建动态 sql 是一个坏主意,但我的好奇心来自最后两个示例。在我的代码中进行尽职调查以通过 XML 传递此类列表(如代码片段 3 所示)是否更熟练,或者仅分隔值并使用 udf 来处理它更好?
现在有第四个选择 -表值参数 http://msdn.microsoft.com/en-us/library/bb510489.aspx,实际上您可以将值表作为参数传递给存储过程,然后像通常使用表变量一样使用它。我更喜欢这种方法而不是 XML(或 CSV 解析方法)
我无法引用所有不同方法之间的性能数据,但这是我会尝试的一种方法 - 我建议对它们进行一些实际的性能测试。
Edit:
关于 TVP 的更多内容。为了将值传递到存储过程中,您只需定义一个 SqlParameter (SqlDbType.Structured) - 其值可以设置为任何 IEnumerable、DataTable 或 DbDataReader 源。因此,大概您已经在某种列表/数组中拥有了值列表 - 您无需执行任何操作即可将其转换为 XML 或 CSV。
我认为这也使得存储过程更清晰、更简单、更可维护,提供了一种更自然的方式来实现最终结果。要点之一是 SQL 在基于集合/非循环/非字符串操作活动中表现最佳。
这并不是说它在传入大量值时会表现出色。但是对于较小的值集(最多约 1000),它应该没问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)