当前位置: 首页 > 面试题库 >

SQL优化:Xml或定界字符串

贾飞章
2023-03-14
问题内容

希望这只是一个简单的问题,涉及到Sql 2008中的查询时的性能优化。

我曾为在其ETL流程以及一些网站中经常使用Stored
Procs的公司工作。我已经看到了他们需要基于一组有限的键值来检索特定记录的情况。我已经看到它以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是一个坏主意,但我的好奇心来自最后两个示例。是像在代码片段3中那样,在我的代码中进行尽职调查以通过XML传递此类列表,还是更熟练?还是只是划定值并使用udf来处理它,会更好吗?


问题答案:

现在有第四个选项-表值参数,您实际上可以将值表作为参数传递到sproc中,然后像通常使用表变量一样使用它。与XML(或CSV解析方法)相比,我更喜欢这种方法。

我无法引用所有不同方法之间的性能数据,但这是我要尝试的方法-我建议对它们进行一些实际的性能测试。

编辑:
关于TVP的更多信息。为了将值传递到您的存储过程中,您只需定义一个SqlParameter(SqlDbType.Structured)-可以将其值设置为任何IEnumerable,DataTable或DbDataReader源。因此,假设您已经在某种形式的列表/数组中拥有值列表-
您无需执行任何操作即可将其转换为XML或CSV。

我认为这也使存储过程更加清晰,简单和可维护,为实现最终结果提供了更自然的方式。要点之一是,SQL在基于集合的/非循环的/非字符串操纵的活动中表现最佳。

这并不是说它会在传入大量值的情况下发挥出色的性能。但是,使用较小的值集(最大〜1000)应该没问题。



 类似资料:
  • 本文向大家介绍SQL字段拆分优化,包括了SQL字段拆分优化的使用技巧和注意事项,需要的朋友参考一下 今天看到一条用函数处理连接的SQL,是群里某位网友的,SQL语句如下: 语句不算复杂,只是执行比较慢,下面是关于这SQL语句的一些信息: --1.SQL执行203条数据 --2.耗时12秒 --3.so_order表的fid字段是字符串集合, --由1-2个字符串组成,用','分隔   通过分析执行

  • 我需要解析“txf”格式的数据文件。这些文件可能包含 1000 多个条目。由于格式像JSON一样定义得很好,我想做一个像JSON这样的通用解析器,它可以序列化和解串化txf文件。 与JSON相反,标记没有办法识别对象或数组。如果一个带有相同标签的条目出现,我们需要把它看作一个数组。 标记对象的开始。 标记对象的成员 标记对象的结尾 下面是一个示例“txf”文件 我能够使用NSScanner创建通用

  • 问题内容: 说我有以下字符串: 我想将其拆分为句子,以便获得以下列表: 如您所见,我想在所有出现的字符串上拆分字符串,而不是在或的任何出现上进行拆分。在这种情况下,Python将无法正常工作,因为它将字符串的每个字符都视为一个单独的定界符,而不是将整个字符串视为一个多字符定界符。有解决此问题的简单方法吗? 问题答案: 为我工作

  • 问题内容: 因此,最近我一直在制作python脚本,用于从大型文本文件(> 1 GB)中提取数据。问题基本上可以归结为从文件中选择文本行,然后从某个数组中搜索字符串以查找字符串(此数组中可以包含多达1000个字符串)。这里的问题是我必须找到该字符串的特定出现,并且该字符串在该文件中可能出现无数次。同样,需要一些解码和编码,这另外会降低脚本速度。代码看起来像这样: 我的问题是:有没有办法对此进行优化

  • 18.6. 优化字符串操作 Soundex 算法的最后一步是对短结果补零和截短长结果。最佳的做法是什么? 这是目前在 soundex/stage2/soundex2c.py 中的做法: digits3 = re.sub('9', '', digits2) while len(digits3) < 4: digits3 += "0" return digit

  • 主要内容:1.join 基本语法,2.inner join,3.left join,4.right join,5.full join,6.针对 join 语句该如何建立索引、如何选择驱动表,7.Index Nested-Loop Join,8.Simple Nested-Loop Join,9.Block Nested-Loop Join,10总结1.join 基本语法 inner join:内连接(等值连接) left join:左连接 right join:右连接 2.inner join