小编Rob*_*man的帖子

SQL Server 何时会选择散列连接而不是合并连接?

我有一个很大的查询,其中包含许多我正在尝试调整的连接,一个警告信号是整个过程中使用了很多很多散列连接。我转到查询树的底部,然后转到那里的第一个连接,这是一个内部连接。

表 A 使用聚集索引扫描来检索其数据,该数据按连接列排序。表 B 使用非聚集索引扫描,它也在连接列上排序。

当我单独连接这两个表并选择相同的列集时,优化器使用合并连接。被连接的集合大小大致相同,并且不是很大(<5,000 行)。

在这种情况下,什么可以解释优化器选择散列连接而不是合并连接?

编辑

根据要求,我添加了更多细节。索引定义是:

CREATE NONCLUSTERED INDEX NCL_Asset_Issuer_MergeInduce ON Asset.IssuerCompanyId (CompanyId)INCLUDE (IsPrivate,HasPublicEquity,Ticker,FinancialTemplateID,BondTicker,SICOther1ID,SICOther4ID,SICSandPID,SICOther3ID,SICMoodyID,CurrencyTypeID,SecondaryAnalystID,AnalystID,SICOshaID,SecondaryBondTicker,FiscalYearEnd,EquityExchangeID);

CREATE NONCLUSTERED INDEX NCL_Asset_IssuerCustom_IssuerId ON Asset.IssuerCustom (IssuerID) INCLUDE (Text3,ListItem1ID,ListItem5ID,ListItem3ID,ListItem2ID,Version,text4,TextLong15,ListItem6ID)
Run Code Online (Sandbox Code Playgroud)

正如我之前提到的,以下查询将返回一个合并连接:

SELECT IsPrivate,HasPublicEquity,Ticker,FinancialTemplateID,BondTicker,SICOther1ID,SICOther4ID,SICSandPID,SICOther3ID,SICMoodyID,CurrencyTypeID,SecondaryAnalystID,AnalystID,SICOshaID,SecondaryBondTicker,FiscalYearEnd,EquityExchangeID,ic.ListItem2Id,ic.ListItem3ID,ic.IssuerId
FROM Asset.Issuer i
INNER JOIN Asset.IssuerCustom ic ON i.CompanyId = ic.IssuerId;
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

如您所见,查询同时使用了上述两个索引。另一方面,这个相同的连接发生在一个更大的查询中,下图显示了计划的角落,这个连接作为散列连接发生:

在此处输入图片说明

我可以看到的一个区别是,在哪个表是“内部”表与哪个表是“外部”表方面存在逆转。尽管如此,如果两个查询都是同一列上的内部联接,为什么这会影响执行计划?

sql-server hash merge

5
推荐指数
1
解决办法
1600
查看次数

有没有办法在C#MVC中渲染两个部分视图,使它们在一个视图中并排显示?

我对C#MVC有些新意,并且在我的解决方案中使用了部分视图.当我在一个视图中渲染两个或多个局部视图时,我看到它们从上到下呈现(当它们被渲染时,它们在页面上出现在下一个上面),这就是我所期望的.

有没有办法指定部分视图以并排或网格方式呈现?我问,因为有很多空白区域,所以将这些部分视图中的内容放在这个空白区域中是理想的.

html css asp.net-mvc

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

标签 统计

asp.net-mvc ×1

css ×1

hash ×1

html ×1

merge ×1

sql-server ×1