考虑这些表:( ->表示SQL定义的关系)

USER (userid, username, imageid->IMAGE.imageid)
EVENT (eventid, userid->USER.userid, description)
IMAGE (imageid, location)

假设我有一个定义为以下查询的视图(我们称之为vw_UserInfo )。

SELECT u.*, i.* FROM users u
INNER JOIN images i ON i.imageid = u.imageid

SQL是否了解EVENT.useridvw_UserInfo.userid之间的关系? 我的意思是,在相关字段上进行JOIN操作的性能优势是否仍然适用? 我想这可能会因所使用的SQL DB而异。


编辑:试图变得更加清晰。 我要问

SELECT ui.*, e.* FROM vw_UserInfo ui 
INNER JOIN events e ON ui.userid = e.userid

受益于定义的外键

SELECT u.*, i.*, e.* FROM users u
INNER JOIN images i ON i.imageid = u.imageid
INNER JOIN events e ON e.userid = u.userid

将?

#1楼 票数:2 已采纳

不可以,因为视图(至少在SQL Server中)不是约束系统的真正组成部分(视图的存在或不存在不应影响任何未引用该视图的查询的性能)。 但是,索引视图(实例化视图)可能有助于提高性能。 我不确定,如果没有明确引用,哪些优化器会在执行计划中使用它们。

如果您阅读Celko的这篇文章 ,您会发现,为数据库提供更多有关表之间的约束和外键关系的元数据,这可以提高查询的性能。

#2楼 票数:0

关系强制执行数据完整性,与快速选择数据无关。 那就是索引的领域。 通常,关系(特别是在具有许多关系的表上)会减慢数据访问(尤其是写入)的速度。

#3楼 票数:0

是的,有点

由于视图是在编译步骤扩展的,因此优化程序可以使用基础表索引进行优化。

但是……就像Rovert所说的那样,关系不会加快查询的速度,而索引却可以。

  ask by Spencer Ruport translate from so

未解决问题?本站智能推荐:

2回复

有关SQL性能的建议

每次用户访问该页面时,我都使用logtime对其进行记录,现在我想查找ID为“ MyID”的用户的最新100页。 我使用以下SQL选择不同的记录,但性能不好。 有人可以提出改进建议吗? ================================= 表架构如下
1回复

索引非常大的表-有关性能的信息

我的表有30.000.000行,并且存在严重的性能问题。 刚开始时-当我不知道将要插入多少行时-我仅在两个字段(至少23个)上创建了索引。 这两个字段是varchar类型。 其中的20个字段为varchar和text类型,其中三个为int类型。 我的第一个问题 : 我如何才能真
1回复

有关SQL代码性能优化的建议

我在Qubole中有一个代码,要花将近3个小时来执行。 我正在寻找一些建议来减少代码执行时间。
4回复

有关改善SQL查询计数性能的建议?

由于选择类似,我有一个查询要花很长时间才能运行: 谁能提出任何改进此性能的好方法?
2回复

加入视图时的SQL性能问题

我有这个查询,它与视图上的查询一起加入后将永远运行。 加入之前,需要2分钟。 加入的查询本身需要1分钟。 他们在一起已经走了20多分钟。 我的问题是: 除了在视图上创建索引外,我可以做些什么来使此查询运行更快? 创建索引会使该查询在合理的时间内运行吗? 谢谢
2回复

SQL-通过视图获得更好的性能

我在SQL Server 2014上运行,并且有一个与订单表相关的Customer表。 Order表具有例如500.000行-5个客户中的每一个100.000行。 因此,当为特定客户查找特定日期的所有订单时,SQL将是 该查询应浏览500.000条记录以查找相关订单。 创建5个
4回复

大量非常简单的SQL查询是否会影响性能?

我有搜索过滤器。 每个过滤器/属性都有自己需要显示的值。 有两种显示过滤器的方法: 1。 2。 因此,第一种方式是将属性选项存储在数据库中,并且您可以看到,对于每个属性,都会进行额外的查询 。 第二种方法是将属性选项存储在数组中。 我不是在问哪种方法是正确
1回复

在SQL性能中是否带有WHERE子句

很抱歉这个新手问题。 我想查询具有1000万行的表。 但是,有些历史数据我可能不需要。 为了减轻数据提取过程中服务器的负担,在查询中实现WHERE子句会有所帮助吗? 例如,我只能提取2015年至2016年的数据,而不是2007年至2016年的数据。 还是应该仅在没有WHERE子