【问题标题】:Do SQL Views retain relationship information in terms of performance?SQL 视图是否在性能方面保留关系信息?
【发布时间】:2009-01-11 23:14:55
【问题描述】:

考虑表:(-> 表示 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 数据库而异。


编辑:试图更清楚一点。我问会不会

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

会吗?

【问题讨论】:

    标签: sql performance


    【解决方案1】:

    不,因为视图(至少在 SQL Server 中)实际上并不是约束系统的一部分(视图的存在或不存在不应影响任何不引用视图的查询的性能)。然而,索引视图(物化视图)可能有助于提高性能。不过,如果没有明确引用,我不确定哪些优化器会在执行计划中使用它们。

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

    【讨论】:

      【解决方案2】:

      关系强制数据完整性,它们与快速选择数据无关。那是索引的领域。一般来说,关系(尤其是在具有许多关系的表上)会减慢数据访问(尤其是写入)。

      【讨论】:

      • 在我链接的 Celko 文章中,他说优化器使用了 CHECK 约束。
      【解决方案3】:

      是的,有点。

      优化器可以使用底层表索引进行优化,因为视图是在编译步骤中扩展的。

      但是...就像 Rovert 所说,关系不会加速查询,索引可以。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-19
        • 1970-01-01
        • 1970-01-01
        • 2020-09-14
        • 1970-01-01
        • 2023-03-12
        • 2010-10-15
        相关资源
        最近更新 更多