在Microsoft SQLServer Management Studio中执行查询时,如果选定工具栏中的 按钮,可以看到为查询生成的执行计划。执行计划以图形方式显示了SQL Server查询优化器选择的数据检索方法,如表扫描、排序、哈希匹配等。对于联接查询,SQL Server会根据联接表之
在Microsoft SQLServer Management Studio中执行查询时,如果选定工具栏中的按钮,可以看到为查询生成的执行计划。执行计划以图形方式显示了SQL Server查询优化器选择的数据检索方法,如表扫描、排序、哈希匹配等。对于联接查询,SQL Server会根据联接表之间的数据、索引等情况,选择使用嵌套循环联接、合并联接或哈希联接。
7.7.1嵌套循环联接
嵌套循环联接也称为“嵌套迭代”,它将一个联接输入用作外部输入表(显示为图形执行计划中的顶端输入),将另一个联接输入用作内部(底端)输入表。外部循环逐行处理外部输入表。内部循环会针对每个外部行执行,在内部输入表中搜索匹配行。简单地讲,就是扫描其中的一个联接表,并为该表中的每一行在另一个联接表中搜索匹配行。
如果外部输入较小(不到10行)而内部输入较大且预先创建了索引,则嵌套循环联接尤其有效。在许多小事务中(如那些只影响较小的一组行的事务),索引嵌套循环联接优于合并联接和哈希联接。但在大型查询中,嵌套循环联接通常不是最佳选择。
例如,下面的查询由于Sales.Customer表行数只有1行,而Sales.SalesOrderHeader数据量较大,因此将使用嵌套循环联接,生成的执行计划如图7-11所示。
USE AdventureWorks;
GO
SELECT *
FROM Sales.Customer
INNER JOINSales.SalesOrderHeader
ONCustomer.CustomerID = SalesOrderHeader.CustomerID
WHERE Customer.CustomerID = 1;
图7-11使用嵌套循环的执行计划
在该计划中存在两个嵌套循环,其中只有左边的嵌套循环符用于Sales.Customer与Sales.SalesOrderHeader的联接,而右边的嵌套循环是用于Sales.SalesOrderHeader的索引查找与物理行定位(键查找)之间的联接。执行计划右上角的Sales.Customer表被作为外部输入,在聚集索引中查找客户。对于每个客户,嵌套循环运算将对SalesOrderHeader.CustomerID列上的IX_SalesOrderHeader_CustomerID索引执行一次查找,然后再跟一个键查找来定位要访问的数据行。
7.7.2合并联接
合并联接要求两个输入都在合并列上排序,合并列由联接谓词的等效(ON)子句定义。由于每个输入都已排序,因此合并联接将从每个输入获取一行并将其进行比较。例如,对于内联接操作,如果行相等则返回。如果行不相等,则废弃值较小的行并从该输入获得另一行。这一过程将重复进行,直到处理完所有的行为止。
合并联接操作可以是常规操作,也可以是多对多操作。多对多合并联接使用临时表存储行。如果每个输入中有重复值,则在处理其中一个输入中的每个重复项时,另一个输入必须重绕到重复项的开始位置。
合并联接本身的速度很快,但是如果合并列上未建立索引,选择合并联接有可能会非常费时,因为它首先要对列进行排序操作。然而,如果数据量很大且能够从索引中获得预排序的所需数据,则合并联接通常是最快的可用联接算法。
例如,下面的查询语句将获取订单的详细信息,由于SalesOrderHeader和SalesOrderDetail在合并列SalesOrderID上都具有聚集索引,已经将列进行了排序,所以查询优化器会选择合并联接。如图7-12所示。
USE AdventureWorks;
GO
SELECT *
FROM Sales.SalesOrderHeader
INNER JOINSales.SalesOrderDetail
ONSalesOrderHeader.SalesOrderID = SalesOrderDetail.SalesOrderID;
图7-12使用合并联接的执行计划
7.7.3哈希联接
哈希联接可以有效处理未排序的大型非索引输入。因此,它对处理复杂查询的中间结果很有用。查询的中间结果是未经索引的,而且通常不会为查询计划中的下一个操作进行适当的排序。并且,查询优化器只估计中间结果的大小。而对于复杂查询,估计可能有很大的误差,因此如果中间结果比预期的大得多,则处理中间结果的算法不仅必须有效而且必须适度弱化。再像合并联接那样严格要求具备排序列,对于中间结果而言是不现实的,排序成本的付出可能要远远大于数据的直接检索成本。
选择哈希联接的两种情况:一是没有为联接创建合适的索引,二是中间结果比较大。
哈希联接有两种输入:生成输入和探测输入。查询优化器会选择二者中较小的那个作为生成输入,对联接列值应用哈希函数,将生成输入中的行分配到哈希桶中。哈希桶是一种存放所访问数据位置的结构,有了它,进行数据检索时,可以避免不必要的表扫描。
为了验证无索引情况下的哈希联接使用,首先使用下面的语句创建Sales.Customer和Sales.SalesOrderHeader表的副本。
USE AdventureWorks;
GO
SELECT TOP 10 *
INTO MyCustomer
FROM Sales.Customer
ORDER BY CustomerID;
SELECT TOP 100 *
INTO MySalesOrderHeader
FROM Sales.SalesOrderHeader
ORDER BY CustomerID;
执行下面的查询,可以看到如图7-13所示的执行计划。
SELECT *
FROM MyCustomer
INNER JOINMySalesOrderHeader
ONMyCustomer.CustomerID = MySalesOrderHeader.CustomerID;
图7-13使用哈希联接的执行计划
下面再来看一个比较有趣的示例。下面的查询语句中仅选择了Sales.Customer中CustomerID = 1的行与Sales.SalesOrderHeader进行联接,由于联接行数很小,所产生中间结果的数据量也比较小,因此,可以看到查询优化器为语句使用了嵌套循环联接。如图7-14所示。
USE AdventureWorks;
GO
SELECT *
FROM Sales.Customer
INNER JOINSales.SalesOrderHeader
ONCustomer.CustomerID = SalesOrderHeader.CustomerID
WHERE Customer.CustomerID = 1;
图7-14数据量较小时使用嵌套循环联接
同样是上面的联接,去除掉WHERE筛选条件后数据量明显增大,执行该语句会发现查询优化器使用了哈希联接方式。如图7-15所示。
SELECT *
FROM Sales.Customer
INNER JOINSales.SalesOrderHeader
ONCustomer.CustomerID = SalesOrderHeader.CustomerID;
图7-15数据量较大时使用哈希联接
7.7.4使用联接提示强制联接策略
联接提示用于指定查询优化器在两个表之间强制执行联接策略,提示符包括LOOP JOIN、MERGE JOIN和HASH JOIN,分别用于嵌套循环、哈希和合并联接。如果指定了多个联接提示,则优化器从允许的联接策略中选择开销最少的联接策略。此外,也可以使用OPTION子句指定联接策略。但是这种方式会影响查询中的所有联接,通常用于旧式联接语法。
1.为每个联接指定单独的联接策略
可以在FROM子句中使用LOOP JOIN、MERGE JOIN和HASH JOIN提示符为每个联接单独指定联接策略。例如,下面的查询语句指定使用嵌套循环联接。
USE AdventureWorks;
GO
SELECT *
FROM Sales.Customer
INNER LOOPJOIN Sales.SalesOrderHeader
ONCustomer.CustomerID = SalesOrderHeader.CustomerID;
又如,下面的查询语句指定使用合并联接。
USE AdventureWorks;
GO
SELECT *
FROM Sales.Customer
INNERMERGE JOIN Sales.SalesOrderHeader
ONCustomer.CustomerID = SalesOrderHeader.CustomerID;
在多表联接中使用联接提示时,会影响联接的执行顺序。在前面介绍了,在不影响返回结果正确的情况下,查询优化器会按照效率优先的原则,选择首先执行的联接。例如,下面语句的执行计划如图7-16所示,可以看到首先执行的是Sales.SalesOrderHeader与Sales.SalesOrderDetail的联接,然后将联接结果再与Sales.Customer进行联接。
USE AdventureWorks;
GO
SELECT *
FROM Sales.Customer
INNER JOINSales.SalesOrderHeader
ONCustomer.CustomerID = SalesOrderHeader.CustomerID
INNER JOINSales.SalesOrderDetail
ONSalesOrderHeader.SalesOrderID = SalesOrderDetail.SalesOrderID;
图7-16未使用联接提示的执行计划
下面的语句为Sales.Customer和Sales.SalesOrderHeader指定了合并联接提示,并且这个提示仅对这两个表起作用,与Sales.SalesOrderDetail的联接策略仍旧由查询优化器决定。由于明确指定了Sales.Customer与Sales.SalesOrderHeader使用合并联接,优化器会先执行该联接,而不是先执行Sales.SalesOrderHeader与Sales.SalesOrderDetail的联接。否则,就会造成Sales.Customer与Sales.SalesOrderHeader和Sales.SalesOrderDetail的联接结果再执行合并联接。图7-17是该语句的执行计划。
SELECT *
FROM Sales.Customer
INNERMERGE JOIN Sales.SalesOrderHeader
ONCustomer.CustomerID = SalesOrderHeader.CustomerID
INNER JOINSales.SalesOrderDetail
ONSalesOrderHeader.SalesOrderID = SalesOrderDetail.SalesOrderID;
图7-17使用联接提示后的执行计划
如果希望Sales.Customer与Sales.SalesOrderHeader和Sales.SalesOrderDetail的联接结果执行合并联接,则应当使用嵌套联接的方式实现,参考下面的语句:
SELECT *
FROM Sales.Customer
INNERMERGE JOIN (Sales.SalesOrderHeader
INNER JOIN Sales.SalesOrderDetail
ONSalesOrderHeader.SalesOrderID = SalesOrderDetail.SalesOrderID)
ONCustomer.CustomerID = SalesOrderHeader.CustomerID;
2.为全部联接指定统一的联接策略
当使用旧式联接语法时,应当使用OPTION子句指定联接策略,但是,这种策略会影响语句中的全部联接,无法为每个联接单独指定不同的联接策略,如:
SELECT *
FROM Sales.Customer, Sales.SalesOrderHeader,Sales.SalesOrderDetail
WHERE Customer.CustomerID =SalesOrderHeader.CustomerID
ANDSalesOrderHeader.SalesOrderID = SalesOrderDetail.SalesOrderID
OPTION (MERGE JOIN);
该语句的执行计划如图7-18所示,可以看到三个表之间全部使用了合并联接策略。
图7-18为全部联接使用统一联接策略的执行计划
在ANSI SQL:1992规范中,也可以使用OPTION子句,它同样也是影响语句中的全部联接,如:
SELECT *
FROM Sales.Customer
INNER JOINSales.SalesOrderHeader
ONCustomer.CustomerID = SalesOrderHeader.CustomerID
INNER JOINSales.SalesOrderDetail
ONSalesOrderHeader.SalesOrderID = SalesOrderDetail.SalesOrderID
OPTION (MERGE JOIN);

