Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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_Performance_Tsql_Database Performance - Fatal编程技术网

Sql 连接到选择与连接到表集

Sql 连接到选择与连接到表集,sql,sql-server,performance,tsql,database-performance,Sql,Sql Server,Performance,Tsql,Database Performance,对于那里的DB专家,我想知道在连接到SELECT语句的结果和连接到以前填充的表变量之间是否存在功能/性能差异。我在SQLServer2008R2中工作 示例(TSQL): 在“真实”世界中,表和表变量是预定义的。我所关注的是能够将匹配的引用行用于进一步的操作,但我担心额外的步骤会降低查询速度。有没有技术上的原因来解释为什么一个会比另一个更快?这两种方法之间的性能差异是什么?我意识到很难(如果不是不可能的话)给出一个明确的答案,只是为这种情况寻求一些建议。这会给出同样的结果吗 SELECT t.*

对于那里的DB专家,我想知道在连接到SELECT语句的结果和连接到以前填充的表变量之间是否存在功能/性能差异。我在SQLServer2008R2中工作

示例(TSQL):


在“真实”世界中,表和表变量是预定义的。我所关注的是能够将匹配的引用行用于进一步的操作,但我担心额外的步骤会降低查询速度。有没有技术上的原因来解释为什么一个会比另一个更快?这两种方法之间的性能差异是什么?我意识到很难(如果不是不可能的话)给出一个明确的答案,只是为这种情况寻求一些建议。

这会给出同样的结果吗

SELECT t.*, s.*
FROM dbo.TestTable AS t
JOIN dbo.TestRefTable AS s ON t.id = s.id AND s.id = 1123

基本上,这是来自
TestTable
TestRefTable
的所有记录的交叉连接,其中
id=1123

这会得到相同的结果吗

SELECT t.*, s.*
FROM dbo.TestTable AS t
JOIN dbo.TestRefTable AS s ON t.id = s.id AND s.id = 1123

基本上,这是来自
TestTable
TestRefTable
id=1123
的所有记录的交叉联接,我希望直接表联接比表到表变量快,并且使用更少的资源。

我希望直接表联接比表到表变量快,并且使用更少的资源。

一般来说,查询中的派生表可能比连接到表变量快,因为它可以使用索引,而它们在表变量中不可用。但是,临时表也可以添加索引,这可能会解决潜在的性能差异

此外,如果表变量记录的数量预计很小,那么索引无论如何也不会产生很大的差异,因此差异很小或没有差异


通常,您需要在自己的系统上进行测试,因为记录数、表设计和索引设计与最佳工作方式有很大关系。

一般来说,查询中的派生表可能比加入表变量更快,因为它可以使用索引,而它们在表变量中不可用。但是,临时表也可以添加索引,这可能会解决潜在的性能差异

此外,如果表变量记录的数量预计很小,那么索引无论如何也不会产生很大的差异,因此差异很小或没有差异


通常,您需要在自己的系统上进行测试,因为记录的数量、表设计和索引设计与最有效的方法有很大关系。

数据库引擎有一个优化器来找出执行查询的最佳方法。引擎盖下的东西比你想象的还要多。例如,当SQL Server进行连接时,它至少可以选择四种连接算法:

  • 嵌套循环
  • 索引查找
  • 合并联接
  • 散列联接
(更不用说这些的多线程版本了。)

了解每一种方法的工作原理并不重要。您只需要了解两件事:不同的算法在不同的情况下是最好的,而SQLServer会尽最大努力选择最好的算法

选择连接算法只是优化器要做的一件事。它还必须弄清楚连接的顺序、聚合结果的最佳方式、是否需要按排序、如何访问数据(通过索引或直接)等等

当您将查询分解时,您正在对优化进行假设。在您的例子中,您假设最好的第一件事是对特定的表进行选择。你可能是对的。如果是这样,多个查询的结果应该与使用单个查询的结果一样快。嗯,也许不是。在单个查询中,SQL Server不必一次缓冲所有结果;它可以将结果从一个地方流到另一个地方。它还可以通过拆分查询来防止并行性的利用

一般来说,SQL Server优化器相当不错,因此最好让优化器一次性完成查询。当然也有例外,优化器可能不会选择最佳执行路径。有时候,解决这个问题就像确保表上的统计数据是最新的一样简单。其他时候,您可以添加优化器提示。其他时候,您可以重新构造查询,就像您所做的那样

例如,将数据加载到本地表中非常有用的一个地方是该表来自不同的服务器。优化器可能没有关于表大小的完整信息,无法做出最佳决策


换句话说,将查询保留为一条语句。如果您需要改进它,那么在它工作之后,将重点放在优化上。通常,您不必花费太多时间进行优化,因为该引擎非常擅长于此。

数据库引擎有一个优化器来找出执行查询的最佳方式。引擎盖下的东西比你想象的还要多。例如,当SQL Server进行连接时,它至少可以选择四种连接算法:

  • 嵌套循环
  • 索引查找
  • 合并联接
  • 散列联接
(更不用说这些的多线程版本了。)

了解每一种方法的工作原理并不重要。您只需要了解两件事:不同的算法在不同的情况下是最好的,而SQLServer会尽最大努力选择最好的算法

选择连接算法只是优化器要做的一件事。它还必须弄清楚连接的顺序、聚合结果的最佳方式、是否需要按排序、如何访问数据(通过索引或直接)等等

当您将查询分解时,您正在进行假设