2009-11-18 77 views
0

我有以下表结构 -SQL Server:设计:嵌入式Select语句或INNER JOIN?

网站:主tablefor网站

组织:师父组织

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

OrgSite:存储一些'组织特定'网站详细信息(OrgId,SiteId,SiteName, SiteCode)。并非所有网站,但只有 组织可以访问的网站。

UserSite:将用户链接到他可访问的网站(UserId,SiteId)。 当用户链接到Org UserSite 将成为OrgSite表的一个子集。

ItemSite:表用于存储一些项目&网站具体细节(项ID, SITEID,ORGID,...)

现在,我已经从 'ItemSite' 过滤\显示记录而且我还需要显示Sitecode。所以,我看到下面的两个选项 -

1.创建一个视图: vw_ItemSite_UserSite_OrgSite(INNER JOIN上SITEID所有表) - 这会给我访问所有的“OrgSite”表中提供的组织具体细节(即SITECODE,等..)

如果你能注意到我已经为包括 “OrgSite”只因为我想 具体组织SITECODE & SITENAME的看法。 因为UserSite已经过滤网站 - 所以我可以 '排除'OrgSite表和 消除不必要的INNER JOIN。

2.根据上述注 - 第二个选项是创建一个视图:vw_ItemSite_UserSite和“选择”的VIEW我可以嵌入以下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?

谢谢。

回答

2

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

也就是说,有些情况下,SQL Server查询分析器找不到最佳查询计划,您需要自行调整。但是,这些情况很少见。除非您的查询中已经存在性能问题(并且不能通过引入缺少的索引来解决这些问题),这是您现在不应该担心的问题。

1

我会采取简单的回答方法。创建一些测试并检查它们的性能,并查看哪一个在给定的环境中真正执行得最好。

+0

那么,你是说选项#1和选项#2与性能观点相似吗?因为选项#1显然更简单和直接选择! – 2009-11-18 14:43:49

+0

我不是说任何一个都更好。我所说的只是运行一些测试并看看。在你的情况下设置一个测试来做这件事有多难?如何做的最好的指标是运行测试,并根据您的发现得出结论。我总是非常怀疑有人告诉我,选项1或选项n是最好的选择,没有真实的事实。 – Kuberchaun 2009-11-18 15:13:59

0

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

但是 - 不要拿我们的话来说。编码并试用它们,检查查询计划。在这种情况下,这可能是不成熟的优化过程,但它也是一个很好的简单测试案例,您可以在该案例中学习如何正确知道如何执行此操作,以及在出现真正需要正确执行操作的问题时所产生的影响。在编写相同查询的不同方式之间存在性能差异,优化器无法做任何事情,因此先学习一般规则,您的生活将会更加快乐。