特斯拉是一个典型的AI公司,过去一年训练了75000个神经网络,意味着每8分钟就要出一个新的模型,共有281个模型用到了特斯拉的车上。接下来我们分几个方面来解读特斯拉FSD的算法和模型进展。01 感知 Occupancy Network特斯拉今年在感知方面的一个重点技术是Occupancy Network (占据网络)。研究机器人技术的同学肯定对occupancy grid不会陌生,occupancy表示空间中每个3D体素(voxel)是否被占据,可以是0/1二元表示,也可以是[0, 1]之间的

当Sack无法打开链接时,我们不希望用户感到困惑。在这篇文章中,我们将探讨解决这个问题的方法。如果你遇到类似情况,请查看本文中提供的解决方案,以便快速解决这一问题。为什么我的Slack不起作用了?如果Slack无法正常运行,可能需要检查一些常见因素。首先要检查互联网连接,因为应用程序需要稳定的网络。接着要查看缓存和cookie是否损坏,然后检查Slack服务器状态,清除任何防火墙或防病毒程序的干扰。用户还可以尝试重置应用程序或进行全新安装。修复我们无法在Slack中打开此链接错误如果您无法在Sl

Excel是否继续抛出此工作簿包含指向一个或多个外部源的链接,这些外部源在打开工作簿时可能会显示不安全警告消息?许多用户报告说,无论何时打开Excel文件都会收到此警告。虽然该警告指示工作簿中存在潜在的恶意链接,但即使您已包含受信任的外部来源,也可能会触发该警告此工作簿包含指向一个或多个可能不安全的外部源的链接如果打开Excel文件时出现警告提示“此工作簿包含指向一个或多个可能不安全的外部源的链接”,您可以尝试以下解决方案来解决该问题:检查工作簿中的外部链接并删除不受信任的链接。使用编辑链接功能

