0

我有以下表结构 -

站点:站点主表

组织:组织的主表

用户:用户的主表(每个用户通过 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(INNER JOIN 上 SiteId 上的所有表) - 这将使我能够访问“OrgSite”表中可用的所有组织特定详细信息(即 SiteCode 等)。

如果您注意到我必须在视图中包含“OrgSite”,只是因为我想要特定于 Org 的 SiteCode 和 SiteName。因为 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?

谢谢你。

4

3 回答 3

2

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

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

于 2009-11-18T14:03:40.567 回答
1

I'll take the easy answer approach.Create some tests and check them for performance and see which one really performs best for your given environment.

于 2009-11-18T14:36:54.517 回答
0

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

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

于 2009-11-18T17:22:42.343 回答