Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 连接对连接列性能的影响_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 连接对连接列性能的影响

Sql 连接对连接列性能的影响,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个视图需要连接到连接的列上。比如, dbo.View1 INNER JOIN dbo.table2 ON dbo.View1.combinedcode = dbo.table2.code “视图1”内有一列,其组成如下: dbo.tableA.details + dbo.tableB.code AS combinedcode 在此列上执行联接非常缓慢。然而,实际的“视图1”运行得非常快。联接带来了糟糕的性能,而且任何表或视图中甚至没有多少行。有人知道为什么会这样吗 谢谢你的洞察力 试着

我有一个视图需要连接到连接的列上。比如,

dbo.View1 INNER JOIN
dbo.table2 ON dbo.View1.combinedcode = dbo.table2.code
“视图1”内有一列,其组成如下:

dbo.tableA.details + dbo.tableB.code AS combinedcode
在此列上执行联接非常缓慢。然而,实际的“视图1”运行得非常快。联接带来了糟糕的性能,而且任何表或视图中甚至没有多少行。有人知道为什么会这样吗

谢谢你的洞察力

试着这样做:

select *
into #TemTap
from View1
/*where conditions on view1*/
之后,您可以在TemTap.combinedcode上创建索引,然后

它通常对我有效。

请尝试以下方法:

select *
into #TemTap
from View1
/*where conditions on view1*/
之后,您可以在TemTap.combinedcode上创建索引,然后

它通常对我有用。

因为组合代码上没有索引,所以连接很可能会导致视图的完整表扫描,以计算每一行的代码

如果您想加快速度,请尝试将视图制作成一个带有组合代码索引的视图,以帮助连接

另一种选择,取决于您的SQL server版本,是作为Parado answers为联接创建一个临时表,尽管它通常性能较低,至少对于单次查询是如此。

因为组合代码上没有索引,联接很可能导致视图的完整表扫描,以计算每一行的代码

如果您想加快速度,请尝试将视图制作成一个带有组合代码索引的视图,以帮助连接


另一种选择,取决于您的SQL server版本,是作为Parado answers为联接创建一个临时表,尽管它通常性能较低,至少对于单次查询而言是这样。

原因是优化器没有关于连接列的信息,因此无法选择合理的联接路径。我的猜测是,如果你看一下执行计划,连接使用的是嵌套循环连接。我很想再加上一点恐惧

您可以通过在table2code上放置索引来解决此问题。优化器应该决定使用这个索引,避免错误的连接优化

您还可以使用查询提示强制使用哈希联接或合并联接。我发现自己在复杂查询中更经常这样做,因为数据的更改可能会影响查询计划。当一个已经花了一年2分钟的查询决定花几个小时,填充临时数据库,并在空间耗尽时终止时,这些提示就会出现。您可以通过在查询末尾添加选项mergejoin、hashjoin来实现这一点。还可以在on子句中显式选择联接类型


最后,按照Parado的建议,将中间结果存储在临时表中应该为优化器提供足够的信息来选择最佳连接算法。

原因是优化器没有关于连接列的信息,因此无法选择合理的连接路径。我的猜测是,如果你看一下执行计划,连接使用的是嵌套循环连接。我很想再加上一点恐惧

您可以通过在table2code上放置索引来解决此问题。优化器应该决定使用这个索引,避免错误的连接优化

您还可以使用查询提示强制使用哈希联接或合并联接。我发现自己在复杂查询中更经常这样做,因为数据的更改可能会影响查询计划。当一个已经花了一年2分钟的查询决定花几个小时,填充临时数据库,并在空间耗尽时终止时,这些提示就会出现。您可以通过在查询末尾添加选项mergejoin、hashjoin来实现这一点。还可以在on子句中显式选择联接类型


最后,按照Parado的建议,将中间结果存储在临时表中,可以为优化器提供足够的信息来选择最佳的连接算法。

使用SQL函数是不建议使用条件的。在这里,您在where条件中间接地使用concatenate,但是是的。所以它对每一行执行连接,然后将其与其他表进行比较

现在的解决方案是尝试使用中间表,而不是此视图来保存相关值

如果不可能尝试使用索引视图,我知道这是一个地狱的任务。 我宁愿创建中间表

请参见索引视图的链接

不建议使用SQL函数。在这里,您在where条件中间接地使用concatenate,但是是的。所以它对每一行执行连接,然后将其与其他表进行比较

现在的解决方案是尝试使用中间表,而不是此视图来保存相关值

如果不可能尝试使用索引视图,我知道这是一个地狱的任务。 我宁愿创建中间表

请参见索引视图的链接

是否必须对连接的列执行连接,或者是否可以设想单独对原始列进行连接可能会导致错误
是否有相同的结果?很遗憾,我必须在连接的列上执行它。另外,我不能索引nvarchar列,也不能在我的视图中使用提示,因为它会给我查询提示。查询计划中不能使用查询提示。您必须对连接的列执行联接,还是可以想象单独对原始列进行联接会产生相同的结果?不幸的是,我必须对连接的列执行联接。另外,我不能为nvarchar列编制索引,也不能在视图中使用提示,因为它为我提供了查询提示。查询提示不能在查询计划中使用。它表示查询提示不能在查询计划中使用。此外,我无法在该列上放置索引,因为它是一个nvarchar列基于文本的代码:-/它表示查询提示不能在查询计划中使用。此外,我无法在该列上放置索引,因为它是一个nvarchar列,是一个基于文本的代码:-/