首页 > 解决方案 > 视图是否适合大量数据?

问题描述

我有一个包含 30 列的视图,它们是从 6 个表连接起来的。该视图有 100 万条记录。当我从视图中搜索时,处理查询需要 5 秒。

我的问题是:

  1. 视图如何工作?它是在查询执行时加入,还是视图包含表等数据?(有点像虚拟表。)

  2. 视图是否有任何限制,例如最大连接数或最大记录数?

  3. 如果我创建一个新表而不是视图,我可以更快地检索记录吗?

标签: sqlsql-server

解决方案


视图如何工作?它是在查询执行时加入,还是视图包含表等数据?(有点像虚拟表。)

View根本不包含任何数据,它只是一段类似于stored procedure但“可连接”的已保存代码。当您view在查询中使用 a 时,将使用视图定义,视图名称将替换为视图定义,并execution plan为此查询构建替换,您将不会在plan仅基于表的表中看到任何视图提及。

视图是否有任何限制,例如最大连接数或最大记录数?

tablesfor语句的最大数量SELECT取决于您的server version,您可以在此处查看:SQL Server 的最大容量规范,例如,它等于 256 in 2008SQL Server 2017它仅受可用资源的限制。

一个视图最多可以有 1,024 个columns,如此处所述CREATE VIEW (Transact-SQL)

返回的行数没有限制。

如果我创建一个新表而不是视图,我可以更快地检索记录吗?

这取决于。您应该检查execution plan您的查询。

请注意,如果您只是将查询返回的数据从视图定义复制到新表,则当基于表中的数据发生更改时,它不会自动更新。

要使您的“数据副本”自动更新,您可以在视图上创建聚集索引。这称为索引视图并且有一些限制。

在任何情况下,您都应该从您的查询开始actual execution plan,以便找到服务器浪费时间的地方,并了解它是错误的基数估计还是缺少indexes基表。


推荐阅读