Sql 内部联接与子查询效率
我有两个SQL表,Countries和CountriesI18N:Sql 内部联接与子查询效率,sql,sql-server,tsql,sql-server-2014,Sql,Sql Server,Tsql,Sql Server 2014,我有两个SQL表,Countries和CountriesI18N: Countries > Code CountriesI18N > CountryCode, LanguageCode, Name 我得到了一份选择以下国家的名单: 国家代码 给定语言的国家名称 第一个T-SQL选项如下所示: SELECT [x].[Code], ( SELECT TOP(1) [z].[Name] FROM [CountriesI18N] AS [z] WHERE ([z].[Lang
Countries > Code
CountriesI18N > CountryCode, LanguageCode, Name
我得到了一份选择以下国家的名单:
SELECT [x].[Code], (
SELECT TOP(1) [z].[Name]
FROM [CountriesI18N] AS [z]
WHERE ([z].[LanguageCode] = 'en' AND ([x].[Code] = [z].[CountryCode])
) AS [Name]
FROM [Countries] AS [x]
和使用内部联接的替代方法:
SELECT [x].[Code], [x.CountriesI18N].[Name]
FROM [Countries] AS [x]
INNER JOIN [CountriesI18N] ON [x].[Code] = [x.CountriesI18N].[CountryCode]
WHERE [x.CountriesI18N].[LanguageCode] = 'en'
它们在速度和效率方面是否相等
如果我有许多使用许多innerjoin或子查询的相关表,那么它们是等价的吗 首先,它们不是等价的查询。对于您的特定数据,它们可能看起来相当,但实际上并非如此。子查询最多返回一个匹配项。
内部联接
过滤掉不匹配项并可以返回重复项
所以,你是在比较苹果和桔子
在这两种情况下,您都需要一个索引
CountriesI18N(CountryCode,LanguageCode)
。这恰好是两个查询版本的最佳索引。打开SSMS。按+N
。在“新建查询”窗口中,粘贴两个查询。按+M
。运行查询。检查执行计划。“子查询”=子查询:)简短回答:它取决于
。表大小、索引、碎片、数据类型,甚至表中的列数,都会产生影响。通常,如果您可以将其编写为一个连接
,您可能应该这样做;乐观主义者最熟悉这一点,它更容易让人阅读和维护,等等。但是哪个使用了最多的资源,哪个更快(它们不是一回事;单线程计划可能比多线程计划花费更长的时间,但使用的资源更少)最好使用SQL Server的探查器和/或查看执行计划来衡量。此外,您的查询也不相同。第一个保证每个代码有一个名称。第二种方法允许每个代码有多个名称。它们可以产生不同的结果,这可能意味着它们会产生不同的执行计划。检查执行计划以查看其差异,并使用探查器精确测量资源使用情况的所有原因。@MatBailie我如何更改第二个查询以仅获取一个名称?事实上,在CountriesLocalization中,我有一个唯一的约束,因为这就是PK。所以我知道,对于每种语言代码,我只能得到一个名称。(CountryCode,LanguageCode)已经是CountriesI18N的PK,作为一个复合键。。。这就够了,对吧?是的,我知道他们不一样。。。我将尝试使内部联接与子查询相似,以便在类似条件下进行比较