我有以下表结构 -
网站:网站主表格
组织:组织的主表
用户:用户的主表(每个用户都链接到一个唯一的组织 User.OrgId)
OrgSite:存储一些“组织特定”网站详细信息(OrgId,SiteId,SiteName, SITECODE)。不是所有网站,只是 Org可以访问的那些。
UserSite:将用户链接到其可访问的站点(UserId,SiteId)。 用户链接到Org UserSite 将是OrgSite表的子集。
ItemSite :存储某些商品的表格&网站特定详情(ItemID, SiteId,OrgId,...)
现在,我要过滤来自'ItemSite'的显示记录,并且我还需要显示Sitecode。所以,我看到以下两个选项 -
1。创建一个视图: vw_ItemSite_UserSite_OrgSite(内部联接SiteId上的所有表) - 这将使我能够访问'OrgSite'表中可用的所有组织特定详细信息(即SiteCode等)。
如果你能注意到我要加入 视图中的'OrgSite'只是因为我 想要Org特定的SiteCode&站点名。 因为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
我的唯一目的是 - 我相信在评估嵌入式select语句之前将评估INNER JOIN和WHERE。那么,这能为我节省一些成绩吗?或者是让vw_ItemSite_UserSite_OrgSite更好的想法。
选项#1或选项#2?
谢谢。
答案 0 :(得分:2)
谨防Premature optimization。如果两个查询都返回相同的结果,请使用更易于理解和维护的查询。 SQL Server的任务是确保以优化性能的顺序执行查询操作(join,select,...)。而且,通常,SQL Server在这方面做得相当不错。
也就是说, 某些情况下,SQL Server查询分析器找不到最佳查询计划,您需要对自己进行微调。但是,这些情况很少见。除非您的查询已经存在性能问题(并且无法通过引入缺失的索引来修复它们),否则您现在不必担心这一点。
答案 1 :(得分:1)
我将采用简单的答案方法。创建一些测试并检查它们的性能,看看哪一个真正最适合您的特定环境。
答案 2 :(得分:0)
选项1几乎肯定会更快,嵌入式SELECT通常对性能不利。
但是 - 不要相信我们的话。对它们进行编码并尝试它们,检查查询计划。在这种情况下,这可能是过早的优化,但它也是一个很好的简单测试案例,可以学习,因此您可以正确地知道如何做到这一点以及当您遇到真正需要正确方法的问题时会产生什么影响。在编写相同查询的不同方式之间有时存在巨大的性能差异,优化者无法做任何事情,因此事先了解一般规则,您的生活会更快乐。