回答

收藏

SQL优化:Xml或定界字符串

技术问答 技术问答 244 人阅读 | 0 人回复 | 2023-09-14

希望这只是一个简单的问题,涉及到Sql 2008年查询性能优化。
" N5 i/ j  O7 x- o我曾为在其ETL流程和一些网站经常使用Stored8 R& i0 s' m4 }1 v$ n: @
Procs公司工作。我看到他们需要根据一组有限的键值检索特定的记录。我看到它以三种不同的方式处理,下面的伪代码解释了这一点。
' L! i& x! m8 _4 Z. t动态SQL,它包含一个字符串并执行它。/ H8 T2 w) p8 _4 s) |: u
EXEC('SELECT * FROM TableX WHERE xId IN  @Parameter  用户定义的函数将定义字符串分成表9 [/ O6 M3 E/ m# @8 d  g/ y2 L
SELECT * FROM TableY INNER JOIN SPLIT(@Parameter) ON yID = splitId使用XML作为参数而不是带分隔符的参数varchar值1 b% c8 D1 a3 C! ~5 a& f3 S# j  d2 ?
SELECT * FROM TableZ JOIN @Parameter.Nodes(xpath) AS x (y) ON ...尽管出于许多原因,我知道在第一代码段创建动态sql这是一个坏主意,但我的好奇心来自最后两个例子。在我的代码中进行尽职调查,就像在代码片段3中一样XML传递此类列表,还是更熟练?还是只是划定值并使用udf处理它会更好吗?/ N! g* b; p/ L' B3 e+ }5 `
                                                               
; ]: Z$ A( f) c/ m8 h/ X    解决方案:                                                               
1 ^& \* t0 i9 L" z, D% L* d                                                                现在有第四个选项-您实际上可以将值表作为参数传递给表值参数sproc中间,然后像通常使用表变量一样使用。XML(或CSV相比之下,我更喜欢这种方法。
$ i' g6 H1 v7 n* z8 [0 c% c我不能引用所有不同方法之间的性能数据,但这是我想尝试的方法-我建议对它们进行一些实际的性能测试。* C& U; L$ g+ Q) b0 j1 n/ n
编辑:
: t1 w% L0 T& k, D2 w2 r关于TVP更多信息。为了将值传输到您的存储过程中,您只需定义一个SqlParameter(SqlDbType.Structured)-它可以设置为任何值IEnumerable,DataTable或DbDataReader来源。因此,假设在某种形式的列表/数组中拥有值列表-
6 H7 }! S6 j+ I5 c, ~无需执行任何操作即可将其转换为XML或CSV。! c& V# @4 L* C9 d8 r; G
我认为这也使存储过程更加清晰、简单和可维护,为实现最终结果提供了更自然的方法。重点之一是,SQL在基于集合/非循环/非字符串操作的活动中表现最好。0 g( _  u8 T7 a: x1 S( F
这并不意味着它会在引入大量值时发挥出色的性能。但是,使用较小的值集(最大值1000)应该没问题。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则