Sql 内部联接与子查询效率

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

我有两个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].[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,作为一个复合键。。。这就够了,对吧?是的,我知道他们不一样。。。我将尝试使内部联接与子查询相似,以便在类似条件下进行比较