【发布时间】: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