考虑表:( ->
表示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.userid
与vw_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
将?
答案 0 :(得分:2)
不,因为视图(至少在SQL Server中)并不是约束系统的一部分(视图的存在或不存在不应该影响任何不引用视图的查询的性能)。但是,索引视图(物化视图)可能有助于提高性能。如果没有明确引用,我不确定哪些优化器会在执行计划中使用它们。
如果您阅读this article by Celko,您可以看到为数据库提供的关于表之间的约束和外键关系的元数据越多,这可以提高查询的性能。
答案 1 :(得分:0)
关系强制数据完整性,它们与快速选择数据无关。这是索引的领域。通常,关系(特别是在有许多关系的表上)减慢数据访问(尤其是写入)。
答案 2 :(得分:0)
是的,有点儿。
优化程序可以使用基础表索引进行优化,因为在编译步骤中会扩展视图。
但是......就像Rovert所说的那样,关系不会加速查询,索引会这样做。