sql - 视图是否适合大量数据?
问题描述
我有一个包含 30 列的视图,它们是从 6 个表连接起来的。该视图有 100 万条记录。当我从视图中搜索时,处理查询需要 5 秒。
我的问题是:
视图如何工作?它是在查询执行时加入,还是视图包含表等数据?(有点像虚拟表。)
视图是否有任何限制,例如最大连接数或最大记录数?
如果我创建一个新表而不是视图,我可以更快地检索记录吗?
解决方案
视图如何工作?它是在查询执行时加入,还是视图包含表等数据?(有点像虚拟表。)
View
根本不包含任何数据,它只是一段类似于stored procedure
但“可连接”的已保存代码。当您view
在查询中使用 a 时,将使用视图定义,视图名称将替换为视图定义,并execution plan
为此查询构建替换,您将不会在plan
仅基于表的表中看到任何视图提及。
视图是否有任何限制,例如最大连接数或最大记录数?
tables
for语句的最大数量SELECT
取决于您的server version
,您可以在此处查看:SQL Server 的最大容量规范,例如,它等于 256 in 2008
,SQL Server 2017
它仅受可用资源的限制。
一个视图最多可以有 1,024 个columns
,如此处所述CREATE VIEW (Transact-SQL)
返回的行数没有限制。
如果我创建一个新表而不是视图,我可以更快地检索记录吗?
这取决于。您应该检查execution plan
您的查询。
请注意,如果您只是将查询返回的数据从视图定义复制到新表,则当基于表中的数据发生更改时,它不会自动更新。
要使您的“数据副本”自动更新,您可以在视图上创建聚集索引。这称为索引视图并且有一些限制。
在任何情况下,您都应该从您的查询开始actual execution plan
,以便找到服务器浪费时间的地方,并了解它是错误的基数估计还是缺少indexes
基表。
推荐阅读
- c++ - 使用 C++ 重定位动态执行的 ARM ASM 系统调用
- angular - HttpClient.get 不会从 Wiki API 返回 observable
- laravel - Laravel 钩子中的 API 端点
- javascript - 如何删除对象数组中的重复项?
- .net - 服务器到 AWS RDS - 无法建立连接,因为目标机器主动拒绝它
- linux - 为什么我的基准随机显示运行速度是原来的 3 倍,为什么在 perf 中运行它会使这种情况更频繁地发生?
- c - 为什么在 4%4==0 程序后的嵌套循环中不打印 4?
- node.js - 使用 MongoDB node.js `insertMany` 的正确方法,使其不会阻塞
- java - Delombok'ing 源代码,添加了 jar 依赖项
- c# - 在 ml.net 中对分类数据进行聚类