标签: join-hints

我什么时候应该使用INNER -LOOP- JOIN而不是INNER JOIN

今天我在SQL Server中了解了一个叫做的东西INNER LOOP JOIN.

这是什么意思?(谷歌没有帮助..或者我应该说......关于它的博客文章有点......技术性,并且让我大吃一惊).

此外,使用INNER LOOP JOIN超标准的一些常见场景是什么好主意INNER JOIN

sql-server inner-join sql-server-2008 join-hints

28
推荐指数
2
解决办法
3万
查看次数

仅仅通过JOIN指定HASH 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(根据"实际执行计划").

t-sql sql-server join sql-server-2005 join-hints

13
推荐指数
1
解决办法
2万
查看次数

TSQL - 连接表的正确顺序是什么?

我的google-fu和so-fu在这里让我失望,所以我不妨问一下.

我有很多查询,其中有多个连接.

在一个查询中,我将标题/项目/详细信息一起加入,以及查找这些记录的各种信息.

加入时,我会尽量保持与其相关的顺序.例如:我的标题有两个查找表,所以在加入我的项目表之前我会加入那些.

那是对的吗?

在查找表之前加入更大的表是否更好?或相反亦然?

我是否应该loop在加入小表时使用提示,并merge在加入openrowsets时提示?

我确信答案是"它取决于",但有效和高效地加入的一些一般指导方针将非常有帮助.谢谢!

t-sql database sql-server join join-hints

12
推荐指数
1
解决办法
7311
查看次数

循环加入SQL Server 2008

我不清楚下面提到的查询之间的工作差异.

具体来说,我不清楚这个概念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)

第三个办法:在这里,我不清楚,查询是如何工作的,并包括OPTIONloop 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 left-join sql-server-2008 join-hints

11
推荐指数
1
解决办法
7035
查看次数

如何强制MS SQL Server执行索引连接?

我正在进行一项任务,我应该在SQL Server中比较不同的连接方法,即散列连接,合并连接和索引连接.

我在让SQL Server执行索引连接时遇到困难.任何人都可以告诉我如何强制它使用索引连接(使用连接提示或类似),或者只是简单地提供一个简单的查询与SQL服务器使用索引连接方法的连接?

sql sql-server indexing join join-hints

3
推荐指数
1
解决办法
1万
查看次数

SQL SERVER 2008 JOIN提示

最近,我试图优化此查询

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中没有很好地涵盖.因此...

  1. 有人可以告诉我为什么在我的所有查询中应用LOOP提示是个坏主意.我在某处读到LOOP JOIN是查询优化器的默认JOIN方法,但无法验证语句的有效性?
  2. 何时使用JOIN提示?当sh*t击中风扇并且幽灵破坏者不在城里?
  3. LOOP,HASH和MERGE提示之间有什么区别?BOL声称MERGE似乎是最慢的,但每个提示的应用是什么?

感谢您的时间和帮助人们!

我正在运行SQL Server 2008 BTW.上面提到的统计数据是ESTIMATED执行计划.

t-sql join sql-server-2008 join-hints

3
推荐指数
1
解决办法
2545
查看次数

使用索引提示和连接提示

(询问:在 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)

sql-server join join-hints

0
推荐指数
1
解决办法
5289
查看次数