今天我在SQL Server中了解了一个叫做的东西INNER LOOP JOIN
.
这是什么意思?(谷歌没有帮助..或者我应该说......关于它的博客文章有点......技术性,并且让我大吃一惊).
此外,使用INNER LOOP JOIN
超标准的一些常见场景是什么好主意INNER JOIN
?
如果有的话,在常规JOIN上显式执行HASH JOIN有哪些优点(其中SQL Server将决定最佳的JOIN策略)?例如:
select pd.*
from profiledata pd
inner hash join profiledatavalue val on val.profiledataid=pd.id
Run Code Online (Sandbox Code Playgroud)
在上面简单的示例代码中,我指定了JOIN策略,而如果我省略"hash"关键字,SQL Server将在幕后进行MERGE JOIN(根据"实际执行计划").
我的google-fu和so-fu在这里让我失望,所以我不妨问一下.
我有很多查询,其中有多个连接.
在一个查询中,我将标题/项目/详细信息一起加入,以及查找这些记录的各种信息.
加入时,我会尽量保持与其相关的顺序.例如:我的标题有两个查找表,所以在加入我的项目表之前我会加入那些.
那是对的吗?
在查找表之前加入更大的表是否更好?或相反亦然?
我是否应该loop
在加入小表时使用提示,并merge
在加入openrowsets时提示?
我确信答案是"它取决于",但有效和高效地加入的一些一般指导方针将非常有帮助.谢谢!
我不清楚下面提到的查询之间的工作差异.
具体来说,我不清楚这个概念
OPTION(LOOP JOIN)
.
第一种方法:它是一种传统的连接,比下面的所有连接都要贵.
SELECT *
FROM [Item Detail] a
LEFT JOIN [Order Detail] b ON a.[ItemId] = b.[fkItemId] OPTION (FORCE ORDER);
Run Code Online (Sandbox Code Playgroud)
第二种方法:它包含OPTION
在带有排序数据的语句中,仅进行了优化.
SELECT *
FROM [Item Detail] a
LEFT LOOP JOIN [Order Detail] b ON a.[ItemId] = b.[fkItemId] OPTION (FORCE ORDER);
Run Code Online (Sandbox Code Playgroud)
第三个办法:在这里,我不清楚,查询是如何工作的,并包括OPTION
有loop join
!?
SELECT *
FROM [Item Detail] a
LEFT LOOP JOIN [Order Detail] b ON a.[ItemId] = b.[fkItemId] OPTION (LOOP JOIN);
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释每个人的差异和工作方式以及优势吗?
注意:这些不是嵌套OR哈希循环!
我正在进行一项任务,我应该在SQL Server中比较不同的连接方法,即散列连接,合并连接和索引连接.
我在让SQL Server执行索引连接时遇到困难.任何人都可以告诉我如何强制它使用索引连接(使用连接提示或类似),或者只是简单地提供一个简单的查询与SQL服务器使用索引连接方法的连接?
最近,我试图优化此查询
UPDATE Analytics
SET UserID = x.UserID
FROM Analytics z
INNER JOIN UserDetail x ON x.UserGUID = z.UserGUID
Run Code Online (Sandbox Code Playgroud)
估计执行计划在表更新中显示57%,在哈希匹配(聚合)上显示40%.我做了一些窥探,并遇到了JOIN提示的主题.所以我在内部连接和WA-ZHAM中添加了一个LOOP提示!新的执行计划在表更新中显示38%,在索引搜索中显示58%.
所以我即将开始对我的所有问题应用LOOP提示,直到谨慎使我变得更好.经过一些谷歌搜索,我意识到JOIN提示在BOL中没有很好地涵盖.因此...
感谢您的时间和帮助人们!
我正在运行SQL Server 2008 BTW.上面提到的统计数据是ESTIMATED执行计划.
(询问:在 sql server 中调整 - 视图。抱歉,我需要查看我的帖子)。
我需要在连接中添加提示(在进行连接时强制使用 ID 上的索引)和选择(强制在 where 子句的名称上使用索引),如本文中提到的最后一个查询。我不知道正确连接的正确语法是什么(用于调整),以及强制索引的正确语法是什么, where 子句将使用它,而我正在从视图中进行选择。
我在sql server 2012中创建了一个视图,如:
create myview as
select mytable2.name
from mytable1 t1
join myTable2 t2
on t1.id = t2.id
Run Code Online (Sandbox Code Playgroud)
我希望连接 table1 和 table2 将具有正确的索引 (id),但是当我这样做时:
select * from myview
where name = 'abcd'
Run Code Online (Sandbox Code Playgroud)
我希望最后一个选择将带有“名称”列的索引。
正如我所描述的,带有提示(调整)的 sql server 中的正确语法是什么,可以最好地运行?
我想强制使用索引仅用于连接目的(列 = id),并在执行以下操作时强制使用索引名称:
select name from myview
where name = 'abcd'.
Run Code Online (Sandbox Code Playgroud)
就像是
create myview as
select mytable2.name
/* index hint name on column name */
from mytable1 t1 …
Run Code Online (Sandbox Code Playgroud) join-hints ×7
sql-server ×6
join ×5
t-sql ×3
database ×1
indexing ×1
inner-join ×1
left-join ×1
sql ×1