【问题标题】:Join user-defined table type param to view加入用户自定义表类型参数查看
【发布时间】:2019-11-16 00:42:38
【问题描述】:

SQL Server 2012:我有一个带有用户定义表类型参数的存储过程。

为了创建它的返回行集,存储过程从一个视图中选择连接到 param 表的几个没有索引的列(由于其他原因添加这些列是有问题的)。

是不是更好:

  1. 将整个视图加载到本地临时表中,然后选择临时表和参数表的连接
  2. 直接从加入参数表的视图中选择

视图最多可包含约 100 万行。

这两种方式有什么优势吗?还是 SQL Server 在内部以类似的方式实现这两种方法?

【问题讨论】:

  • 这是你做的事情。你猜不到。两种方式都写,并通过检查执行计划来评估性能。如果您无法索引源表(nb: tables - 视图只是一个预先编写的查询)并且它们没有对您的连接有用的索引,那么它可能没有任何区别。但这只是猜测——这是我们不应该做的事情。

标签: sql-server tsql join view temp-tables


【解决方案1】:

我将从创建临时表开始,在其中插入用户定义的表类型。定义的表类型实际上是一个表变量,并且在某些情况下将表变量连接到其他对象非常慢,因为 SQL 引擎无法很好地了解表变量有多少行。

第二个可以优化的是视图。这里的问题是:

  1. 您真的需要视图吗?使用内联表值函数(也称为带参数的视图)会不会更好?如果您可以将一些参数传递给此函数,这些参数可用于高级过滤数据(想象不返回所有行而是返回其中的一部分),您也可以提高性能。
  2. 如果您确实需要查看这些数据,可以使用视图indexed

【讨论】:

  • 内联表值函数如何比仅查询视图更高效? SQL Server 是否会为输入参数的每个唯一值集缓存函数的结果行集?但是在我的情况下,in 参数很少重复。
  • @BaltoStar 有各种情况。太多了,无法在评论中描述它们。在这个问题的上下文中,OP 尝试将数据存储在要连接的临时表中。如果我们有一个函数,我们可以只将部分数据存储在临时表中,并减少工作数据量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多