AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 344921
Accepted
lifeisajourney
lifeisajourney
Asked: 2025-01-25 16:29:31 +0800 CST2025-01-25 16:29:31 +0800 CST 2025-01-25 16:29:31 +0800 CST

在 SQL Server 中 TVP、JSON 和 XML 作为输入参数

  • 772

我发现使用 TVP 将多个值传递给存储过程更加容易和快捷,尤其是在处理几列和几百行时,因为它消除了额外数据解析的需要。为什么有人会选择 XML 或 JSON 而不是 TVP?在哪些用例中它们提供更好的性能或优势?如果有机会,你会在这三者之间选择哪一个?谢谢!

sql-server
  • 2 2 个回答
  • 725 Views

2 个回答

  • Voted
  1. Best Answer
    Erik Reasonable Rates Darling
    2025-01-25T23:44:25+08:002025-01-25T23:44:25+08:00

    为什么有人选择 XML 或 JSON 而不是 TVP?

    仅当由于某些框架限制而无法使用表值参数(TVP)时。

    从性能角度来看,传递 JSON 或 XML 的问题在于,大多数人会编写(或复制/粘贴)一些糟糕的字符串拆分函数,并将其与查询中的拆分字符串关联起来。使用 SQL Server 的原生STRING_SPLIT函数时,问题仍然存在。

    SQL Server 的优化器无法分析这些字符串的内容,即使内容被拆分,除非您先将它们放入 #temp 表中。请记住,即使已建立索引,也不会为 @table 变量生成统计信息。

    EF Core 团队曾尝试使用 JSON 代替 IN 子句,但实际结果却是一场性能灾难。他们早就收到了警告,但还是坚持这么做。我建议对这种失职行为判处监禁。

    但回过头来看,TVP 由 @table 变量支持,而 @table 变量在 SQL Server 中存在问题。即使采用各种方案来获取表级基数(表中有多少行),缺乏有关列中数据的统计信息通常会导致性能问题。

    您通常会发现自己将 TVP 的内容转储到 #temp 表中,因为它们往往会带来更好的计划选择。

    • 13
  2. Steve
    2025-01-25T18:21:15+08:002025-01-25T18:21:15+08:00

    我想不出 JSON 和 XML 之间有什么特别相关的区别。因此,这实际上是 TVP 与结构化字符串数据(在答案的其余部分,我将仅使用 JSON 来表示它们中的任何一个,或任何其他结构化字符串数据协议)。

    TVP 的真正问题在于其缺乏灵活性和不通用性。

    它们要求将用户定义的表类型与过程的标题分开声明 - 这使得过程调用者查找形状成为障碍,并且使过程制定者改变形状成为障碍(这需要撤回过程,改变表类型,然后恢复过程)。

    它们是仅限输入的,因此使用 JSON 的技术必须保留用于输出参数(反过来,这些有时是必需的,因为您不能嵌套插入执行)。

    当从客户端语言(即 TSQL 之外)调用过程时,它们往往更难使用。

    通常,这些看似尴尬的功能(如 TVP)涵盖了一些不寻常的情况,因此,我发现 TVP 在数据量非常大的情况下比 JSON 表现更好并不奇怪。我可能首先倾向于使用临时表,但随后你可能会失去可重入性。

    但是对于“几列和几百行”,现在我会首先尝试 JSON,因为相同的技术可以一致地应用于更多种类的情况。

    • 5

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve