【问题标题】:SQL Server: Design: Embedded Select statement or INNER JOIN?SQL Server:设计:嵌入式 Select 语句还是 INNER JOIN?
【发布时间】:2010-12-17 21:17:00
【问题描述】:

我有以下表结构-

站点:站点主表

组织:组织的主表

用户:用户的主表(每个用户链接到一个唯一的组织通过 用户.OrgId)

OrgSite:存储一些“特定于组织”的站点详细信息(OrgId、SiteId、SiteName、 站点代码)。不是所有网站,但只有 组织可以访问的那些。

UserSite:将用户链接到其可访问的站点(UserId、SiteId)。 当用户链接到 Org UserSite 将是 OrgSite 表的子集。

ItemSite:存储一些项目和站点特定详细信息的表(ItemID、 SiteId, OrgId, ...)

现在,我必须从“ItemSite”过滤\显示记录,并且我还需要显示 Sitecode。所以,我看到以下两个选项-

1.创建一个视图: vw_ItemSite_UserSite_OrgSite(INNER JOIN 上 SiteId 上的所有表) - 这将使我能够访问“OrgSite”表中可用的所有组织特定详细信息(即 SiteCode 等)

如果你能注意到我必须包括 视图中的“OrgSite”只是因为我 想要组织特定的站点代码和站点名称。 因为 UserSite 已经 过滤站点 - 所以我可以 “排除” OrgSite 表和 消除不必要的 INNER JOIN。

2。基于上述说明 - 第二个选项是创建一个 VIEW:vw_ItemSite_UserSite 并在 VIEW 的 'SELECT' 语句中我可以嵌入以下 SELECT -

CREATE VIEW vw_ItemSite_UserSite AS
SELECT ItemSite.SiteID,
(SELECT TOP 1 [SiteCode] FROM OrgSite WHERE OrgId = ItemSite.OrgId) AS SiteCode,
...
FROM ItemSite INNER JOIN UserSite ON ItemSite.SiteId = UserSite.SiteId

我唯一的意图是 - 我相信 INNER JOIN 和 WHERE 将在评估嵌入式 select 语句之前进行评估。那么,这是否可以节省一些性能?还是拥有 vw_ItemSite_UserSite_OrgSite 的想法更好。

选项#1 还是选项#2?

谢谢。

【问题讨论】:

    标签: sql-server performance inner-join


    【解决方案1】:

    当心Premature optimization。如果两个查询返回相同的结果,请使用更易于理解和维护的查询。 SQL Server 的任务是确保查询操作(join、select、...)按照优化性能的顺序执行。而且,通常情况下,SQL Server 在这方面做得很好。

    也就是说,在某些情况下 SQL Server 查询分析器找不到最佳查询计划,您需要自己进行微调。然而,这些都是极少数情况。除非您的查询已经存在性能问题(并且无法通过引入丢失的索引来解决这些问题),否则您现在不应该担心这一点。

    【讨论】:

      【解决方案2】:

      我将采用简单的回答方法。创建一些测试并检查它们的性能,看看哪一个真正适合您的给定环境。

      【讨论】:

      • 那么,您是说 Option#1 和 Option#2 从性能的角度来看是相似的吗?因为显然 Option#1 更简单直接可以选择!
      • 我并不是说哪一个更好。我的意思是运行一些测试然后看看。在您的情况下设置测试来执行此操作有多难?最好的指标是运行测试并根据您的发现得出结论。对于有人告诉我选项 1 或选项 n 是没有确凿事实的最佳选项,我总是很谨慎。
      【解决方案3】:

      选项 1 几乎肯定会更快,嵌入式 SELECT 通常对性能来说是个坏主意。

      但是 - 不要相信我们的话。编写代码并尝试它们,检查查询计划。在这种情况下,这可能是过早的优化,但它也是一个很好的简单测试用例,可供学习,这样您就可以正确地知道如何去做,以及当您遇到真正需要正确方法的问题时会产生什么影响。有时在编写相同查询的不同方式之间存在巨大的性能差异,优化器对此无能为力,因此提前了解一般规则,您的生活会更快乐。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-02
        • 1970-01-01
        • 1970-01-01
        • 2012-04-05
        • 2011-09-28
        • 1970-01-01
        相关资源
        最近更新 更多