译者 | 朱先忠审校 | 孙淑娟在我之前的博客中,我们已经了解了如何使用因果树来评估政策的异质处理效应。如果你还没有阅读过,我建议你在阅读本文前先读一遍,因为我们在本文中认为你已经了解了此文中的部分与本文相关的内容。为什么是异质处理效应(HTE:heterogenous treatment effects)呢?首先,对异质处理效应的估计允许我们根据它们的预期结果(疾病、公司收入、客户满意度等)选择提供处理(药物、广告、产品等)的用户(患者、用户、客户等)。换句话说,估计HTE有助于我

译者 | 朱先忠审校 | 孙淑娟引言模型超参数(或模型设置)的优化可能是训练机器学习算法中最重要的一步,因为它可以找到最小化模型损失函数的最佳参数。这一步对于构建不易过拟合的泛化模型也是必不可少的。优化模型超参数的最著名技术是穷举网格搜索和随机网格搜索。在第一种方法中,搜索空间被定义为跨越每个模型超参数的域的网格。通过在网格的每个点上训练模型来获得最优超参数。尽管网格搜索非常容易实现,但它在计算上变得昂贵,尤其是当要优化的变量数量很大时。另一方面,随机网格搜索是一种更快的优化方法,可以提供更好的

使用Docker部署MySQL后,连接速度较慢,通过在线搜索发现问题可能源自最小容器安装时缺少DNS解析等模块。所以连接时会出现连接超慢的问题,我们直接加入这一句skip-name-resolve我们直接修改docker-compose.yml配置,配置如下version:"3"services:mysql:image:mysql:latestcontainer_name:mysql_composerestart:alwaysports:-3306:3306command:--default-a
![Outlook坚持尝试连接[修复]](https://img.php.cn/upload/article/000/465/014/171029292689611.jpg)
本文将探讨在Outlook尝试连接时出现停滞的情况下,您可以采取的解决措施。无论是在何种版本的MicrosoftOffice中,包括Microsoft365,都可能遇到这个问题。这个问题会导致Outlook桌面应用程序无法正常接收电子邮件,因此解决这个问题变得至关重要。修复Outlook在尝试连接时停滞的问题如果Outlook在连接时出现问题,并且您发现桌面应用程序上未能收到新邮件,以下建议或许能够帮助解决问题。在尝试这些方法之前,请先检查一下您的互联网连接是否正常。尝试重新启动您的路由器,有时

WebSocket应用程序可实现客户端与服务器之间的实时双向通信。尽管使用了WebSocket连接,但仍需有效的流量管理机制,以免服务器过载,进而导致服务中断和不可用。HAProxy是一个免费且可靠的负载平衡器,也可用作反向代理。通过配置HAProxy来支持WebSocket连接,可以更好地发挥WebSockets的实时数据传输特性,同时减轻服务器负载。本文将介绍配置HAProxy以支持WebSocket连接的详细步骤。关于如何为WebSocket连接配置HAProxy的分步指南通过WebSoc


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

SAP NetWeaver Server Adapter for Eclipse
Integrate Eclipse with SAP NetWeaver application server.

MinGW - Minimalist GNU for Windows
This project is in the process of being migrated to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the GNU Compiler Collection (GCC), freely distributable import libraries and header files for building native Windows applications; includes extensions to the MSVC runtime to support C99 functionality. All MinGW software can run on 64-bit Windows platforms.

VSCode Windows 64-bit Download
A free and powerful IDE editor launched by Microsoft

MantisBT
Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.

mPDF
mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),
